如何在Python中构建升力图(又称收益图)?
machine-learning
python
5
0

我刚刚使用scikit-learn创建了一个模型,该模型可以估算客户对某项报价做出响应的可能性。现在,我正在尝试评估我的模型。为此,我想绘制提升图。我了解了Lift的概念,但是我很难理解如何在python中实际实现它。

参考资料:
Stack Overflow
收藏
评论
共 2 个回答
高赞 时间 活跃

您可以使用scikit-plot软件包进行繁重的工作。

skplt.metrics.plot_cumulative_gain(y_test, predicted_probas)


# The usual train-test split mumbo-jumbo
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB

X, y = load_breast_cancer(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, 
test_size=0.33)
nb = GaussianNB()
nb.fit(X_train, y_train)
predicted_probas = nb.predict_proba(X_test)

# The magic happens here
import matplotlib.pyplot as plt
import scikitplot as skplt
skplt.metrics.plot_cumulative_gain(y_test, predicted_probas)
plt.show()

这将导致如下图所示: 在此处输入图片说明

收藏
评论

提升/累积收益图不是评估模型的好方法(因为它不能用于模型之间的比较),而是在资源有限的情况下评估结果的一种方法。要么因为每个结果(在营销方案中)要采取行动的成本,要么是您想忽略一定数量的有保证的选民,而只对栅栏上的那些采取行动。如果您的模型非常好,并且对所有结果都具有很高的分类精度,那么信心十足地订购结果将不会有太大的帮助。

import sklearn.metrics
import pandas as pd

def calc_cumulative_gains(df: pd.DataFrame, actual_col: str, predicted_col:str, probability_col:str):

    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

要绘制累积增益图,您可以在下面使用此代码。

    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()

并可视化提升:

    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()

结果看起来像:

累积收益图

我发现这些网站可供参考:

编辑:

我发现MS链接的描述有些误导,但是Paul Te Braak链接非常有用。回答评论;

@Tanguy对于上面的累积增益图,所有计算均基于该特定模型的准确性。正如Paul Te Braak链接所指出的,我的模型的预测准确性如何达到100%(图表中的红线)?最好的情况(绿线)是我们在整个人口过程中能够以多快的速度达到与红线相同的精度(例如,我们的最佳累积收益方案)。如果我们只是随机选择总体中每个样本的分类,则为蓝色。因此,累积收益和升幅图纯粹是为了理解该模型(仅该模型)在不与整个人群进行交互的情况下如何给我带来更大的影响。

我使用累积收益图表的一种情况是针对欺诈案件,在该案件中,我想知道对于X最高的百分比,我们实际上可以忽略或优先处理多少个应用程序(因为我知道该模型可以对其进行预测)。在那种情况下,对于“平均模型”,我改为从真正的无序数据集中选择分类(以显示如何处理现有应用程序,以及如何使用该模型对应用程序类型进行优先排序)。

因此,对于比较模型,只需坚持使用ROC / AUC,一旦对所选模型感到满意,就可以使用累积增益/提升图来查看其对数据的响应方式。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号