2017-03-09 116 views

回答

4

提升/累積增益圖表不是評估模型的好方法(因爲它不能用於模型之間的比較),而是一種評估資源有限的結果的方法。無論是因爲在每個結果(在營銷方案中)都需要付出代價,或者您希望忽略一定數量的有保證的選民,並且只對那些在場的人進行操作。如果您的模型非常好,並且對所有結果的分類準確度都很高,那麼您就不會因爲放心訂購結果而獲得很大的提升。

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

結果如下:

Cumulative Gains Chart

我發現這些網站有用的參考:

編輯:

我發現MS鏈接在其描述有點誤導,但保羅特Braak鏈接內容非常豐富。回答評論;

@Tanguy對於上面的累積增益圖表,所有計算均基於該特定模型的準確性。正如Paul Te Braak鏈接所指出的那樣,我的模型的預測準確度如何達到100%(圖表中的紅線)?最好的情況(綠線)是我們能夠以多快的速度達到紅線在整個人羣中獲得的準確度(例如我們的最佳累積收益情景)。藍色是,如果我們只是隨機挑選人口中每個樣本的分類。因此,累積收益和提升圖表爲純粹爲以瞭解該模型(僅限於該模型)如何在不打算與整個人羣交互的情況下給我帶來更多影響。

我使用累積收益圖表的一種情況是欺詐案例,我想知道我們可以基本上忽略多少應用程序或優先級(因爲我知道模型可以預測它們以及它可以)百分之十。在這種情況下,對於'平均模型',我選擇了真正的無序數據集中的分類(以顯示現有應用程序是如何處理的,以及如何使用模型 - 我們可以優先考慮應用程序類型)。

所以,對於比較模型,只要堅持用ROC/AUC,一旦你滿意的選擇模式,使用累計漲幅/提升圖來看看它是如何迴應的數據。

+0

你爲什麼說你不能使用累積收益圖來比較不同的模型?在您提供的微軟資源中,有人說:「*只要模型都具有相同的可預測屬性*,就可以將多個模型添加到升降圖。」 我想你可以使用AUC(曲線下面積)來比較不同的曲線,與ROC或P-R曲線一樣,還是我錯了? – Tanguy

+0

@Tanguy,見上面,我給答案增加了一些細節。 – Ian