29.04

2014

Wady krokowych metod wyboru cech do budowy modeli predykcyjnych

Autor: artur

1 Wstęp

Bardzo często budując modele scoringowe oraz predykcyjne korzysta się bezkrytycznie z metod krokowego wyboru cech (ang. stepwise feature selection methods). Szczególnie w sytuacji, gdy wybieramy spośród wielu cech objaśniających mogących objaśniać zjawisko. Dotyczy to scoringów behawioralnych ryzyka kredytowego albo modeli opisujących zachowanie klienta w CRM albo marketingu bezpośrednim (modele np. churn, attrition czy response). Stosuje się wtedy warianty ”forward feature selection”, ”backward feature selection” oraz wariant mieszany "both”. W systemie R wykorzystujemy funkcję step czy stepAIC.

Na prostych danych symulowanych pokazujemy przykładowy problem, jaki powoduje zastosowanie metod krokowych. Inne problemy opisane są w wymienionej na końcu postu literaturze.

Wpis został przygotowany tak, żeby każdy mógł powtórzyć analizę.

2 Przygotowanie danych do analizy

Wykorzystamy metodę krokową wyboru cech do zbudowania modelu scoringowego (regresja logistyczna) przewidującego prawdopodobieństwo, że klient o danych cechach okaże się dobrym klientem ($P(G)$).

Skorzystamy z danych symulowanych, żeby wszystko było dobrze widoczne. Symulujemy dane jako zmienne z wielowymiarowego rozkładu normalnego (o niezależnych składowych), takiego samego dla grupy klientów złych (BAD) i dobrych (GOOD). Parametry funkcji do symulacji symuluj.dane są takie:

  • n.s — wielkość próby
  • prop.B — proporcja złych (B) do dobrych (G)
  • n.v — liczba zmiennych (wymiar)

W wyniku dostajemy ramkę danych ze zmiennymi:

  • V1, V2, V3, ... — cechy / predyktory / zmienne objaśniające
  • BAD — status BAD / GOOD

Oto sama funkcja:

symuluj.dane <- function(n.s, prop.B, n.v) {
 
    n.s.G <- round(n.s * (1 - prop.B), 0)
    n.s.B <- round(n.s * prop.B, 0)
 
    dane.G <- matrix(rnorm(n.s.G * n.v, 0, 1), n.s.G, n.v)
    dane.B <- matrix(rnorm(n.s.B * n.v, 0, 1), n.s.B, n.v)
 
    dane <- as.data.frame(rbind(dane.G, dane.B))
 
    names(dane) <- paste0("V", 1:n.v)
 
    dane$BAD <- as.factor(c(rep("GOOD", n.s.G), rep("BAD", n.s.B)))
 
    return(dane)
}

Korzystając z funkcji symuluj.dane przygotowujemy dane:

n.s <- 2000  # wielkość próby
prop.B <- 0.5  # proporcja złych
n.v <- 100  # liczba zmiennych
 
dane <- symuluj.dane(n.s, prop.B, n.v)

Spójrzmy na dane:

table(dane$BAD)
## 
##  BAD GOOD 
## 1000 1000
boxplot(V1 ~ BAD, data = dane, xlab = "BAD", ylab = "zmienna V1")  # dla przykładowej zmiennej
Porównanie rozkładów zmiennej V1 w grupach klientów

Porównanie rozkładów zmiennej V1 w grupach klientów

3 Budujemy model

Zbudujmy model regresji logistycznej metodą krokową:

formula.maly <- as.formula("BAD ~ 1")  # możliwie najprostszy model -- z samym prawdopodobieństwem (wyrazem wolnym)
formula.duzy <- as.formula(paste0("BAD ~ ", paste(setdiff(names(dane), "BAD"), 
    collapse = " + ")))  # wszystkie zmienne
 
model.start <- glm(formula.maly, data = dane, family = binomial(link = "logit"))
 
# dodatkowo przechowujemy wartość kryterium AIC (`keep`) oraz wyłączamy
# wyświetlanie wyników pośrednich (`trace`)
logit.model <- step(model.start, scope = list(lower = formula.maly, upper = formula.duzy), 
    direction = "forward", trace = 0, keep = function(fit, aic) {
        fit$aic
    })

Przyjrzyjmy się teraz uzyskanemu modelowi:

summary(logit.model)
## 
## Call:
## glm(formula = BAD ~ V36 + V44 + V92 + V97 + V71 + V73 + V27 + 
##     V30 + V82 + V17 + V5 + V47 + V56 + V80 + V9, family = binomial(link = "logit"), 
##     data = dane)
## 
## Deviance Residuals: 
##     Min       1Q   Median       3Q      Max  
## -1.6565  -1.1581  -0.0173   1.1628   1.5997  
## 
## Coefficients:
##              Estimate Std. Error z value Pr(>|z|)   
## (Intercept)  0.000337   0.045466    0.01    0.994   
## V36         -0.119472   0.045028   -2.65    0.008 **
## V44          0.101929   0.046141    2.21    0.027 * 
## V92         -0.096043   0.045182   -2.13    0.034 * 
## V97         -0.087954   0.045330   -1.94    0.052 . 
## V71         -0.090053   0.043957   -2.05    0.040 * 
## V73         -0.087256   0.045518   -1.92    0.055 . 
## V27         -0.080255   0.045985   -1.75    0.081 . 
## V30          0.077190   0.045201    1.71    0.088 . 
## V82          0.074404   0.044271    1.68    0.093 . 
## V17         -0.079531   0.045356   -1.75    0.080 . 
## V5          -0.067686   0.044947   -1.51    0.132   
## V47          0.071981   0.044790    1.61    0.108   
## V56         -0.066778   0.044332   -1.51    0.132   
## V80         -0.068585   0.044886   -1.53    0.127   
## V9          -0.064581   0.044080   -1.47    0.143   
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## (Dispersion parameter for binomial family taken to be 1)
## 
##     Null deviance: 2772.6  on 1999  degrees of freedom
## Residual deviance: 2723.6  on 1984  degrees of freedom
## AIC: 2756
## 
## Number of Fisher Scoring iterations: 4

Widać, że metoda wybrała zmienne do modelu spośród zmiennych, które nie dają żadnych informacji o P(G). Dodatkowo, niektóre z nich okazały się statystycznie istotne. Mimo, że dane zostały przygotowane tak, żeby zmienne niezależne nie dawały żadnych informacji o zmiennej zależnej. Oczywiście, istotność zmiennych niezależnych to jedna sprawa, a wielkość wpływu na zmienną zależną to inna sprawa.

4 Konsekwencje

W naszym przypadku bezkrytyczne wykorzystanie metod krokowych ma duże konsekwencje:

  • Budowa modelu na bazie cech, które nie mają wartości prognostycznej.
  • Stworzenie modelu, który ani nie wyjaśnia zjawiska, ani nie pozwala na dobrą prognozę.
  • Straty związane z wdrożeniem modelu, który nie działa.

5 Rozwiązania

Z problemem można poradzić sobie na wiele sposobów, na przykład:

  • Odpowiedni podział na zbiór uczący i testowy (np. cross-validation).
  • Wykorzystanie wiedzy biznesowej i weryfikacja przydatności cech na bazie znajomości biznesu i zależności.
  • Zastosowanie innych metod wyboru cech. Zwłaszcza takich, których działanie i algorytm dokładnie znamy oraz rozumiemy wady i zalety.
  • Inne, w literaturze poniżej.

6 Literatura

Pisząc ten post korzystałem z literatury, do której warto sięgnąć, jeśli chcesz wiedzieć więcej:

Ważny cytat z ”Regression Modeling Strategies”, F.E. Harrell:

Stepwise variable selection has been a very popular technique for many years, but if this procedure had just been proposed as a statistical method, it would most likely be rejected because it violates every principle of statistical estimation and hypothesis testing.

Spróbuj ponownie