2

Python3.5Python sklearn logistische Regression K-halte Kreuzvalidierung: Wie ein drameframe für coef_ erstellen

Ich habe einen Datensatz in einem Varibale gespeichert, file, und ich versuche, 10 halten, Kreuzvalidierung angewandt werden soll logistische Regression. Was ich suche ist der Weg, um den Durchschnitt von clf.coef_ aufzulisten.

print(file.head()) 

    Result Interest Limit Service Convenience Trust Speed 
0  0   1  1  1   1  1  1 
1  0   1  1  1   1  1  1 
2  0   1  1  1   1  1  1 
3  0   4  4  3   4  2  3 
4  1   4  4  4   4  4  4 

Hier ist eine einfache Code logistische Regression ich geschrieben, um haben eine Liste von coef_ zu zeigen.

[In]

import pandas as pd 
from pandas import DataFrame 
import numpy as np 
from sklearn import cross_validation 
from sklearn.linear_model import LogisticRegression 

X = file.drop(['Result'],1) 
y = file['Result'] 

X_train, X_test, y_train, y_test = cross_validation.train_test_split(X,y,test_size=0.25) 
clf = LogisticRegression(penalty='l1') 
clf.fit(X_train,y_train) 
accuracy = clf.score(X_test,y_test) 
print(accuracy) 

coeff_df = pd.DataFrame([X.columns, clf.coef_[0]]).T 
print(coeff_df) 

[Out]

0.823061630219 

      0   1 
0  Interest 0.163577 
1  Limit -0.161104 
2  Service 0.323073 
3 Convenience 0.121573 
4  Trust 0.370012 
5  Speed 0.089934 
6  Major 0.183002 
7   Ads 0.0137151 

Dann habe ich versucht, das 10-fache Kreuzvalidierung auf den gleichen Datenbestand zu übernehmen. Ich habe einen Code unten, aber ich war nicht in der Lage einen Datenrahmen aus einer Liste von coef_ zu produzieren, coeff_df, wie ich oben für die Analyse tat. Kann jemand Lösungen anbieten?

[In]

[Out]

[ 0.82178218 0.7970297 0.84158416 0.80693069 0.84158416 0.80693069 
    0.825  0.825  0.815  0.76  ] 
0.814084158416 

Antwort

2

cross_val_score ist eine Hilfsfunktion, die wickelt verschiedene Objekte für Kreuzvalidierung des Scikit-Learn (z KFold, StratifiedKFold). Es gibt eine Liste von Partituren auf der Grundlage der scoring Parameter verwendet (für Klassifikationsprobleme, ich glaube, diese accuracy standardmäßig sein wird).

cross_val_score Mit dem Rückgabeobjekt können Sie nicht auf die zugrunde liegenden Falzen/Modelle zugreifen, die bei der Kreuzvalidierung verwendet werden, dh Sie können nicht die Koeffizienten jedes Modells abrufen.

Um die Koeffizienten für jede Faltung der Kreuzvalidierung zu erhalten, sollten Sie KFold verwenden (oder wenn Ihre Klassen unausgeglichen sind, StratifiedKFold).

import pandas as pd 
from sklearn.model_selection import StratifiedKFold 
from sklearn.linear_model import LogisticRegression 

df = pd.read_clipboard() 
file = pd.concat([df, df, df]).reset_index() 

X = file.drop(['Result'],1) 
y = file['Result'] 

skf = StratifiedKFold(n_splits=2, random_state=0) 

models, coefs = [], [] # in case you want to inspect the models later, too 
for train, test in skf.split(X, y): 
    print(train, test) 
    clf = LogisticRegression(penalty='l1') 
    clf.fit(X.loc[train], y.loc[train]) 
    models.append(clf) 
    coefs.append(clf.coef_[0]) 

pd.DataFrame(coefs, columns=X.columns).mean() 

uns Ruft:

Interest  0.000000 
Limit   0.000000 
Service  0.000000 
Convenience 0.000000 
Trust   0.530811 
Speed   0.000000 
dtype: float64 

Ich hatte Daten von Ihrem Beispiel zu bilden (die nur eine Instanz der positiven Klasse). Ich vermute, dass diese Zahlen in deinem Fall nicht 0 sind.


bearbeiten Seit StratifiedKFold (oder KFold) uns die Kreuzvalidierung Splits des Datensatzes gibt, können Sie immer noch die Kreuzvalidierung Scores berechnen die score Methode des Modells.

Die unten Version von oben, um leicht verändert auch für jede Falte die Kreuzvalidierung Partituren zu erfassen.

models, scores, coefs = [], [], [] # in case you want to inspect the models later, too 
for train, test in skf.split(X, y): 
    print(train, test) 
    clf = LogisticRegression(penalty='l1') 
    clf.fit(X.loc[train], y.loc[train]) 
    score = clf.score(X.loc[test], y.loc[test]) 
    models.append(clf) 
    scores.append(score) 
    coefs.append(clf.coef_[0]) 
+0

Danke! Dein Code funktioniert! Eine zusätzliche Frage - gibt es überhaupt eine Liste von Punktzahlen basierend auf Ihrem Code? Ich möchte 'L1 Strafe' und 'cross_val_score' nicht lassen. – Ryo

+0

Aktualisiert die meine Antwort, um dies zu adressieren –

Verwandte Themen