在sklearn中,LogisticRegression(LR的缩写)没有直接的方法来解决加权LR,所以我传递给SGDClassifier(SGD)。
与我的实验一样:i生成数据遵循LR分布,参数截距= 0,beta = 2。并运行LR和SGD来估算它们。 为了比较这两个,我设置了相同的惩罚参数(我最初的想法是将它们设置为0,但由于它们不能被设置为0,我给予LR大的C和SGD的小alpha)
如我所见,LR几乎可以很好地进行估算,但是为SGD设置参数很困难。 主要问题是选择eta0和learning_rate:'常数' (太慢了),'最佳'或者' invscaling'。
我的想法是观察损失函数,如果它可能会下降,增加n_iter。如果它下降太慢,增加eta0。 但是
1.如何返回每个纪元的损失函数值,我通过更改详细信息看到它们,但我不知道如何返回值。 (可能是partiel_fit?)
2.这项工作有更智能(自动化)的方式吗?如果不是我应该多次重新训练过程如果我使用交叉验证会更复杂
感谢您的所有建议。如果我不清楚,请告诉我。
P.S。 Python中的代码需要缩进块,因为我是stackoverflow的新手,我不知道如何执行此操作,因此如果要执行de代码,请在def之后添加缩进块。
import random
import numpy as np
from sklearn.linear_model import LogisticRegression,SGDClassifier
def simule_logistic(n):
beta=0.2
x=[]
seuil=[]
for i in range(n):
x.append(random.normalvariate(1, 2))
seuil.append(random.uniform(0, 1))
x=np.array(x)
seuil=np.array(seuil)
p=1.0/(1+ np.exp(-x*beta))
y=[]
for i in range(n):
if p[i]<seuil[i]:
y.append(0)
else:
y.append(1)
y=np.array(y)
return x, p,y
if __name__=='__main__':
n=100000
x,p,y=simule_logistic(n)
x=x.reshape((n,1))
print x.shape
print y.shape
l=LogisticRegression(C=1000000,penalty='l1')
l.fit(x,y)
sgd=SGDClassifier(n_iter=100,n_jobs=1, loss='log',alpha=1.0/1000000,l1_ratio=1,learning_rate='optimal',eta0=0.01)
print sgd
sgd.fit(x,y)
#methode regression
print 'l',l.coef_
print l.intercept_
print 'sgd',sgd.coef_
print sgd.intercept_