import os
os.environ["PATH"] += os.pathsep + 'D:/Program Files/Graphviz/bin/' # 安裝路徑

for k in range(n_estimators): #遍歷n_estimators棵樹的結構
ax = lightgbm.plot_tree(lgb, tree_index=k, figsize=(30,20), show_info=['split_gain','internal_value','internal_count','internal_weight','leaf_count','leaf_weight','data_percentage'])
plt.show()

輸出樹的決策路徑是很直接的方法,但對于大規模(樹的數目>3基本就比較繞了)的集成樹模型來說,決策就太過于復雜了,最終決策要每棵樹累加起來,很難理解。。(相關樹的可解釋工作,可參考如下論文:https://www.cs.sjtu.edu.cn/~kzhu/papers/kzhu-infocode.pdf)

接下介紹下常用的幾種框架的方法輔助去解釋模型:

shap框架解釋性

SHAP基于Shapley值,Shapley值是經濟學家Lloyd Shapley提出的博弈論概念。它的核心思想是計算特征對模型輸出的邊際貢獻,再從全局和局部兩個層面對“黑盒模型”進行解釋。如下幾行代碼就可以展示該模型的變量對于決策的影響,以Insterest歷史利率為例,利率特征值越高(藍色為低,紅色為高),對應shap值越高,說明決策結果越趨近1(在本例金融風控項目里面也就是數值越大,越容易違約)

## 本文代碼請見 https://github.com/aialgorithm/Blog/tree/master/projects/%E6%B5%B7%E5%A4%96%E9%87%91%E8%9E%8D%E9%A3%8E%E6%8E%A7%E5%AE%9E%E8%B7%B5

### 需要先pip install shap
import shap

explainer = shap.TreeExplainer(lgb)
shap_values = explainer.shap_values(pd.concat([train_x,test_x]))
shap.summary_plot(shap_values[1], pd.concat([train_x,test_x]),max_display=5,plot_size=(5,5)) #特征重要性可視化

其他模型可解釋性框架

在可解釋性領域,最早出名的方法之一是LIME。它可以幫助解釋機器學習模型正在學習什么以及為什么他們以某種方式預測。Lime目前支持對表格的數據,文本分類器和圖像分類器的解釋。

知道為什么模型會以這種方式進行預測對于調整算法是至關重要的。借助LIME的解釋,能夠理解為什么模型以這種方式運行。如果模型沒有按照計劃運行,那么很可能在數據準備階段就犯了錯誤。

“ Shapash是一個使機器學習對每個人都可以進行解釋和理解Python庫。Shapash提供了幾種類型的可視化,顯示了每個人都能理解的明確標簽。數據科學家可以更輕松地理解他們的模型并分享結果。最終用戶可以使用最標準的摘要來理解模型是如何做出判斷的。”

Shapash庫可以生成交互式儀表盤,并收集了許多可視化圖表。與外形/石灰解釋性有關。它可以使用SHAP/Lime作為后端,也就是說它只提供了更好看的圖表。

使用Shapash構建特征貢獻圖

InterpretML是一個開源的Python包,它向研究人員提供機器學習可解釋性算法。InterpretML支持訓練可解釋模型(glassbox),以及解釋現有的ML管道(blackbox)

ELI5是一個可以幫助調試機器學習分類器并解釋它們的預測的Python庫。目前支持以下機器學習框架:scikit-learn、XGBoost、LightGBM CatBoost、Keras

ELI5有兩種主要的方法來解釋分類或回歸模型:檢查模型參數并說明模型是如何全局工作的;檢查模型的單個預測并說明什么模型會做出這樣的決定。

OmniXAI (Omni explained AI的簡稱),是Salesforce最近開發并開源的Python庫。它提供全方位可解釋的人工智能和可解釋的機器學習能力來解決實踐中機器學習模型在產生中需要判斷的幾個問題。對于需要在ML過程的各個階段解釋各種類型的數據、模型和解釋技術的數據科學家、ML研究人員,OmniXAI希望提供一個一站式的綜合庫,使可解釋的AI變得簡單。

二、微調樹模型結構以符合業務解釋性

但是樹模型的解釋性也是有局限的,再了解樹模型的決策邏輯后,不像邏輯回歸(LR)可以較為輕松的調節特征分箱及模型去符合業務邏輯(如收入越低的人通常越可能信用卡逾期,模型決策時可能持相反的邏輯,這時就需要調整了)。

我們一旦發現樹結構或shap值不符合業務邏輯,由于樹模型學習通常較復雜,想要依照業務邏輯去調整樹結構就有點棘手了,所有很多時候只能推倒原來的模型,數據清洗、篩選、特征選擇等 重新學習一個新的模型,直到特征決策在業務上面解釋得通。

在此,本文簡單探討一個可以快速對lightgbm樹模型結構進行調整的方法。

lightgbm結構

首先導出lightgbm單棵樹的結構及相應的模型文件:

# 本文代碼 (https://github.com/aialgorithm/Blog)

model.booster_.save_model("lgbmodel.txt") # 導出模型文件
tree
version=v3
num_class=1
num_tree_per_iteration=1
label_index=0
max_feature_idx=36
objective=binary sigmoid:1
feature_names=total_loan year_of_loan interest monthly_payment class work_year house_exist censor_status use post_code region debt_loan_ratio del_in_18month scoring_low scoring_high known_outstanding_loan known_dero pub_dero_bankrup recircle_b recircle_u initial_list_status app_type title policy_code f0 f1 f2 f3 f4 early_return early_return_amount early_return_amount_3mon issue_date_y issue_date_m issue_date_diff employer_type industry
feature_infos=[818.18181819999995:47272.727270000003] [3:5] [4.7789999999999999:33.978999999999999] [30.440000000000001:1503.8900000000001] [0:6] [0:10] [0:4] [0:2] [0:13] [0:901] [0:49] [0:509.3672727] [0:15] [540:910.90909090000002] [585:1131.818182] [1:59] [0:12] [0:9999] [0:779021] [0:120.6153846] [0:1] [0:1] [0:60905] none [0:9999] [0:9999] [0:9999] [2:9999] [0:9999] [0:5] [0:17446] [0:4821.8999999999996] [2007:2018] [1:12] [2830:6909] -1:4:3:2:0:1:5 -1:13:11:3:1:2:10:7:8:12:0:4:5:9:6
tree_sizes=770

Tree=0
num_leaves=6
num_cat=0
split_feature=30 2 16 15 2
split_gain=3093.94 124.594 59.0243 46.1935 42.6584
threshold=1.0000000180025095e-35 9.9675000000000029 1.5000000000000002 17.500000000000004 15.961500000000003
decision_type=2 2 2 2 2
left_child=1 -1 3 -2 -3
right_child=2 4 -4 -5 -6
leaf_value=0.023461476907437533 -0.17987415362524772 0.10323905611372351 -0.026732447730002745 -0.10633877114664755 0.14703056722907529
leaf_weight=147.41318297386169 569.9415502846241 502.41849474608898 30.554571613669395 100.48724548518658 399.18497054278851
leaf_count=544 3633 1325 133 543 822
internal_value=-5.60284e-08 0.108692 -0.162658 -0.168852 0.122628
internal_weight=0 1049.02 700.983 670.429 901.603
internal_count=7000 2691 4309 4176 2147
is_linear=0
shrinkage=1

end of trees

feature_importances:
interest=2
known_outstanding_loan=1
known_dero=1
early_return_amount=1

parameters:
[boosting: gbdt]
[objective: binary]
[metric: auc]
[tree_learner: serial]
[device_type: cpu]
[data: ]
[valid: ]
[num_iterations: 1]
[learning_rate: 0.1]
[num_leaves: 6]
[num_threads: -1]
[deterministic: 0]
[force_col_wise: 0]
[force_row_wise: 0]
[histogram_pool_size: -1]
[max_depth: -1]
[min_data_in_leaf: 20]
[min_sum_hessian_in_leaf: 0.001]
[bagging_fraction: 1]
[pos_bagging_fraction: 1]
[neg_bagging_fraction: 1]
[bagging_freq: 0]
[bagging_seed: 7719]
[feature_fraction: 1]
[feature_fraction_bynode: 1]
[feature_fraction_seed: 2437]
[extra_trees: 0]
[extra_seed: 11797]
[early_stopping_round: 0]
[first_metric_only: 0]
[max_delta_step: 0]
[lambda_l1: 0]
[lambda_l2: 0]
[linear_lambda: 0]
[min_gain_to_split: 0]
[drop_rate: 0.1]
[max_drop: 50]
[skip_drop: 0.5]
[xgboost_dart_mode: 0]
[uniform_drop: 0]
[drop_seed: 21238]
[top_rate: 0.2]
[other_rate: 0.1]
[min_data_per_group: 100]
[max_cat_threshold: 32]
[cat_l2: 10]
[cat_smooth: 10]
[max_cat_to_onehot: 4]
[top_k: 20]
[monotone_constraints: ]
[monotone_constraints_method: basic]
[monotone_penalty: 0]
[feature_contri: ]
[forcedsplits_filename: ]
[refit_decay_rate: 0.9]
[cegb_tradeoff: 1]
[cegb_penalty_split: 0]
[cegb_penalty_feature_lazy: ]
[cegb_penalty_feature_coupled: ]
[path_smooth: 0]
[interaction_constraints: ]
[verbosity: -1]
[saved_feature_importance_type: 0]
[linear_tree: 0]
[max_bin: 255]
[max_bin_by_feature: ]
[min_data_in_bin: 3]
[bin_construct_sample_cnt: 200000]
[data_random_seed: 38]
[is_enable_sparse: 1]
[enable_bundle: 1]
[use_missing: 1]
[zero_as_missing: 0]
[feature_pre_filter: 1]
[pre_partition: 0]
[two_round: 0]
[header: 0]
[label_column: ]
[weight_column: ]
[group_column: ]
[ignore_column: ]
[categorical_feature: 35,36]
[forcedbins_filename: ]
[precise_float_parser: 0]
[objective_seed: 8855]
[num_class: 1]
[is_unbalance: 0]
[scale_pos_weight: 1]
[sigmoid: 1]
[boost_from_average: 1]
[reg_sqrt: 0]
[alpha: 0.9]
[fair_c: 1]
[poisson_max_delta_step: 0.7]
[tweedie_variance_power: 1.5]
[lambdarank_truncation_level: 30]
[lambdarank_norm: 1]
[label_gain: ]
[eval_at: ]
[multi_error_top_k: 1]
[auc_mu_weights: ]
[num_machines: 1]
[local_listen_port: 12400]
[time_out: 120]
[machine_list_filename: ]
[machines: ]
[gpu_platform_id: -1]
[gpu_device_id: -1]
[gpu_use_dp: 0]
[num_gpu: 1]

end of parameters

pandas_categorical:[["\u4e0a\u5e02\u4f01\u4e1a", "\u4e16\u754c\u4e94\u767e\u5f3a", "\u5e7c\u6559\u4e0e\u4e2d\u5c0f\u5b66\u6821", "\u653f\u5e9c\u673a\u6784", "\u666e\u901a\u4f01\u4e1a", "\u9ad8\u7b49\u6559\u80b2\u673a\u6784"], ["\u4ea4\u901a\u8fd0\u8f93\u3001\u4ed3\u50a8\u548c\u90ae\u653f\u4e1a", "\u4f4f\u5bbf\u548c\u9910\u996e\u4e1a", "\u4fe1\u606f\u4f20\u8f93\u3001\u8f6f\u4ef6\u548c\u4fe1\u606f\u6280\u672f\u670d\u52a1\u4e1a", "\u516c\u5171\u670d\u52a1\u3001\u793e\u4f1a\u7ec4\u7ec7", "\u519c\u3001\u6797\u3001\u7267\u3001\u6e14\u4e1a", "\u5236\u9020\u4e1a", "\u56fd\u9645\u7ec4\u7ec7", "\u5efa\u7b51\u4e1a", "\u623f\u5730\u4ea7\u4e1a", "\u6279\u53d1\u548c\u96f6\u552e\u4e1a", "\u6587\u5316\u548c\u4f53\u80b2\u4e1a", "\u7535\u529b\u3001\u70ed\u529b\u751f\u4ea7\u4f9b\u5e94\u4e1a", "\u91c7\u77ff\u4e1a", "\u91d1\u878d\u4e1a"]]

lightgbm集成多棵二叉樹的樹模型,以如下一顆二叉樹的一個父節點及其兩個葉子分支具體解釋(其他樹及節點依此類推), 下面內部節點是以

在金融風控領域是很注重決策的可解釋性,有時我們可能發現某一個葉子節點的決策是不符合業務解釋性的。比如,業務上認為利率越高 違約概率應該越低,那我們上圖的節點就是不符合業務經驗的(注:這里只是假設,實際上圖節點的決策 還是符合業務經驗的)

那么這時最快微調樹模型的辦法就是直接對這個模型的這個葉子節點剪枝掉,只保留內部節點做決策。

那么,如何快速地對lightgbm手動調整樹結構(如剪枝)呢?

lightgbm手動剪枝

這里有個取巧的剪枝辦法,可以在保留原始樹結構的前提下,修改特定葉子節點的分數值為他們上級父節點的分數值,那邏輯上就等同于“剪枝”了

剪枝前

對應的測試集的模型效果

剪枝后 (修改葉子節點為父節點的分數)

可以手動修改下模型文件對應葉子節點的分數值:

我們再驗證下剪枝前后,測試集的模型效果差異:auc降了1%,ks變化不大;

通過剪枝去優化模型復雜度或者去符合合理業務經驗,對模型帶來都是正則化效果模型可以減少統計噪音的影響(減少過擬合),有更好的泛化效果。

當然本方法建立在小規模集成學習的樹模型,如果動則幾百上千顆的大規模樹模型,人為調整每一顆的樹結構,這也不現實。。

文章轉自微信公眾號@算法進階

上一篇:

統計學習模型:概念、建模預測及評估

下一篇:

10大機器學習聚類算法實現(Python)
#你可能也喜歡這些API文章!

我們有何不同?

API服務商零注冊

多API并行試用

數據驅動選型,提升決策效率

查看全部API→
??

熱門場景實測,選對API

#AI文本生成大模型API

對比大模型API的內容創意新穎性、情感共鳴力、商業轉化潛力

25個渠道
一鍵對比試用API 限時免費

#AI深度推理大模型API

對比大模型API的邏輯推理準確性、分析深度、可視化建議合理性

10個渠道
一鍵對比試用API 限時免費