【问题标题】:Fine-tuning parameters in Logistic RegressionLogistic 回归中的微调参数
【发布时间】:2014-03-15 23:56:12
【问题描述】:

我正在运行逻辑回归,并在文本列上运行 tf-idf。这是我在逻辑回归中使用的唯一列。我怎样才能确保尽可能地调整此参数?

我希望能够完成一组步骤,最终让我说我的逻辑回归分类器正在尽可能地运行。

from sklearn import metrics,preprocessing,cross_validation
from sklearn.feature_extraction.text import TfidfVectorizer
import sklearn.linear_model as lm
import pandas as p
loadData = lambda f: np.genfromtxt(open(f, 'r'), delimiter=' ')

print "loading data.."
traindata = list(np.array(p.read_table('train.tsv'))[:, 2])
testdata = list(np.array(p.read_table('test.tsv'))[:, 2])
y = np.array(p.read_table('train.tsv'))[:, -1]

tfv = TfidfVectorizer(min_df=3, max_features=None, strip_accents='unicode',
                      analyzer='word', token_pattern=r'\w{1,}', 
                      ngram_range=(1, 2), use_idf=1, smooth_idf=1, 
                      sublinear_tf=1)

rd = lm.LogisticRegression(penalty='l2', dual=True, tol=0.0001, 
                           C=1, fit_intercept=True, intercept_scaling=1.0, 
                           class_weight=None, random_state=None)

X_all = traindata + testdata
lentrain = len(traindata)

print "fitting pipeline"
tfv.fit(X_all)
print "transforming data"
X_all = tfv.transform(X_all)

X = X_all[:lentrain]
X_test = X_all[lentrain:]

print "20 Fold CV Score: ", np.mean(cross_validation.cross_val_score(rd, X, y, cv=20, scoring='roc_auc'))

print "training on full data"
rd.fit(X, y)
pred = rd.predict_proba(X_test)[:, 1]
testfile = p.read_csv('test.tsv', sep="\t", na_values=['?'], index_col=1)
pred_df = p.DataFrame(pred, index=testfile.index, columns=['label'])
pred_df.to_csv('benchmark.csv')
print "submission file created.."

【问题讨论】:

  • 您能否更好地解释您要达到的目标?您要调整哪些超参数?逻辑回归没有任何超参数。
  • @George 抱歉不清楚。我只想确保传递给我的逻辑回归的参数是最好的。我希望能够完成一组步骤,最终让我说我的逻辑回归分类器正在尽可能地运行。
  • @George scikit-learn 的逻辑回归需要几个正则化参数。
  • 所以这不是逻辑回归,而是 L1 或 L2 正则化版本?
  • @George Logistic 回归在 scikit-learn 中也有一个 C 参数来控制模型的稀疏性。

标签: python numpy machine-learning artificial-intelligence scikit-learn


【解决方案1】:

您可以使用网格搜索来找出最适合您的C 值。基本上较小的C 指定更强的正则化。

>>> param_grid = {'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000] }
>>> clf = GridSearchCV(LogisticRegression(penalty='l2'), param_grid)
GridSearchCV(cv=None,
             estimator=LogisticRegression(C=1.0, intercept_scaling=1,   
               dual=False, fit_intercept=True, penalty='l2', tol=0.0001),
             param_grid={'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000]})

有关您的应用程序的更多详细信息,请参阅GridSearchCv document

【讨论】:

  • 非常感谢。你能解释一下C值的作用吗?我在任何地方都找不到这方面的具体信息。
  • courses.cs.washington.edu/courses/cse599c1/13wi/slides/… 见第 3 页的公式。 lambda 被添加为正则化项。但是在 sklearn 中,他们划分 lambda 以使权重平方和的系数等于 1。我猜他们这样做是因为他们希望与 SVM 中的成本函数保持一致。
  • 我一直在试验 Scikit-Optimize,它使用基于模型的优化运行得非常快。
  • @lennon310 如果我的日志丢失不断改善,我们可以将 C 用作 10 或 100 吗?
【解决方案2】:

网格搜索是一种寻找最优参数的残酷方式,因为它训练和测试每一种可能的组合。最好的方法是使用贝叶斯优化,它可以学习过去的评估分数并减少计算时间。

【讨论】:

  • 您能分享一些您的解决方案的示例源代码吗?否则,这篇文章似乎没有为问题提供quality answer,应该作为对问题的评论发布。
【解决方案3】:

您可以使用以下代码了解更多一般细节:

LR = LogisticRegression()
LRparam_grid = {
    'C': [0.001, 0.01, 0.1, 1, 10, 100, 1000],
    'penalty': ['l1', 'l2'],
    'max_iter': list(range(100,800,100)),
    'solver': ['newton-cg', 'lbfgs', 'liblinear', 'sag', 'saga']
}
LR_search = GridSearchCV(LR, param_grid=LRparam_grid, refit = True, verbose = 3, cv=5)

# fitting the model for grid search 
LR_search.fit(X_train , y_train)
LR_search.best_params_
# summarize
print('Mean Accuracy: %.3f' % LR_search.best_score_)
print('Config: %s' % LR_search.best_params_)

【讨论】:

  • 请注意此代码不起作用,因为存在非法的hyparam配置。由于某些莫名其妙的原因,sklearn 默默地失败而不是引发错误。使用error_score='raise'查看它们。
  • 我相信您的错误不会直接导致代码。有时,数据类型和数据分布可能是计算中出现某些问题的原因。
最近更新 更多