2016-02-01 21 views
9

Mam problemy z regresją logistyczną za pomocą xgboost, które można podsumować na poniższym przykładzie.xgboost binarna regresja logiczna

Załóżmy Mam bardzo prosty dataframe z dwoma czynnikami prognostycznymi i jednej zmiennej docelowej:

df= pd.DataFrame({'X1' : pd.Series([1,0,0,1]), 'X2' : pd.Series([0,1,1,0]), 'Y' : pd.Series([0,1,1,0],)}) 

mogę umieszczać obrazki bo jestem tu nowy, ale wyraźnie widać, że gdy X1 = 1 i X2 = 0 , Y to 0, a gdy X1 = 0 i X2 = 1, Y to 1.

Mój pomysł to zbudowanie modelu, który daje prawdopodobieństwo, że obserwacja należy do każdej z klas, więc jeśli uruchomię xgboost próbuje przewidzieć dwie nowe obserwacje (1,0) i (0,1) jak:

X = df[['X1','X2']].values    
y = df['Y'].values 

params = {'objective': 'binary:logistic', 
      'num_class': 2 
      } 

clf1 = xgb.train(params=params, dtrain=xgb.DMatrix(X, y), num_boost_round=100)      
clf1.predict(xgb.DMatrix(test.values)) 

wyjście jest:

array([[ 0.5, 0.5], 
     [ 0.5, 0.5]], dtype=float32) 

które mogę sobie wyobrazić, oznacza to, że dla pierwszej obserwacji, istnieje 50% szans, że należące do każdej z klas.

Chciałbym wiedzieć, dlaczego nie wydzieli się algorytmu poprawnie (1,0) lub coś bliższego, jeśli związek między zmiennymi jest jasny.

FYI, próbowałem z większą ilością danych (używam tylko 4 wierszy dla uproszczenia) i zachowanie jest prawie takie samo; co robię jest fakt, że nie tylko prawdopodobieństwa nie sumują się do 1, są często bardzo mały tak: (wynik ten jest na innym zbiorze, nie ma nic wspólnego z powyższym przykładzie)

array([[ 0.00356463, 0.00277259], 
     [ 0.00315137, 0.00268578], 
     [ 0.00453343, 0.00157113], 
+0

Czy Twoje dwa predyktory to tylko 0 i 1? Jeśli tak, istnieją tylko 4 możliwe kombinacje twoich funkcji, a zatem powinno się oczekiwać (maksymalnie) 4 unikalne przewidywania prawdopodobieństwa. – David

+0

tak, są. Ok, tylko 4 możliwe kombinacje, ma sens, ale nie wiem, jak to odpowiada na moje pytanie. – Italo

+0

Jestem zdezorientowany, jakie jest twoje pytanie? Pomyślałem, że nie rozumiesz, dlaczego w twoich przewidywaniach prawdopodobieństwa było mało różnic. – David

Odpowiedz

3

Ok - oto, co się dzieje ..

Kluczem, dlaczego nie działa, jest to, że w mniejszych zestawach danych nie może prawidłowo trenować. Trenowałem ten dokładny model i obserwując wysypisko wszystkich drzew, które zobaczysz, nie mogą się rozdzielić.

(drzewo zrzut poniżej)

szczelin, zostały one usuwane!

[1] "booster[0]" "0:leaf=-0" "booster[1]" "0:leaf=-0" "booster[2]" "0:leaf=-0" [7] "booster[3]" "0:leaf=-0" "booster[4]" "0:leaf=-0" "booster[5]" "0:leaf=-0" [13] "booster[6]" "0:leaf=-0" "booster[7]" "0:leaf=-0" "booster[8]" "0:leaf=-0" [19] "booster[9]" "0:leaf=-0"

Brakuje waga każdego z liści zapchaniexgboost jest wewnętrzny regularyzacji (co karze go do uprawy)

Parametr ten może być lub nie może być dostępne z wersji python, ale można go pobrać z R, jeśli wykonasz instalację github

http://xgboost.readthedocs.org/en/latest/parameter.html

lambda [domyślnie = 1] L2 uregulowanie termin na wagach

alfa [domyślnie = 0] L1 uregulowanie termin na wagach

zasadzie to dlaczego przykład pociągi lepiej jak dodasz więcej danych, ale nie może w ogóle ćwiczyć z tylko 4 przykładami i ustawieniami domyślnymi.