2 回答

TA貢獻1848條經驗 獲得超2個贊
首先,你提到在回歸分類中預測新基因的疾病評分,你是什么意思?輸出似乎是二進制的,0或1,因此這是一個二進制分類問題。您應該改用xgboost's 分類器。更新:讓我們根據評論假設一個回歸問題來模擬您的情況。盡管對于下面的示例,我們應該設置'objective':'multi:softmax'為輸出實際標簽。
根據您的問題,您似乎要做的就是在那些未正確預測的樣本上索引測試集,并分析誤導性的特征,這具有一定的意義。
讓我們用一些示例數據集重現您的問題:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import shap
import xgboost
X,y = shap.datasets.iris()
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
model = xgboost.train(params={"learning_rate": 0.01},
dtrain=xgboost.DMatrix(X_train, label=y_train),
num_boost_round =100)
使用整個測試集的 SHAP 圖非常簡單。舉個force_plot例子:
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X_test)
shap.initjs()
shap.force_plot(explainer.expected_value, shap_values, X_test)
現在,如果我們想對錯誤分類的樣本執行相同的操作,我們需要查看輸出概率。由于 iris 數據集有多個類,假設我們想要可視化force_plot那些應該分類為 的樣本2,但我們有一個輸出值如下1.7:
y_pred = model.predict(xgboost.DMatrix(X_test))
m = (y_pred <= 1.7) & (y_test == 2)
現在我們使用掩碼對集合執行布爾索引X_test,并更新shap_values:
shap.initjs()
c= explainer.shap_values(X_test[m])
shap.force_plot(explainer.expected_value, shap_values, X_test[m])
這告訴我們,花瓣的長度和寬度主要將回歸推向更高的值。因此,它們可能是在錯誤分類中發揮主要作用的變量。
同樣,對于一個decision_plot:
shap.decision_plot(explainer.expected_value, shap_values,
X_test[m], feature_order='hclust',
return_objects=True)

TA貢獻1820條經驗 獲得超10個贊
由于我沒有您的數據集,因此無法檢查代碼,但這里的一些想法可能會為您指明方向。
看來你沒有訓練你的回歸者。應該是像線一樣
xgbr = xgboost.XGBRegressor()
xgbr.train(X, Y)
現在你可以使用了xgbr.predict(X);)
您還需要培訓解釋員:
explainer = shap.TreeExplainer(xgbr)
with warnings.catch_warnings():
warnings.simplefilter("ignore")
sh = explainer.shap_values(X)
現在您可以選擇值:
misclassified = (y_pred <= 0.7) & (Y == 1)
shap.decision_plot(expected_value, sh, features_display, link='logit', highlight=misclassified)
在使用之前,shap我建議您檢查回歸器對數據的擬合程度。因此,為此我建議您將部分數據用于測試,而不是在訓練中使用它。然后,您可以通過計算和比較測試集和訓練集的 MSE 來評估擬合優度。差異越大,預測器的表現就越差。
添加回答
舉報