我有一个包含在scikit-learn管道中的逻辑回归模型,使用如下代码:
pipeline = make_pipeline( StandardScaler(), LogisticRegressionCV( solver='lbfgs', cv=10, scoring='roc_auc', class_weight='balanced' ))pipeline.fit(X_train, y_train)y_pred = pipeline.predict(X_test)
我可以使用以下代码查看模型对整体预测的系数…
# 查看模型的系数以了解哪些特征最为重要plt.rcParams['figure.dpi'] = 50model = pipeline.named_steps['logisticregressioncv']coefficients = pd.Series(model.coef_[0], X_train.columns)plt.figure(figsize=(10,12))coefficients.sort_values().plot.barh(color='grey');
这会返回一个特征及其系数的条形图。
我尝试做的是能够看到单个观测值的不同输入值如何影响其预测。想法是能够对样本群体运行预测,并检查“低”预测的群体…例如,如果我对10个观测值进行预测,我想看到不同的输入值如何单独影响这10个预测中的每一个。
回答:
回想起来,我可以通过Shap值实现这一点,使用类似于下面的代码(但使用LinearExplainer
而不是TreeExplainer
):
# 在管道之外实例化模型和编码器以便# 与shap一起使用model = RandomForestClassifier( random_state=25)# 在训练集上拟合,在验证集上评分model.fit(X_train_encoded, y_train2)y_pred_shap = model.predict(X_val_encoded)# 获取要解释的单个观测值row = X_test_encoded.iloc[[-3]]# 为什么模型会这样预测?# 查看Shapley值力图import shapexplainer = shap.TreeExplainer(model)shap_values = explainer.shap_values(row)shap.initjs()shap.force_plot( base_value=explainer.expected_value[1], shap_values=shap_values[1], features=row)