sklearn设置SGDClassifier与LogsticRegression的学习率

时间:2014-07-08 16:00:12

标签: python algorithm machine-learning scikit-learn logistic-regression

在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_

0 个答案:

没有答案