妯″瀷鐨勫彲瑙i噴鎬э細閮ㄥ垎渚濊禆鍥綪DP鍜屼釜浣撴潯浠舵湡鏈涘浘ICE鈾€鈸库檧閮ㄥ垎渚濊禆鍥?(PDP) 鍜屼釜浣撴潯浠舵湡鏈?(ICE) 鍥惧彲鐢ㄤ簬鍙鍖栧拰鍒嗘瀽璁粌鐩爣涓庝竴缁勮緭鍏ョ壒寰佷箣闂寸殑浜や簰鍏崇郴銆傞儴鍒嗕緷璧栧浘锛圥artial Dependence Plot)閮ㄥ垎渚濊禆鍥炬樉绀轰簡鐩爣鍑芥暟锛堝嵆鎴戜滑鐨勬満鍣ㄥ涔犳ā鍨嬶級鍜屼竴缁勭壒寰佷箣闂寸殑渚濊禆鍏崇郴锛屽苟杈圭紭鍖栧叾浠栫壒寰佺殑鍊硷紙涔熷氨鏄ˉ鍏呯壒寰侊級銆傚畠浠槸閫氳繃灏嗘ā鍨嬪簲鐢ㄤ簬涓€缁勬暟鎹€佹敼鍙樻劅鍏磋叮鐗瑰緛鐨勫€煎悓鏃朵繚鎸佽ˉ鍏呯壒寰佺殑鍊间笉鍙樺彲浠ュ垎鏋愭ā鍨嬭緭鍑烘潵璁$畻鐗瑰緛鍙橀噺瀵规ā鍨嬮娴嬬粨鏋滃奖鍝嶇殑鍑芥暟鍏崇郴锛氫緥濡傝繎浼肩嚎鎬у叧绯汇€佸崟璋冨叧绯绘垨鑰呮洿澶嶆潅鐨勫叧绯汇€備釜浣撴潯浠舵湡鏈涘浘锛圛ndividual Conditional Expectation 锛夎櫧鐒?PDP 鎿呴暱鏄剧ず鐩爣鐗瑰緛鐨勫钩鍧囨晥鏋滐紝浣嗗畠鍙兘浼氭ā绯婁粎鍦ㄦ煇浜涙牱鏈笂鏄剧ず鐗瑰緛鐨勫叧绯诲奖鍝嶃€傛墍浠ヤ釜浣撶殑鏉′欢鏈熸湜 (ICE) 鍥炬樉绀轰簡鐩爣鍑芥暟鍜岀壒寰佷箣闂寸殑渚濊禆鍏崇郴銆備笌鏄剧ず涓€缁勭壒寰佺殑骞冲潎鏁堟灉鐨勯儴鍒嗕緷璧栧浘涓嶅悓锛孖CE 鍥炬秷闄や簡闈炲潎鍖€鏁堝簲鐨勫奖鍝嶅苟鍒嗗埆鍙鍖栨瘡涓牱鏈殑棰勬祴瀵圭壒寰佺殑渚濊禆鍏崇郴锛屾瘡涓牱鏈竴琛屻€備唬鐮佺ず渚嬫敞锛歴klearn 0.24浠ュ悗鐨勭増鏈篃鍔犲叆瀵硅繖涓や釜鍥捐繘琛岀粯鍒剁殑鍔熻兘锛屼絾鏄繖閲屾垜浠娇鐢ㄦ洿濂界殑shap搴揻rom sklearn.datasets import fetch_california_housingfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.inspection import PartialDependenceDisplayimport matplotlib.pyplot as plt鍦ㄦ湰鏂囦腑锛屾垜浠娇鐢ㄥ姞宸炰綇鎴跨殑鏁版嵁闆嗭紝鍏剁洰鐨勬槸浣跨敤鏀跺叆涓綅鏁版垨姣忔埛鎴块棿鏁伴噺绛夌壒寰佹潵棰勬祴琛楀尯鐨勫钩鍧囨埧浠枫€傞鍏堣缁冧竴涓?RandomForestRegressor 鏉ユ牴鎹繖浜涚壒寰侀娴嬫埧浠凤紝鏈€鍚庝娇鐢?sklearn.inspection 妯″潡涓殑 PartialDependenceDisplay 绫诲埗浣滈儴鍒嗕緷璧栧浘鍜屼釜浣撴潯浠舵湡鏈涘浘銆傛垜浠富瑕佸鐞嗕互涓嬭繖浜涚壒鎬э細AveOccup锛氬钩鍧囧搴垚鍛樻暟銆侻edInc锛氭敹鍏ヤ腑浣嶆暟銆傚姞杞藉姞宸炰綇鎴挎暟鎹泦X, y = fetch_california_housing (return_X_y = True, as_frame = True)鐩爣鍙橀噺鏄姞宸炲湴鍖虹殑鎴垮眿浠峰€间腑浣嶆暟锛屼互鏁板崄涓囩編鍏冿紙$100,000锛夎〃绀恒€傝鏁版嵁闆嗘潵鑷?1990 骞寸殑缇庡浗 浜哄彛鏅煡鍙戝竷鏍锋湰鏁版嵁锛堣鍖烘槸鏈€灏忕殑鍦扮悊鍗曚綅锛岄€氬父鏄竴涓鍖轰汉鍙d负 600 鑷?3,000 浜猴級銆侻edInc 鏀跺叆涓綅鏁癏ouseAge 鎴垮眿骞撮緞涓綅鏁癆veRooms 姣忔埛骞冲潎鎴块棿鏁癆veBedrms 姣忔埛骞冲潎鍗у鏁伴噺Population 浜哄彛鏁癆veOccup 骞冲潎瀹跺涵鎴愬憳鏁癓atitude 绾害Longitude 缁忓害浠ヤ笅鏄暟鎹泦涓殑涓€浜涙牱鏈壒寰佸€笺€傜洰鏍囩壒寰侊紝鍗?姣忎釜琛楀尯鐨勫钩鍧囦环鏍硷紝鍦?0 鍒?5 涔嬮棿娴姩锛屾暟鍊间互鍗佷竾缇庡厓琛ㄧず銆傝鎴戜滑鍏堣缁冧竴涓?RandomForestRegressor 鏉ュ涔犱粠鎴垮眿鐗瑰緛涓娴嬩环鏍笺€俶odel = RandomForestRegressor(random_state=42).fit(X, y)鐒跺悗浣跨敤 Shap 搴撴潵杩涜缁樺浘锛孲hap搴撲腑鍖呭惈鍑犵鍙В閲婄殑 AI 鐩稿叧鏂规硶銆俻ip install shap瀵煎叆 Shap 搴撳苟鍒涘缓涓€灏忛儴鍒嗚缁冩暟鎹紝鍦ㄦ湰渚嬩腑涓?100 涓牱鏈琲mport shapX100 = X.sample(n=100)鎺ヤ笅鏉ワ紝浣跨敤 shap.plots 妯″潡鐨?partial_dependence 鍑芥暟鍒朵綔閮ㄥ垎渚濊禆鍥撅紝骞朵綔涓哄弬鏁颁紶閫掞細鐩爣鐗瑰緛锛圓veOccup锛夈€傞娴嬪嚱鏁?(model.predict)銆傛暟鎹泦 (X100)銆傛槸鍚﹀埗浣滈儴鍒嗕緷璧栧浘鎴栦釜浣撴潯浠舵湡鏈涘浘銆傛槸鍚﹁繕缁樺埗骞冲潎妯″瀷棰勬祴 (model_expected_value) 鍜屽钩鍧囩壒寰佸€?(feature_expected_value)銆俿hap.plots.partial_dependence( "AveOccup", model.predict, X100, ice=False, model_expected_value=True, feature_expected_value=True)鍑芥暟浼氳凯浠?X100 涓殑鎵€鏈夋牱鏈紝骞朵笖瀵逛簬姣忎釜鏍锋湰澶氭璋冪敤 model.predict 鍑芥暟锛屼慨鏀圭洰鏍囩壒寰佺殑鍊硷紝浣嗕繚鎸佽ˉ鍏呯壒寰侊紙鍗虫墍鏈夊叾浠栫壒寰侊級涓嶅彉銆傜粨鏋滃浘鏄剧ず浜嗘暣涓暟鎹泦涓婃瘡涓洰鏍囩壒寰佸€肩殑妯″瀷骞冲潎杈撳嚭銆備笂鍥句腑鍙互鐪嬪埌褰?AveOccup 浣庝簬 2 鏃讹紝棰勬湡妯″瀷 Prediction 寰堥珮锛岀劧鍚庡畠杩呴€熶笅闄嶏紝鐩村埌 AveOccup 涓?4锛屽苟涓斿浜庢洿楂樼殑 AveOccup 鍩烘湰淇濇寔涓嶅彉銆傝鎴戜滑瀵?MedInc 鍋氬悓鏍风殑浜嬫儏銆俿hap.plots.partial_dependence( "MedInc", model.predict, X100, ice=False, model_expected_value=True, feature_expected_value=True)鐪嬭捣鏉ュ钩鍧囬娴嬪搴环鏍奸殢鐫€鏀跺叆涓綅鏁扮殑澧炲姞鑰屽鍔犮€備笅闈㈠皾璇曚笅涓綋鏉′欢鏈熸湜鍥俱€傚彲浠ュ啀娆′娇鐢?partial_dependence 鍑芥暟鏉ュ埗浣滃畠浠紝浣嗚繖娆″皢 ice 鍙傛暟璁剧疆涓?True銆俿hap.plots.partial_dependence( "AveOccup", model.predict, X100, ice=True, model_expected_value=True, feature_expected_value=True)缁撴灉浠嶇劧鏄剧ず浜?AveOccup 鐗瑰緛鍙樺寲鐨勫钩鍧囨ā鍨嬮娴嬶紝鍗虫繁钃濊壊绾裤€備絾鏄紝ICE 鍥捐繕鏄剧ず浜嗘瘡涓牱鏈殑杈撳嚭鍙樺寲锛岃繖浣挎垜浠兘澶熸煡鐪嬫槸鍚﹀瓨鍦ㄥ叿鏈変笉鍚岀壒寰佷氦浜掔殑鏍锋湰銆備緥濡傚湪鍥捐〃鐨勯《閮紝鍙互鐪嬪埌妯″瀷棰勬祴楂樹环鐨勮鍖轰笉浼氶殢鐫€ AveOccup 鐗瑰緛鐨勫彉鍖栬€屽彂鐢熷お澶у彉鍖栥€傝繖浜涙牱鏈彲浠ヨ繘涓€姝ョ殑杩涜鐮旂┒銆傚悓鏍疯绠?MedInc 鐗瑰緛鐨?ICE 鍥俱€俿hap.plots.partial_dependence( "MedInc", model.predict, X100, ice=True, model_expected_value=True, feature_expected_value=True)璇ユā鍨嬮伒寰殑瑙勫垯鏄細杈冮珮鐨?MedInc 琛ㄦ槑澶у鏁版牱鏈殑浠锋牸杈冮珮锛屼絾浠嶆湁涓€浜涗緥澶栨儏鍐靛€煎緱璋冩煡鐮旂┒銆傜幇鍦ㄦ垜浠彲浠ュ皾璇曟壘鍑?AveOccup銆丮edInc 鍜岃鍖轰环鏍间箣闂寸殑鍏崇郴銆傞鍏堝垱寤轰簡涓€涓暎鐐瑰浘锛屽叾涓?x 鏄?AveOccup锛寉 鏄?MedInc锛屾瘡涓牱鏈鑹蹭唬琛ㄥ潡缁勪环鏍笺€俻x.scatter(x=X["AveOccup"], y=X["MedInc"], color=y, labels={"x": "AveOccup", "y": "MedInc", "color": "price"}, range_x=(0, 10))鍏锋湁浣?AveOccup 鍜岄珮 MedInc 鐨勬牱鏈技涔庡叿鏈夋洿楂樼殑浠锋牸锛岃繖姝f槸鎴戜滑鐪嬪埌妯″瀷瀛﹀埌鐨勶紝杩欒褰掑姛浜庨儴鍒嗕緷璧栧拰涓綋鏉′欢鏈熸湜鍥俱€傜湅璧锋潵妯″瀷宸茬粡瀛︿細浜嗘湁鎰忎箟鐨勮鍒欚煓傛€荤粨鍦ㄦ湰鏂囦腑锛屾垜浠€氳繃涓€涓畝鍗曟嵁闆嗙殑鍥炲綊绀轰緥浜嗚В浜嗛儴鍒嗕緷璧栧浘 (PDP) 鍜屼釜浣撴潯浠舵湡鏈?(ICE) 鍥炬槸浠€涔堬紝浠ュ強濡備綍鍦?Python 涓埗浣滃畠浠€傚鏋滀綘瀵瑰彲瑙i噴鎬ф劅鍏磋叮閭d箞鍙互灏濊瘯瀵圭幇鏈夌殑椤圭洰浣跨敤閮ㄥ垎渚濊禆鍥惧苟鍒嗘瀽妯″瀷瀛︿範鍒扮殑瑙勫垯锛屾垨鑰呭彲浠ヤ娇鐢?LIME 鍜?SHAP 浜嗚В鏈夊叧鍙В閲?AI 鐨勬ā寮忋€俬ttps://www.overfit.cn/post/57737a1bb3dc4e9898cbef89a0929b81浣滆€咃細Fabio Chiusano
