Me gustaría predecir la probabilidad del modelo de regresión logística con validación cruzada. Sé que puede obtener las puntuaciones de validación cruzada, pero ¿es posible devolver los valores de predict_proba en lugar de las puntuaciones?
# 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)
Esto ahora se implementa como parte de la versión 0.18 de scikit-learn. Puede pasar un parámetro de cadena ‘método’ al método cross_val_predict. La documentación está aquí .
Ejemplo:
proba = cross_val_predict(logreg, X, y, cv=cv, method='predict_proba')
También tenga en cuenta que esto es parte del nuevo paquete sklearn.model_selection, por lo que necesitará esta importación:
from sklearn.model_selection import cross_val_predict
Una solución fácil para esto es crear una clase contenedora, que para su caso sería
class proba_logreg(LogisticRegression): def predict(self, X): return LogisticRegression.predict_proba(self, X)
y luego pasar una instancia de él como el objeto clasificador para cross_val_predict
# cross validation probabilities probas = cross_val_predict(proba_logreg(), X, y, cv=cv)
Existe una función cross_val_predict
que le proporciona los valores predichos, pero todavía no existe tal función para “predict_proba”. Tal vez podríamos hacer de eso una opción.
Esto es fácil de implementar:
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)
Éste devuelve predict_proba. Si necesita predecir y predecir_proba, solo cambie predict
y combine
argumentos:
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)