6

Ich führe eine logistische Regression mit einem tf-idf durch, das auf einer Textspalte ausgeführt wird. Dies ist die einzige Spalte, die ich in meiner logistischen Regression verwende. Wie kann ich sicherstellen, dass die Parameter so gut wie möglich eingestellt sind?Feineinstellung der Parameter in Logistische Regression

Ich möchte in der Lage sein, eine Reihe von Schritten durchlaufen, die mir schließlich sagen würde, dass meine Logistische Regression Klassifikator so gut wie möglich ausgeführt wird.

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

Könnten Sie bitte besser erklären, was Sie erreichen möchten? Welche Hyperparameter versuchen Sie einzustellen? Die logistische Regression hat keine Hyperparameter. – George

+0

@George Entschuldigung für nicht klar sein. Ich möchte nur sicherstellen, dass die Parameter, die ich in meine logistische Regression einreiße, die bestmöglichen sind. Ich würde gerne in der Lage sein, eine Reihe von Schritten zu durchlaufen, die mir erlauben würden zu sagen, dass mein Logistic Regression Classifier so gut läuft, wie es nur geht. –

+0

@George scikit-learns logistische Regression benötigt mehrere Regularisierungsparameter. –

Antwort

11

Sie Rastersuche verwenden können, für Sie den besten C Wert herauszufinden. Grundsätzlich geben C eine stärkere Regularisierung vor.

>>> 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]}) 

Weitere Informationen zu Ihrer Anwendung finden Sie unter GridSearchCv document.

+0

Vielen Dank dafür. Können Sie mir bitte erklären, was der C-Wert bewirkt? Ich kann dazu nirgendwo spezifische Informationen finden. –

+0

http://courses.cs.washington.edu/courses/cse599c1/13wi/slides/l2-regularization-online-perceptron.pdf siehe Formel auf Seite 3. Das Lambda wird als Regularisierungselement hinzugefügt. Aber in sklearn teilen sie das Lambda, um den Koeffizienten der Summe des Gewichtsquadrats gleich 1 zu machen. Ich nehme an, sie tun dies, weil sie mit der Kostenfunktion in SVM konsistent sein wollen. – lennon310

+0

also C = 1/Lambda – lennon310

Verwandte Themen