tiempo real matrices hacer grafico graficas graficar funciones ejes dispersion crear coordenadas como python machine-learning modeling evaluation

real - ¿Cómo construir un cuadro de elevación(también conocido como gráfico de ganancias) en Python?



matplotlib (1)

Acabo de crear un modelo usando scikit-learn que estima la probabilidad de que un cliente responda a alguna oferta. Ahora estoy tratando de evaluar mi modelo. Para eso quiero trazar la tabla de levantamiento. Entiendo el concepto de sustentación, pero me cuesta entender cómo implementarlo realmente en Python.


Los gráficos de ganancias acumuladas / acumulativas no son una buena forma de evaluar un modelo (ya que no se pueden usar para comparar modelos) y, en cambio, son un medio de evaluar los resultados donde sus recursos son finitos. Ya sea porque hay un costo para la acción de cada resultado (en un escenario de mercadotecnia) o si desea ignorar una cierta cantidad de votantes garantizados, y solo actuar aquellos que están en la valla. Cuando su modelo es muy bueno y tiene una alta precisión de clasificación para todos los resultados, no obtendrá mucho impulso al ordenar sus resultados por confianza.

import sklearn.metrics import pandas as pd def calc_cumulative_gains(df: pd.DataFrame, actual_col: str, predicted_col:str, probability_col:str):

El método tiene el siguiente aspecto: primero ordena los datos en contenedores y los ordena por confianza. El método devuelve un marco de datos que se utilizará para la visualización.

df.sort_values(by=probability_col, ascending=False, inplace=True) subset = df[df[predicted_col] == True] rows = [] for group in np.array_split(subset, 10): score = sklearn.metrics.accuracy_score(group[actual_col].tolist(), group[predicted_col].tolist(), normalize=False) rows.append({''NumCases'': len(group), ''NumCorrectPredictions'': score}) lift = pd.DataFrame(rows) #Cumulative Gains Calculation lift[''RunningCorrect''] = lift[''NumCorrectPredictions''].cumsum() lift[''PercentCorrect''] = lift.apply( lambda x: (100 / lift[''NumCorrectPredictions''].sum()) * x[''RunningCorrect''], axis=1) lift[''CumulativeCorrectBestCase''] = lift[''NumCases''].cumsum() lift[''PercentCorrectBestCase''] = lift[''CumulativeCorrectBestCase''].apply( lambda x: 100 if (100 / lift[''NumCorrectPredictions''].sum()) * x > 100 else (100 / lift[ ''NumCorrectPredictions''].sum()) * x) lift[''AvgCase''] = lift[''NumCorrectPredictions''].sum() / len(lift) lift[''CumulativeAvgCase''] = lift[''AvgCase''].cumsum() lift[''PercentAvgCase''] = lift[''CumulativeAvgCase''].apply( lambda x: (100 / lift[''NumCorrectPredictions''].sum()) * x) #Lift Chart lift[''NormalisedPercentAvg''] = 1 lift[''NormalisedPercentWithModel''] = lift[''PercentCorrect''] / lift[''PercentAvgCase''] return lift

Para trazar el gráfico de ganancias acumuladas, puede usar este código a continuación.

import matplotlib.pyplot as plt def plot_cumulative_gains(lift: pd.DataFrame): fig, ax = plt.subplots() fig.canvas.draw() handles = [] handles.append(ax.plot(lift[''PercentCorrect''], ''r-'', label=''Percent Correct Predictions'')) handles.append(ax.plot(lift[''PercentCorrectBestCase''], ''g-'', label=''Best Case (for current model)'')) handles.append(ax.plot(lift[''PercentAvgCase''], ''b-'', label=''Average Case (for current model)'')) ax.set_xlabel(''Total Population (%)'') ax.set_ylabel(''Number of Respondents (%)'') ax.set_xlim([0, 9]) ax.set_ylim([10, 100]) labels = [int((label+1)*10) for label in [float(item.get_text()) for item in ax.get_xticklabels()]] ax.set_xticklabels(labels) fig.legend(handles, labels=[h[0].get_label() for h in handles]) fig.show()

Y para visualizar el ascensor:

def plot_lift_chart(lift: pd.DataFrame): plt.figure() plt.plot(lift[''NormalisedPercentAvg''], ''r-'', label=''Normalised /'response rate/' with no model'') plt.plot(lift[''NormalisedPercentWithModel''], ''g-'', label=''Normalised /'response rate/' with using model'') plt.legend() plt.show()

El resultado se ve así:

Encontré estos sitios web útiles para referencia:

Editar:

Encontré el enlace MS algo engañoso en sus descripciones, pero el enlace de Paul Te ​​Braak es muy informativo. Para responder el comentario;

@Tanguy para el cuadro de ganancias acumuladas anterior, todos los cálculos se basan en la precisión para ese modelo específico. Como señala el enlace de Paul Te ​​Braak, ¿cómo puede la precisión de predicción de mi modelo alcanzar el 100% (la línea roja en el gráfico)? El mejor de los casos (la línea verde) es la rapidez con la que podemos alcanzar la misma precisión que la línea roja en el transcurso de toda la población (por ejemplo, nuestro escenario de ganancias acumuladas óptimas). Azul es si seleccionamos al azar la clasificación para cada muestra en la población. Entonces, las ganancias acumuladas y los gráficos de sustentación son puramente para entender cómo ese modelo (y ese modelo solamente) me dará más impacto en un escenario en el que no voy a interactuar con toda la población.

Un escenario en el que he usado el gráfico de ganancias acumuladas es para casos de fraude, donde quiero saber cuántas aplicaciones podemos ignorar o priorizar (porque sé que el modelo las predice tan bien como sea posible) para el X por ciento superior. En ese caso, para el ''modelo promedio'', en cambio, seleccioné la clasificación del conjunto de datos sin ordenar real (para mostrar cómo se procesaban las aplicaciones existentes y cómo, utilizando el modelo, podíamos priorizar los tipos de aplicación).

Por lo tanto, para comparar modelos, simplemente quédese con ROC / AUC, y una vez que esté satisfecho con el modelo seleccionado, use la gráfica de ganancias acumuladas / elevación para ver cómo responde a los datos.