尋夢新聞LINE@每日推播熱門推薦文章,趣聞不漏接❤️
點擊上方關注,All in AI中國
我們真的了解在我們構建的ML模型中發生了什麼嗎?讓我們來探索吧。
在我之前的博客中,我們看到了對XGBoost、LightGBM和Catboost的比較研究。通過這種分析,我們得出結論,catboost在速度和準確性方面都優於其他兩個。在這一部分中,我們將深入探討catboost,探索catboost為高效建模和理解超參數提供的新功能。
對於新讀者來說,catboost是由Yandex團隊在2017年開發的一種開源梯度增強算法。它是一種機器學習算法,允許用戶快速處理大型數據集的分類特徵,這與XGBoost和LightGBM不同。 Catboost可用於解決回歸、分類和排序問題。
作為數據科學家,我們可以輕鬆地訓練模型並進行預測,但是,我們經常無法理解這些奇特算法中發生的事情。這是我們看到離線評估和最終生產之間模型性能差異巨大的原因之一。現在是我們不再將ML視為「黑匣子」並且在提高模型準確性的同時重視模型解釋的時候了。這也有助於我們識別數據偏差。在這一部分中,我們將看到catboost如何通過以下功能幫助我們分析模型並提高可視性:
特徵重要性
你為什麼要知道它?
- 刪除不必要的特徵以簡化模型並縮短訓練/預測時間
- 為您的目標價值獲取最具影響力的功能並操縱它們以獲得業務收益(例如:醫療保健提供商希望確定哪些因素會導致每位患者患某種疾病的風險,以便他們可以直接通過針對性藥物解決這些風險因素)
除了選擇特徵重要性的類型之外,我們還應該知道我們想要使用哪些數據來查找特徵重要性 – 訓練、測試或完成數據集。選擇一個在另一個上有利有弊,但最後,您需要決定是否要知道模型依賴於每個特徵進行預測的多少(使用訓練數據)或該特徵對性能的貢獻程度模型對未見數據的影響(使用測試數據)。我們稍後將看到,只有一些方法可用於查找未用於訓練模型的數據的特徵重要性。
如果您關心第二個並假設您擁有所有時間和資源,那麼找到特徵重要性的最原始且最可靠的方法是訓練多個模型,一次留下一個特徵並比較測試集上的性能。如果性能相對於基線(當我們使用所有功能時的性能)發生很大變化,則意味著該特徵非常重要。但是,由於我們生活在一個需要優化精度和計算時間的實際環境中,這種方法是不必要的。以下是一些智能方法,其中catboost可讓您找到適合您模型的最佳功能:
cb.get_feature_importance(type= "___")
"type" possible values:
- PredictionValuesChange
- LossFunctionChange
- FeatureImportance
PredictionValuesChange for non-ranking metrics and LossFunctionChange for ranking metrics
- ShapValues
Calculate SHAP Values for every object
- Interaction
Calculate pairwise score between every feature
PredictionValuesChange
對於每個要素,PredictionValuesChange顯示預測在特徵值更改時平均變化的程度。重要性值越大,平均值越大,如果此特徵發生變化,則預測值會發生變化。
優點:計算成本低廉,因為您無需進行多次訓練或測試,也不會存儲任何額外信息。您將獲得標準化值作為輸出(所有重要性加起來將為100)。
缺點:它可能會給排名目標帶來誤導性結果,它可能會將groupwise特性置於頂部,即使它們對最終的損失值有一點影響。
LossFunctionChange損失函數變化
為了獲得這個特徵的重要性,catboost簡單地採用了在正常情況下(當我們包括特徵時)使用模型獲得的度量(Loss函數)與沒有此特徵的模型之間的差異。差異越大,特徵越重要。在catboost文檔中沒有明確提到我們如何在沒有特徵的情況下找到模型。
優點和缺點:這對於大多數類型的問題都很有效,這與預測值變化不同,在這種情況下,您可以獲得排名問題的誤導性結果,同時,它的計算量很大。
Shap Values
https://github.com/slundberg/shap
SHAP值將預測值分解為每個要素的貢獻。它測量特徵對單個預測值的影響並比較基線預測(訓練數據集的目標值的平均值)進行比較。
shap值的兩個主要用例:
1.特徵的對象級貢獻
shap_values = model.get_feature_importance(Pool(X_test, label=y_test,cat_features=categorical_features_indices),
type="ShapValues")
expected_value = shap_values[0,-1]
shap_values = shap_values[:,:-1]
shap.initjs()
shap.force_plot(expected_value, shap_values[3,:], X_test.iloc[3,:])
https://github.com/slundberg/shap
2.整個數據集的摘要(整體特徵重要性)
shap.summary_plot(shap_values,X_test)
雖然我們可以通過shap獲得準確的特徵重要性,但它們在計算上比catboost內置特徵重要性更昂貴。
獎金
基於相同概念但不同做到的另一個特徵重要性是基於排列的特徵重要性。catboost沒有使用它,這純粹是與模型無關並且易於計算。
我們如何選擇?
雖然BothPredictionValuesChange和LossFunctionChange可用於所有類型的指標,但建議使用LossFunctionChange對度量進行排序。除了PredictionValuesChange之外,所有其他方法都可以使用測試數據,使用在訓練數據上訓練的模型來查找特徵重要性。
為了更好地理解這些差異,以下是我們討論的所有方法的結果:
catboost特徵的結果。預測人們是否會從經典的「成人」人口普查數據集中報告超過5萬美元的收入(使用對數損失)
從上面的圖中,我們可以看到大多數方法都同意頂級特徵。它看起來像LossFunctionChange最接近shap(更可靠)。但是,直接比較這些方法是不公平的,因為預測值的變化是基於訓練數據,而所有其他方法都是基於測試數據。
我們還應該看到運行所有這些所需的時間:
交互
使用此參數,您可以找到一對要素的強度(兩個要素的重要性)。
在輸出中,您將獲得每對特性的列表。該列表將具有3個值,第一個值是該對中第一個要素的索引,第二個值是該對中第二個要素的索引,第三個值是該對的特徵重要性得分。有關實施細節,請查看嵌入式筆記本。
值得注意的是,單個特徵重要性中的前兩個特徵不一定是最強的一對。
筆記本
在筆記本中使用的數據集
對象重要性
你為什麼要知道它?
- 從訓練數據中刪除最無用的訓練對象
- 根據哪些新對象預期最「有用」,優先考慮一批新對象進行標記,這類似於主動學習
使用此功能,您可以計算每個對象對測試數據的優化指標的影響。正值反映優化度量增加,負值反映優化度量減少。此方法是本文中描述的方法的一種做到。這些算法的詳細信息超出了本文的討論範圍。
對象重要性的Catboost教程
cb.get_object_importance中有三種類型的update_method:
- SinglePoint:最快、最不準確的方法
- TopKLeaves:指定葉數。值越高、計算越準確、越慢
- AllPoints:最慢、最準確的方法
例如,以下值將方法設置為TopKLeaves,並將葉數限制為3:
TopKLeaves:top= 3
模型分析圖
Catboost最近在其最新更新中推出了此功能。通過此功能,我們將能夠可視化算法如何分割每個要素的數據,並查看特定於要素的統計信息。更具體地說,我們將能夠看到:
- 每個bin的平均目標值(bin用於連續功能)或類別(目前僅支持OHE功能)
- 每個箱/類別的平均預測值
- 每個bin中的對象數
- 不同特徵值的預測:對於每個對象,特徵值都是變化的,因此它會落入某個區域。然後,模型根據該特徵的新值預測目標,並獲取區域中預測的平均值(由紅點給出)。
這個圖將為我們提供信息,例如我們的分裂是多麼均勻(我們不希望所有對象都進入一個區域),我們的預測是否接近目標(藍色和橙色線),紅線將告訴我們,我們的預測多敏感。
數值特徵分析
單熱編碼特徵分析
‘,
>深入研究Catboost用於模型解釋的功能