作为对我工作的检查,我一直在将scikit learn的SGDClassifier逻辑实现的输出与statsmodels逻辑进行比较。一旦我将一些l1与分类变量结合起来,我得到的结果就大不相同了。这是不同解决方案技术的结果还是我没有使用正确的参数?
我自己的数据集存在很大差异,但使用mtcars仍然相当大:
df = sm.datasets.get_rdataset("mtcars", "datasets").data
y, X = patsy.dmatrices('am~standardize(wt) + standardize(disp) + C(cyl) - 1', df)
logit = sm.Logit(y, X).fit_regularized(alpha=.0035)
clf = SGDClassifier(alpha=.0035, penalty='l1', loss='log', l1_ratio=1,
n_iter=1000, fit_intercept=False)
clf.fit(X, y)
给出:
sklearn: [-3.79663192 -1.16145654 0.95744308 -5.90284803 -0.67666106]
statsmodels: [-7.28440744 -2.53098894 3.33574042 -7.50604097 -3.15087396]
答案 0 :(得分:3)
我一直在解决一些类似的问题。我认为简短的回答可能是SGD只用少量样本就不能很好地工作,但是(更多)用更大的数据表现。我有兴趣听听sklearn开发者的消息。比较,例如,使用LogisticRegression
clf2 = LogisticRegression(penalty='l1', C=1/.0035, fit_intercept=False)
clf2.fit(X, y)
非常类似于l1惩罚的Logit。
array([[-7.27275526, -2.52638167, 3.32801895, -7.50119041, -3.14198402]])