2014-04-28 5 views
2

Я использую statsmodels для логистического регрессионного анализа в питона т.д .:Есть ли способ реализовать весы образца в логистической регрессии python?

import statsmodels.api as sm 
import numpy as np 
x = arange(0,1,0.01) 
y = np.random.rand(100) 
y[y<=x] = 1 
y[y!=1] = 0 
x = sm.add_constant(x) 
lr = sm.Logit(y,x) 
result = lr.fit().summary() 

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

Поблагодарили бы за любые предложения! Спасибо.

+0

statsmodels в настоящее время поддерживает весы только для модели линейной регрессии. – user333700

+0

GLM с семейным биномиальным позволяет: 'Биномиальные семейные модели принимают 2-й массив с двумя столбцами. Если это предусмотрено, каждое наблюдение ожидается [успех, сбой]. Возможно, это будет возможно использовать для определения весов образца, но я никогда не пробовал. – user333700

ответ

3

Взял меня некоторое время, чтобы решить эту проблему, но это на самом деле довольно легко создать логит модель в statsmodels с весовыми строками/многократными наблюдениями в строку , Вот как это делается:

import statsmodels.api as sm 
logmodel=sm.GLM(trainingdata[['Successes', 'Failures']], trainingdata[['const', 'A', 'B', 'C', 'D']], family=sm.families.Binomial(sm.families.links.logit)).fit() 
+0

Спасибо! Просто FYI (потому что у меня возникла ошибка, которая потребовала у меня несколько минут, чтобы поймать), тогда как patsy внутри функции '' glm (...) '' будет для вас фиктивными переменными категориальными переменными в '' GLM (. ..) '' выше, вы должны сделать это сами, например. с '' pandas.get_dummies (...) '' – DrMisha

+2

Это неясно. Можете ли вы уточнить, как вы вводите взвешивание? –

+0

'Успехи' и' Неудачи' в 'trainingdata' относятся к количеству наблюдений каждого. Таким образом, это число наблюдений обеспечивает взвешивание. – user3805082

1

Не уверен, что О statsmodel,

Но с scikit узнать очень легко. Вы можете использовать SGDClassifier с sample_weight

Пример:

import numpy as np 
from sklearn import linear_model 
X = [[0., 0.], [1., 1.]] 
y = [0, 1] 
weight=[0.5,0.5] 
#log implies logistic regression 
clf = linear_model.SGDClassifier(loss="log") 
clf.fit(X, y, sample_weight =weight) 
print(clf.predict([[-0.8, -1]]))