Logistic回归中的微调参数

时间:2014-02-16 20:45:25

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

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

我希望能够完成一系列步骤,这些步骤最终会让我说我的Logistic回归分类器尽可能地运行。

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.."

3 个答案:

答案 0 :(得分:18)

您可以使用网格搜索为您找出最佳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

答案 1 :(得分:1)

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

答案 2 :(得分:0)

您可以使用以下代码获取更多常规信息:


    const updates = [];
    let new_author_name = "Clancy"
    for (let i = 0; i < books.size; i++) {
        updates.push(ddb.update({
            TableName: 'MY_TABLE',
            Key: { PK: books[i].PK},
            UpdateExpression: 'SET #name = :name',
            ExpressionAttributeValues: {
                ':name': new_author_name
            },
            ExpressionAttributeNames: {
                '#name': 'name'
            }
        }).promise());
    }

    await Promise.all(updates);