6

我正在運行一個邏輯迴歸,並在文本列上運行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.." 
+0

你能否更好地解釋你想要達到的目標?你想調整哪些超參數?邏輯迴歸沒有任何超參數。 – George

+0

@George道歉不清楚。我只是想確保我通過Logistic迴歸的參數是最好的參數。我希望能夠通過一組步驟,最終允許我說我的邏輯迴歸分類器正在運行,並且可能可以。 –

+0

@George scikit-learn的logistic迴歸需要幾個正則化參數。 –

回答

11

您可以使用網格搜索爲您找出最好的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

+0

非常感謝。你能向我解釋C值是什麼嗎?我無法在任何地方找到具體的信息。 –

+0

http://courses.cs.washington.edu/courses/cse599c1/13wi/slides/l2-regularization-online-perceptron.pdf請參閱第3頁的公式。將lambda添加爲正則化項目。但是在sklearn中,爲了使權重平方和的係數等於1,他們將lambda分開。我想他們這樣做是因爲他們希望與SVM中的成本函數一致。 – lennon310

+0

因此C = 1/lambda – lennon310