2016-02-01 4 views
9

У меня возникли проблемы с выполнением логистической регрессии с помощью xgboost, которые можно резюмировать в следующем примере.xgboost двоичная логистическая регрессия

Давайте предположим, что у меня есть очень простой dataframe с двумя предсказателей и одной целевой переменной:

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

Я могу добавлять изображения, потому что я здесь новый, но мы можем ясно видеть, что, когда X1 = 1 и Х2 = 0 , Y равно 0, а когда X1 = 0 и X2 = 1, Y равно 1.

Моя идея - построить модель, которая выводит вероятность того, что наблюдение принадлежит каждому из классов, поэтому, если я запустил xgboost try для прогнозирования двух новых наблюдений (1,0) и (0,1):

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)) 

выход:

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

, который, я полагаю, означает, что для первого наблюдения, есть 50% вероятность того, что принадлежность к каждому из классов.

Хотелось бы знать, почему алгоритм выводит правильное (1,0) или что-то более близкое к этому, если связь между переменными ясна.

FYI, я попробовал с большим количеством данных (Im только используя 4 строки для простоты), и поведение почти одинаково; что я делаю уведомление, что не только вероятности не суммируются 1, они часто очень мало, как так: (этот результат на другой наборе данных, ничего не делать с приведенным выше примером)

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

Являются ли ваши два предиктора равными 0 и 1? Если это так, то есть только 4 возможных сочетания ваших функций и, следовательно, следует ожидать (не более) 4 уникальных предсказания вероятности. – David

+0

да, они есть. Хорошо, только 4 возможные комбинации, имеет смысл, но не уверен, как это отвечает на мой вопрос. – Italo

+0

Я смущен, в чем ваш вопрос? Я думал, вы не понимаете, почему в ваших вероятностных прогнозах мало различий. – David

ответ

3

Ок - вот что происходит.

Ключ о том, почему он не работает, заключается в том, что в меньших наборах данных он не может правильно тренироваться. Я обучил эту точную модель и наблюдал за свалкой всех деревьев, которые вы увидите, что они не могут разделиться.

(дерево свалка ниже)

NO SPLITS, они подрезали!

[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"

Существует не хватает веса каждого из листьев пересилитьxgboost «s внутренней регуляризация (который штрафует его для выращивания)

Этот параметр может или не может быть доступный из версии python, но вы можете захватить его с R, если вы выполните установку github

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

лямбда [по умолчанию = 1] L2 регуляризация член веса

альфа [по умолчанию = 0] L1 регуляризация член веса

в основном именно поэтому ваш пример поезда лучше, как вы добавить больше данных, но не может обучать вообще только с 4 примерами и настройками по умолчанию.