predict_proba para un modelo de validación cruzada

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)