python - tipos - Puntuación de precisión: ValueError: No se puede manejar la mezcla de binario y continuo
para que sirve el raise en python (5)
Estoy usando linear_model.LinearRegression de scikit-learn como modelo predictivo. Funciona y es perfecto. Tengo un problema para evaluar los resultados predichos utilizando la métrica precision_score. Este es mi verdadero dato:
array([1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 0, 0, 0, 0, 0])
Y este es mi dato predictivo:
array([ 0.07094605, 0.1994941 , 0.19270157, 0.13379635, 0.04654469,
0.09212494, 0.19952108, 0.12884365, 0.15685076, -0.01274453,
0.32167554, 0.32167554, -0.10023553, 0.09819648, -0.06755516,
0.25390082, 0.17248324])
Mi código :
accuracy_score(y_true, y_pred, normalize=False)
Y este es el mensaje de error:
"ValueError: no se puede manejar la mezcla de binario y continuo"
Ayuda ? Gracias.
El problema es que la verdadera y es binaria (ceros y unos), mientras que sus predicciones no lo son. Probablemente generaste probabilidades y no predicciones, de ahí el resultado :) ¡Intenta en cambio generar membresía de clase, y debería funcionar!
Los sklearn.metrics. El método precision_score (y_true, y_pred) define y_pred como:
y_pred : 1d array-like, o matriz de indicador de etiqueta / matriz dispersa. Etiquetas predichas , según lo devuelto por un clasificador.
Lo que significa que y_pred tiene que ser una matriz de 1 o 0 (etiquetas predicadas). No deben ser probabilidades.
Las etiquetas predicadas (1''s y 0''s) y / o probabilites predichos pueden generarse usando los métodos predecir () y predict_proba () del modelo LinearRegression () respectivamente.
1. Generar etiquetas predichas:
LR = linear_model.LinearRegression()
y_preds=LR.predict(X_test)
print(y_preds)
salida:
[1 1 0 1]
''y_preds'' ahora se puede usar para el método precision_score (): accuracy_score(y_true, y_pred)
2. Generar probabilidades para etiquetas:
Algunas métricas como ''precision_recall_curve (y_true, probas_pred)'' requieren probabilidades, que se pueden generar de la siguiente manera:
LR = linear_model.LinearRegression()
y_preds=LR.predict_proba(X_test)
print(y_preds)
salida:
[0.87812372 0.77490434 0.30319547 0.84999743]
Tal vez esto ayude a alguien que encuentre esta pregunta:
Como JohnnyQ ya señaló, el problema es que tiene valores no binarios (no 0 ni 1) en su y_pred
, es decir, al agregar
print(((y_pred != 0.) & (y_pred != 1.)).any())
Verá True
en la salida. (El comando descubre si hay algún valor que no sea 0 o 1).
Puedes ver tus valores no binarios usando:
non_binary_values = y_pred[(y_pred[''score''] != 1) & (y_pred[''score''] != 0)]
non_binary_idxs = y_pred[(y_pred[''score''] != 1) & (y_pred[''score''] != 0)].index
Una declaración de impresión puede generar las variables derivadas anteriores.
Finalmente, esta función puede limpiar sus datos de todas las entradas no binarias:
def remove_unlabelled_data(X, y):
drop_indexes = X[(y[''score''] != 1) & (y[''score''] != 0)].index
return X.drop(drop_indexes), y.drop(drop_indexes)
precision_score es una métrica de clasificación, no puede usarla para un problema de regresión.
accuracy_score(y_true, y_pred.round(), normalize=False)
Si prefiere tener más control sobre el umbral, use (y_pred>threshold).astype(int)
lugar de y_pred.round()
donde threshold
es su valor para separar las dos clases.