通過生成項(xiàng)目的獨(dú)立 HTML 報(bào)告,為模型的可審計(jì)性做出貢獻(xiàn)
https://github.com/MAIF/shapash?tab=readme-ov-file
import xgboost as xgb
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.model_selection import GridSearchCV, StratifiedKFold, train_test_split
# 加載鳶尾花數(shù)據(jù)集
iris = load_iris()
X = iris.data
y = iris.target
# 將X和y保存為一個(gè)DataFrame
data = pd.DataFrame(data=X, columns=iris.feature_names)
data['target'] = y
# 劃分?jǐn)?shù)據(jù)集為訓(xùn)練集和測試集
X_train, X_test, y_train, y_test = train_test_split(data.drop(['target'], axis=1),
data['target'],
test_size=0.2, random_state=42, stratify=data['target'])
model = xgb.XGBClassifier()
# 定義XGBoost的參數(shù)網(wǎng)格
param_grid = {
'learning_rate': [0.01, 0.1, 0.2], # 學(xué)習(xí)率,控制每個(gè)弱學(xué)習(xí)器的權(quán)重縮減,用于防止過擬合
'max_depth': [3, 4, 5], # 每棵樹的最大深度,控制樹的復(fù)雜性
'n_estimators': [50, 100, 200], # 弱學(xué)習(xí)器的數(shù)量,即樹的數(shù)量
'subsample': [0.8, 0.9, 1.0], # 每棵樹用于訓(xùn)練的子樣本的比例
'colsample_bytree': [0.8, 0.9, 1.0], # 每棵樹用于訓(xùn)練的特征的比例
'reg_alpha': [0, 0.1, 0.5], # L1正則化的參數(shù),控制模型復(fù)雜性
'reg_lambda': [0, 0.1, 0.5], # L2正則化的參數(shù),控制模型復(fù)雜性
}
strkfold = StratifiedKFold(n_splits=3, shuffle=True, random_state=42)
gscv = GridSearchCV(model, param_grid, cv=strkfold, n_jobs=-1, scoring=['accuracy', 'roc_auc_ovr_weighted'], refit='accuracy')
# 在訓(xùn)練數(shù)據(jù)上進(jìn)行網(wǎng)格搜索和交叉驗(yàn)證,找到最佳模型
gscv.fit(X_train, y_train)
# 在測試數(shù)據(jù)上評(píng)估最佳模型的性能
score_best_estimator = gscv.score(X_test, y_test)
# 打印最佳模型的交叉驗(yàn)證最高得分、最佳超參數(shù)組合和測試數(shù)據(jù)上的準(zhǔn)確性
print('最高得分為:{:.3f}'.format(gscv.best_score_))
print('最佳超參數(shù)組合為:{}'.format(gscv.best_params_))
print('最佳模型在測試數(shù)據(jù)上的準(zhǔn)確性為:{:.3f}'.format(score_best_estimator))
# 將 GridSearchCV 的結(jié)果轉(zhuǎn)為 DataFrame 方便查看
df = pd.DataFrame(gscv.cv_results_)
df
利用GridSearchCV和XGBoost來調(diào)整模型參數(shù),以獲得在測試數(shù)據(jù)上表現(xiàn)最佳的分類器,詳細(xì)調(diào)整模型參數(shù)方法參考文章尾所給出的往期文章鏈接
model = xgb.XGBClassifier(
colsample_bytree=0.8,
learning_rate=0.01,
max_depth=3,
n_estimators=100,
reg_alpha=0,
reg_lambda=0,
subsample=0.8
)
# 使用訓(xùn)練數(shù)據(jù)擬合模型
model.fit(X_train, y_train)
# 使用擬合好的模型對(duì)測試數(shù)據(jù)進(jìn)行預(yù)測
y_pred = model.predict(X_test)
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred)) # 輸出模型完整評(píng)價(jià)指標(biāo)
from shapash import SmartExplainer
import warnings
# 忽略警告
warnings.filterwarnings("ignore")
# 將 y_pred 轉(zhuǎn)換為 Pandas Series 并設(shè)置索引
y_pred_series = pd.Series(y_pred, name="y_pred", index=X_test.index) # 參數(shù)接受 Pandas 數(shù)據(jù)框 (DataFrame)
# 創(chuàng)建 SmartExplainer 對(duì)象
xpl = SmartExplainer(model)
# 編譯數(shù)據(jù)集,指定 x(特征)、y_pred(預(yù)測值)、y_target(真實(shí)值)等參數(shù)
xpl.compile(
x=X_test,
y_pred=y_pred_series, # 可選參數(shù):自定義預(yù)測值(默認(rèn)使用 model.predict)
y_target=y_test, # 可選參數(shù):允許顯示真實(shí)值與預(yù)測值的對(duì)比
)
# 啟動(dòng) Web 應(yīng)用
app = xpl.run_app()
箭頭所指處會(huì)顯示所生成的模型解釋鏈接點(diǎn)擊后如下圖
如圖紅色箭頭可以選擇需要解釋的數(shù)據(jù)類別,藍(lán)色箭頭為在該類別下的特征貢獻(xiàn)度,粉色箭頭為數(shù)據(jù)集,這里的數(shù)據(jù)集也就是模型的測試集,其中包含模型的預(yù)測結(jié)果,其中True Values Vs Predicted Values會(huì)顯示該類別下的預(yù)測散點(diǎn)圖,如下圖
這里顯示的就是類別1類的預(yù)測結(jié)果散點(diǎn)圖,從圖中可以發(fā)現(xiàn)有一個(gè)數(shù)據(jù)點(diǎn)預(yù)測錯(cuò)誤,實(shí)際類別為1預(yù)測錯(cuò)誤為2
藍(lán)色箭頭為各個(gè)數(shù)據(jù)在petal width (cm)、類別1下的預(yù)測結(jié)果、索引以及petal width (cm)對(duì)于模型預(yù)測輸出的影響程度,紅色箭頭下可視化為指定索引數(shù)據(jù)在類別1下每個(gè)特征的貢獻(xiàn)以及預(yù)測為該類別的概率,最后的粉色箭頭可以指定需要探討數(shù)據(jù)ID以便在紅色箭頭下輸出
如圖通過調(diào)整輸出了索引為77數(shù)據(jù)點(diǎn)的模型解釋,預(yù)測結(jié)果為2,實(shí)際類別為1,通過Shapash的模型解釋工具,能夠更深入地理解模型在特定數(shù)據(jù)點(diǎn)上的行為,識(shí)別潛在的預(yù)測錯(cuò)誤原因,從而改進(jìn)模型的性能或者對(duì)模型的預(yù)測結(jié)果提出進(jìn)一步的疑問,這對(duì)于調(diào)整和優(yōu)化機(jī)器學(xué)習(xí)模型具有很大的幫助,更多Shapash庫使用技巧參考前文給出的GitHub鏈接
本文章轉(zhuǎn)載微信公眾號(hào)@Python機(jī)器學(xué)習(xí)AI
對(duì)比大模型API的內(nèi)容創(chuàng)意新穎性、情感共鳴力、商業(yè)轉(zhuǎn)化潛力
一鍵對(duì)比試用API 限時(shí)免費(fèi)