我剛剛使用scikit-learn創建了一個模型,該模型估計了客戶對某個提議作出響應的可能性。現在我正在嘗試評估我的模型。爲此我想繪製升力圖。我理解lift的概念,但我很努力去理解如何在python中實現它。如何在Python中創建升降圖(a.k.a獲得圖表)?
4
A
回答
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()
結果如下:
我發現這些網站有用的參考:
- https://docs.microsoft.com/en-us/sql/analysis-services/data-mining/lift-chart-analysis-services-data-mining
- https://paultebraak.wordpress.com/2013/10/31/understanding-the-lift-chart/
- http://www2.cs.uregina.ca/~dbd/cs831/notes/lift_chart/lift_chart.html
編輯:
我發現MS鏈接在其描述有點誤導,但保羅特Braak鏈接內容非常豐富。回答評論;
@Tanguy對於上面的累積增益圖表,所有計算均基於該特定模型的準確性。正如Paul Te Braak鏈接所指出的那樣,我的模型的預測準確度如何達到100%(圖表中的紅線)?最好的情況(綠線)是我們能夠以多快的速度達到紅線在整個人羣中獲得的準確度(例如我們的最佳累積收益情景)。藍色是,如果我們只是隨機挑選人口中每個樣本的分類。因此,累積收益和提升圖表爲純粹爲以瞭解該模型(僅限於該模型)如何在不打算與整個人羣交互的情況下給我帶來更多影響。
我使用累積收益圖表的一種情況是欺詐案例,我想知道我們可以基本上忽略多少應用程序或優先級(因爲我知道模型可以預測它們以及它可以)百分之十。在這種情況下,對於'平均模型',我選擇了真正的無序數據集中的分類(以顯示現有應用程序是如何處理的,以及如何使用模型 - 我們可以優先考慮應用程序類型)。
所以,對於比較模型,只要堅持用ROC/AUC,一旦你滿意的選擇模式,使用累計漲幅/提升圖來看看它是如何迴應的數據。
相關問題
- 1. 如何獲得在圖表
- 2. 創建Python圖表
- 3. 如何在python中創建cmyk圖像
- 4. 如何在Python中創建Sudoku拼圖
- 5. 創建視圖在python中的表
- 6. 在python中創建圖像表
- 7. 如何在aspx中創建圖表
- 8. 如何在Grafana中創建SLA圖表?
- 9. 如何在ASP.NET MVC3中創建圖表?
- 10. 如何在jsf中創建圖表?
- 11. 如何在grails中創建圖表?
- 12. 如何在vb.net中創建圖表
- 13. Python:創建列表圖形
- 14. Python - 創建圖案列表
- 15. 使用python創建圖表
- 16. 如何在excel表格中創建圖表/圖表OpenXML 2.0 C#
- 17. 如何在meta字段中創建圖庫時獲得wp圖庫的簡碼
- 18. 如何創建使用python-降價
- 19. 如何降級/升級在多個表
- 20. 如何獲得在列表視圖
- 21. 在SSRS中創建圖表
- 22. 在java中創建圖表
- 23. 在Java中創建圖表
- 24. 如何在Geo圖表中創建jQuery中的圖例?
- 25. 如何在Python中獲得精確的文件創建時間?
- 26. 如何獲得matplotlib中的當前繪圖的上升
- 27. 如何從python中的圖形(圖像)獲得函數方程?
- 28. 獲得當試圖創建通過PayPal
- 29. 創建餅圖在python
- 30. 如何獲得圖像中的圖像?
你爲什麼說你不能使用累積收益圖來比較不同的模型?在您提供的微軟資源中,有人說:「*只要模型都具有相同的可預測屬性*,就可以將多個模型添加到升降圖。」 我想你可以使用AUC(曲線下面積)來比較不同的曲線,與ROC或P-R曲線一樣,還是我錯了? – Tanguy
@Tanguy,見上面,我給答案增加了一些細節。 – Ian