validar tipos sirve que por para manejo excepciones errores diferentes con comunes python numpy scikit-learn linear-regression prediction

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)



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.