Je voudrais prédire la probabilité du modèle de régression logistique avec validation croisée. Je sais que vous pouvez obtenir les scores de validation croisée, mais est-il possible de renvoyer les valeurs de predict_proba à la place des scores?
# imports
from sklearn.linear_model import LogisticRegression
from sklearn.cross_validation import (StratifiedKFold, cross_val_score,
train_test_split)
from sklearn import datasets
# setup data
iris = datasets.load_iris()
X = iris.data
y = iris.target
# setup model
cv = StratifiedKFold(y, 10)
logreg = LogisticRegression()
# cross-validation scores
scores = cross_val_score(logreg, X, y, cv=cv)
# predict probabilities
Xtrain, Xtest, ytrain, ytest = train_test_split(X, y)
logreg.fit(Xtrain, ytrain)
proba = logreg.predict_proba(Xtest)
Ceci est maintenant implémenté dans scikit-learn version 0.18. Vous pouvez transmettre un paramètre de chaîne 'method' à la méthode cross_val_predict. La documentation est ici .
Exemple:
proba = cross_val_predict(logreg, X, y, cv=cv, method='predict_proba')
Notez également que cela fait partie du nouveau package sklearn.model_selection. Vous aurez donc besoin de cette importation:
from sklearn.model_selection import cross_val_predict
Une solution simple consiste à créer une classe d’emballage qui, dans votre cas, serait
class proba_logreg(LogisticRegression):
def predict(self, X):
return LogisticRegression.predict_proba(self, X)
puis passez une instance de celui-ci en tant qu’objet classificateur à cross_val_predict
# cross validation probabilities
probas = cross_val_predict(proba_logreg(), X, y, cv=cv)
Il existe une fonction cross_val_predict
qui vous donne les valeurs prédites, mais il n’existe pas encore de telle fonction pour "Predict_proba". Peut-être pourrions-nous en faire une option.
C'est facile à mettre en œuvre:
def my_cross_val_predict(
m, X, y, cv=KFold(),
predict=lambda m, x: m.predict_proba(x),
combine=np.vstack
):
preds = []
for train, test in cv.split(X):
m.fit(X[train, :], y[train])
pred = predict(m, X[test, :])
preds.append(pred)
return combine(preds)
Celui-ci retourne predict_proba. Si vous avez besoin à la fois de Predict et de predictprocha, il suffit de changer les arguments predict
et combine
:
def stack(arrs):
if arrs[0].ndim == 1:
return np.hstack(arrs)
else:
return np.vstack(arrs)
def my_cross_val_predict(
m, X, y, cv=KFold(),
predict=lambda m, x:[ m.predict(x)
, m.predict_proba(x)
],
combine=lambda preds: list(map(stack, Zip(*preds)))
):
preds = []
for train, test in cv.split(X):
m.fit(X[train, :], y[train])
pred = predict(m, X[test, :])
preds.append(pred)
return combine(preds)