2

Python3.5régression logistique Python K-hold validation croisée: comment créer un drameframe pour coef_

J'ai un ensemble de données stockées dans un varibale, file, et je tente d'appliquer la validation croisée 10 avec prise régression logistique. Ce que je cherche, c'est la façon de lister la moyenne de clf.coef_.

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 

est ici un simple code de régression logistique que j'ai écrit afin de montrer une liste de coef_.

[En]

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 

Ensuite, j'ai essayé d'appliquer 10 fois la validation croisée au même ensemble de données. J'ai un code ci-dessous mais je n'ai pas pu produire de dataframe d'une liste de coef_, coeff_df, comme je l'ai fait pour l'analyse ci-dessus. Quelqu'un peut-il fournir des solutions?

[In]

[out]

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

Répondre

2

cross_val_score est une fonction d'assistance qui enveloppe scikit-learn de divers objets à validation croisée (par exemple KFold, StratifiedKFold). Il renvoie une liste de scores basée sur le paramètre scoring utilisé (pour les problèmes de classification, je crois que ce serapar exemple). L'objet de retour de l'objet ne vous permet pas d'accéder aux plis/modèles sous-jacents utilisés dans la validation croisée, ce qui signifie que vous ne pouvez pas obtenir les coefficients de chaque modèle.

Pour obtenir les coefficients de chaque validation croisée, vous devez utiliser KFold (ou si vos classes sont déséquilibrées, 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() 

nous Obtient:

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

je devais faire des données à partir de votre exemple (qui ne possède qu'une seule instance de la classe positive). Je soupçonne que ces chiffres ne seront pas 0 dans votre cas.


Modifier Depuis StratifiedKFold (ou KFold) nous donne le grand écart de validation croisée de l'ensemble de données, vous pouvez calculer encore les scores de validation croisée en utilisant la méthode score du modèle.

La version ci-dessous est légèrement modifiée par rapport à ci-dessus afin de capturer également les scores de validation croisée pour chaque pli.

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

Merci! Votre code fonctionne! Une question supplémentaire - est-il de toute façon de produire une liste de scores en fonction de votre code? Je veux mettre 'L1 penalty' et 'cross_val_score' ne me laisse pas. – Ryo

+0

Mise à jour de ma réponse pour résoudre ce problème –