樹模型決策的可解釋性與微調(diào)(Python)

本文示例沿用之前文章的數(shù)據(jù):一文梳理金融風(fēng)控建模全流程(Python)

一责蝠、樹模型的解釋性

集成學(xué)習(xí)樹模型因?yàn)槠鋸?qiáng)大的非線性能力及解釋性党巾,在表格類數(shù)據(jù)挖掘等任務(wù)中應(yīng)用頻繁且表現(xiàn)優(yōu)異萎庭。

模型解釋性對(duì)于某些領(lǐng)域(如金融風(fēng)控)是極為看重的,對(duì)于樹模型的解釋性齿拂,我們常巢倒妫可以通過輸出樹模型的結(jié)構(gòu)或使用shap等解釋性框架的方法

graphviz 輸出樹結(jié)構(gòu)

# 需要先安裝https://graphviz.org/download/
import os
os.environ["PATH"] += os.pathsep + 'D:/Program Files/Graphviz/bin/'   # 安裝路徑

for k in range(n_estimators):  #遍歷n_estimators棵樹的結(jié)構(gòu)
    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()


輸出樹的決策路徑是很直接的方法,但對(duì)于大規(guī)模(樹的數(shù)目>3基本就比較繞了)的集成樹模型來說署海,決策就太過于復(fù)雜了吗购,最終決策要每棵樹累加起來(相關(guān)樹的可解釋工作,可參考如下論文:https://www.cs.sjtu.edu.cn/~kzhu/papers/kzhu-infocode.pdf)砸狞,很難理解巩搏。。接下介紹下常用的幾種框架的方法輔助去解釋模型:

shap框架解釋性

SHAP基于Shapley值趾代,Shapley值是經(jīng)濟(jì)學(xué)家Lloyd Shapley提出的博弈論概念贯底。 它的核心思想是計(jì)算特征對(duì)模型輸出的邊際貢獻(xiàn),再?gòu)娜趾途植績(jī)蓚€(gè)層面對(duì)“黑盒模型”進(jìn)行解釋撒强。如下幾行代碼就可以展示該模型的變量對(duì)于決策的影響禽捆,以Insterest歷史利率為例,利率特征值越高(藍(lán)色為低飘哨,紅色為高)胚想,對(duì)應(yīng)shap值越高,說明決策結(jié)果越趨近1(在本例金融風(fēng)控項(xiàng)目里面也就是數(shù)值越大芽隆,越容易違約)

## 本文代碼請(qǐng)見 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

在可解釋性領(lǐng)域浊服,最早出名的方法之一是LIME。它可以幫助解釋機(jī)器學(xué)習(xí)模型正在學(xué)習(xí)什么以及為什么他們以某種方式預(yù)測(cè)胚吁。Lime目前支持對(duì)表格的數(shù)據(jù)牙躺,文本分類器和圖像分類器的解釋。

知道為什么模型會(huì)以這種方式進(jìn)行預(yù)測(cè)對(duì)于調(diào)整算法是至關(guān)重要的腕扶。借助LIME的解釋孽拷,能夠理解為什么模型以這種方式運(yùn)行。如果模型沒有按照計(jì)劃運(yùn)行半抱,那么很可能在數(shù)據(jù)準(zhǔn)備階段就犯了錯(cuò)誤脓恕。


  • Shapash

“ Shapash是一個(gè)使機(jī)器學(xué)習(xí)對(duì)每個(gè)人都可以進(jìn)行解釋和理解Python庫。Shapash提供了幾種類型的可視化窿侈,顯示了每個(gè)人都能理解的明確標(biāo)簽炼幔。數(shù)據(jù)科學(xué)家可以更輕松地理解他們的模型并分享結(jié)果。最終用戶可以使用最標(biāo)準(zhǔn)的摘要來理解模型是如何做出判斷的史简∧诵悖”

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

使用Shapash構(gòu)建特征貢獻(xiàn)圖


  • InterpretML

InterpretML是一個(gè)開源的Python包抬吟,它向研究人員提供機(jī)器學(xué)習(xí)可解釋性算法萨咕。InterpretML支持訓(xùn)練可解釋模型(glassbox),以及解釋現(xiàn)有的ML管道(blackbox)


  • ELI5

ELI5是一個(gè)可以幫助調(diào)試機(jī)器學(xué)習(xí)分類器并解釋它們的預(yù)測(cè)的Python庫火本。目前支持以下機(jī)器學(xué)習(xí)框架:scikit-learn危队、XGBoost、LightGBM CatBoost钙畔、Keras

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


  • OmniXAI

OmniXAI (Omni explained AI的簡(jiǎn)稱)擎析,是Salesforce最近開發(fā)并開源的Python庫簿盅。它提供全方位可解釋的人工智能和可解釋的機(jī)器學(xué)習(xí)能力來解決實(shí)踐中機(jī)器學(xué)習(xí)模型在產(chǎn)生中需要判斷的幾個(gè)問題。對(duì)于需要在ML過程的各個(gè)階段解釋各種類型的數(shù)據(jù)揍魂、模型和解釋技術(shù)的數(shù)據(jù)科學(xué)家桨醋、ML研究人員,OmniXAI希望提供一個(gè)一站式的綜合庫现斋,使可解釋的AI變得簡(jiǎn)單喜最。


二、微調(diào)樹模型結(jié)構(gòu)以符合業(yè)務(wù)解釋性

但是樹模型的解釋性也是有局限的庄蹋,再了解樹模型的決策邏輯后瞬内,不像邏輯回歸(LR)可以較為輕松的調(diào)節(jié)特征分箱及模型去符合業(yè)務(wù)邏輯(如收入越低的人通常越可能信用卡逾期,模型決策時(shí)可能持相反的邏輯限书,這時(shí)就需要調(diào)整了)虫蝶。

我們一旦發(fā)現(xiàn)樹結(jié)構(gòu)或shap值不符合業(yè)務(wù)邏輯,由于樹模型學(xué)習(xí)通常較復(fù)雜蔗包,想要依照業(yè)務(wù)邏輯去調(diào)整樹結(jié)構(gòu)就有點(diǎn)棘手了秉扑,所有很多時(shí)候只能推倒原來的模型,數(shù)據(jù)清洗调限、篩選、特征選擇等 重新學(xué)習(xí)一個(gè)新的模型误澳,直到特征決策在業(yè)務(wù)上面解釋得通耻矮。

在此,本文簡(jiǎn)單探討一個(gè)可以快速對(duì)lightgbm樹模型結(jié)構(gòu)進(jìn)行調(diào)整的方法忆谓。

lightgbm結(jié)構(gòu)

首先導(dǎo)出lightgbm單棵樹的結(jié)構(gòu)及相應(yīng)的模型文件:

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

model.booster_.save_model("lgbmodel.txt") # 導(dǎo)出模型文件
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集成多棵二叉樹的樹模型裆装,以如下一顆二叉樹的一個(gè)父節(jié)點(diǎn)及其兩個(gè)葉子分支具體解釋(其他樹及節(jié)點(diǎn)依此類推), 下面內(nèi)部節(jié)點(diǎn)是以

  • 特征insterest(貸款利率)的數(shù)值 是否<=15.962做的判斷劃分
  • 劃分的增益gain 42.658
  • 樣本權(quán)重 901.603
  • 該節(jié)點(diǎn)的樣本數(shù)2147 占據(jù)了30.67%的數(shù)據(jù)
  • 該節(jié)點(diǎn)的如果不繼續(xù)分裂葉子,獲得的分?jǐn)?shù)值是0.123
    劃分后的兩個(gè)葉子節(jié)點(diǎn):
  • leaf2 分?jǐn)?shù)值 0.103
  • leaf5 分?jǐn)?shù)值 0.147
    分?jǐn)?shù)值越高說明該葉子決策結(jié)果越趨近1(在本例金融風(fēng)控項(xiàng)目里面也就是數(shù)值越大哨免,越容易違約)


在金融風(fēng)控領(lǐng)域是很注重決策的可解釋性茎活,有時(shí)我們可能發(fā)現(xiàn)某一個(gè)葉子節(jié)點(diǎn)的決策是不符合業(yè)務(wù)解釋性的。比如琢唾,業(yè)務(wù)上認(rèn)為利率越高 違約概率應(yīng)該越低载荔,那我們上圖的節(jié)點(diǎn)就是不符合業(yè)務(wù)經(jīng)驗(yàn)的(注:這里只是假設(shè),實(shí)際上圖節(jié)點(diǎn)的決策 還是符合業(yè)務(wù)經(jīng)驗(yàn)的)

那么這時(shí)最快微調(diào)樹模型的辦法就是直接對(duì)這個(gè)模型的這個(gè)葉子節(jié)點(diǎn)剪枝掉采桃,只保留內(nèi)部節(jié)點(diǎn)做決策懒熙。

那么,如何快速地對(duì)lightgbm手動(dòng)調(diào)整樹結(jié)構(gòu)(如剪枝)呢普办?

lightgbm手動(dòng)剪枝

這里有個(gè)取巧的剪枝辦法工扎,可以在保留原始樹結(jié)構(gòu)的前提下,修改葉子節(jié)點(diǎn)的分?jǐn)?shù)值為他們上級(jí)父節(jié)點(diǎn)的分?jǐn)?shù)值衔蹲,那邏輯上就等同于“剪枝”了

  • 剪枝前



    對(duì)應(yīng)的測(cè)試集的模型效果


  • 剪枝后 (修改葉子節(jié)點(diǎn)為父節(jié)點(diǎn)的分?jǐn)?shù))

可以手動(dòng)修改下模型文件對(duì)應(yīng)葉子節(jié)點(diǎn)的分?jǐn)?shù)值:


我們?cè)衮?yàn)證下剪枝前后肢娘,測(cè)試集的模型效果差異:auc降了1%,ks變化不大舆驶;


通過剪枝去優(yōu)化模型復(fù)雜度或者去符合合理業(yè)務(wù)經(jīng)驗(yàn)橱健,對(duì)模型帶來都是正則化效果模型可以減少統(tǒng)計(jì)噪音的影響(減少過擬合),有更好的泛化效果贞远。

當(dāng)然本方法建立在小規(guī)模的集成學(xué)習(xí)樹模型畴博,如果動(dòng)則幾百上千顆的大規(guī)模樹模型,人為調(diào)整每一顆的樹結(jié)構(gòu)蓝仲,這也不現(xiàn)實(shí)俱病。。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末袱结,一起剝皮案震驚了整個(gè)濱河市亮隙,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌垢夹,老刑警劉巖溢吻,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異果元,居然都是意外死亡促王,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門而晒,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝇狼,“玉大人,你說我怎么就攤上這事倡怎⊙冈牛” “怎么了贱枣?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)颤专。 經(jīng)常有香客問我纽哥,道長(zhǎng),這世上最難降的妖魔是什么栖秕? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任春塌,我火速辦了婚禮,結(jié)果婚禮上累魔,老公的妹妹穿的比我還像新娘摔笤。我一直安慰自己,他們只是感情好垦写,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布吕世。 她就那樣靜靜地躺著,像睡著了一般梯投。 火紅的嫁衣襯著肌膚如雪命辖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天分蓖,我揣著相機(jī)與錄音尔艇,去河邊找鬼。 笑死么鹤,一個(gè)胖子當(dāng)著我的面吹牛终娃,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播蒸甜,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼棠耕,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了柠新?” 一聲冷哼從身側(cè)響起窍荧,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎恨憎,沒想到半個(gè)月后蕊退,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡憔恳,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年瓤荔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钥组。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡茉贡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出者铜,到底是詐尸還是另有隱情腔丧,我是刑警寧澤,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布作烟,位于F島的核電站愉粤,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏拿撩。R本人自食惡果不足惜衣厘,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望压恒。 院中可真熱鬧影暴,春花似錦、人聲如沸探赫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽伦吠。三九已至妆兑,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間毛仪,已是汗流浹背搁嗓。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箱靴,地道東北人腺逛。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像衡怀,于是被迫代替她去往敵國(guó)和親棍矛。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容