Evaluación de regresión logística con validación cruzada.

Me gustaría usar la validación cruzada para probar / entrenar mi conjunto de datos y evaluar el rendimiento del modelo de regresión logística en todo el conjunto de datos y no solo en el conjunto de pruebas (por ejemplo, 25%).

Estos conceptos son totalmente nuevos para mí y no estoy muy seguro de si lo estoy haciendo bien. Le agradecería que alguien me aconsejara sobre los pasos correctos para llevar a donde he ido mal. Parte de mi código se muestra a continuación.

Además, ¿cómo puedo trazar los ROC para “y2” y “y3” en el mismo gráfico con el actual?

Gracias

import pandas as pd Data=pd.read_csv ('C:\\Dataset.csv',index_col='SNo') feature_cols=['A','B','C','D','E'] X=Data[feature_cols] Y=Data['Status'] Y1=Data['Status1'] # predictions from elsewhere Y2=Data['Status2'] # predictions from elsewhere from sklearn.linear_model import LogisticRegression logreg=LogisticRegression() logreg.fit(X_train,y_train) from sklearn.cross_validation import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0) from sklearn import metrics, cross_validation predicted = cross_validation.cross_val_predict(logreg, X, y, cv=10) metrics.accuracy_score(y, predicted) from sklearn.cross_validation import cross_val_score accuracy = cross_val_score(logreg, X, y, cv=10,scoring='accuracy') print (accuracy) print (cross_val_score(logreg, X, y, cv=10,scoring='accuracy').mean()) from nltk import ConfusionMatrix print (ConfusionMatrix(list(y), list(predicted))) #print (ConfusionMatrix(list(y), list(yexpert))) # sensitivity: print (metrics.recall_score(y, predicted) ) import matplotlib.pyplot as plt probs = logreg.predict_proba(X)[:, 1] plt.hist(probs) plt.show() # use 0.5 cutoff for predicting 'default' import numpy as np preds = np.where(probs > 0.5, 1, 0) print (ConfusionMatrix(list(y), list(preds))) # check accuracy, sensitivity, specificity print (metrics.accuracy_score(y, predicted)) #ROC CURVES and AUC # plot ROC curve fpr, tpr, thresholds = metrics.roc_curve(y, probs) plt.plot(fpr, tpr) plt.xlim([0.0, 1.0]) plt.ylim([0.0, 1.0]) plt.xlabel('False Positive Rate') plt.ylabel('True Positive Rate)') plt.show() # calculate AUC print (metrics.roc_auc_score(y, probs)) # use AUC as evaluation metric for cross-validation from sklearn.cross_validation import cross_val_score logreg = LogisticRegression() cross_val_score(logreg, X, y, cv=10, scoring='roc_auc').mean() 

Lo tienes casi bien. cross_validation.cross_val_predict le proporciona predicciones para todo el conjunto de datos. Solo necesita eliminar logreg.fit anteriormente en el código. Específicamente, lo que hace es lo siguiente: Divide su conjunto de datos en n pliegues y en cada iteración deja uno de los pliegues como el conjunto de prueba y entrena el modelo en el rest de los pliegues ( n-1 pliegues). Entonces, al final obtendrás predicciones para toda la información.

Ilustrémoslo con uno de los conjuntos de datos incorporados en sklearn, iris. Este conjunto de datos contiene 150 muestras de entrenamiento con 4 características. iris['data'] es X e iris['target'] es y

 In [15]: iris['data'].shape Out[15]: (150, 4) 

Para obtener predicciones en todo el conjunto con validación cruzada, puede hacer lo siguiente:

 from sklearn.linear_model import LogisticRegression from sklearn import metrics, cross_validation from sklearn import datasets iris = datasets.load_iris() predicted = cross_validation.cross_val_predict(LogisticRegression(), iris['data'], iris['target'], cv=10) print metrics.accuracy_score(iris['target'], predicted) Out [1] : 0.9537 print metrics.classification_report(iris['target'], predicted) Out [2] : precision recall f1-score support 0 1.00 1.00 1.00 50 1 0.96 0.90 0.93 50 2 0.91 0.96 0.93 50 avg / total 0.95 0.95 0.95 150 

Así que, de vuelta a su código. Todo lo que necesitas es esto:

 from sklearn import metrics, cross_validation logreg=LogisticRegression() predicted = cross_validation.cross_val_predict(logreg, X, y, cv=10) print metrics.accuracy_score(y, predicted) print metrics.classification_report(y, predicted) 

Para trazar ROC en una clasificación de múltiples clases, puede seguir este tutorial que le ofrece algo como lo siguiente:

En general, sklearn tiene muy buenos tutoriales y documentación. Recomiendo encarecidamente leer su tutorial sobre validación cruzada .