【问题标题】:How to correctly use model explainer with unseen data?如何正确使用未见数据的模型解释器?
【发布时间】:2021-06-17 14:53:04
【问题描述】:

我使用管道训练了我的分类器:

param_tuning = {

        'classifier__learning_rate': [0.01, 0.1],
        'classifier__max_depth': [3, 5, 7, 10],
        'classifier__min_child_weight': [1, 3, 5],
        'classifier__subsample': [0.5, 0.7],
        'classifier__n_estimators' : [100, 200, 500],
    }

cat_pipe = Pipeline(
    [
        ('selector', ColumnSelector(categorical_features)),
        ('encoder', ce.one_hot.OneHotEncoder())
    ]
)

num_pipe = Pipeline(
    [
        ('selector', ColumnSelector(numeric_features)),
        ('scaler', StandardScaler())
    ]
)

preprocessor = FeatureUnion(
    transformer_list=[

        ('cat', cat_pipe),
        ('num', num_pipe)
    ]
)

xgb_pipe = Pipeline(
    steps=[
        ('preprocessor', preprocessor),
        ('classifier', xgb.XGBClassifier())
    ]
)

grid = GridSearchCV(xgb_pipe, param_tuning, cv=5, n_jobs=-1, scoring='accuracy')

xgb_model = grid.fit(X_train, y_train)

训练数据有分类数据,所以转换后的数据形状为(x , 100 )。之后,我尝试解释对看不见的数据的模型预测。由于我将单个未见过的示例直接传递给模型,因此它以(x, 15) 的形状对其进行了预处理(因为单个观察没有所有示例都包含所有分类数据)。

eli5.show_prediction(xgb['classifier'], xgb['preprocessor'].fit_transform(df), columns = xgb['classifier'].get_booster().feature_names))

我得到了

ValueError: Shape of passed values is (1, 15), indices imply (1, 100).

发生这种情况是因为模型是在形状为 (x, 100) 的整个预处理数据集上训练的,但我通过解释器使用形状 (1,15) 的单个观察。我如何正确地将看不见的单一观察传递给解释器?

【问题讨论】:

  • "单一观察没有所有的例子都是分类数据" - 它确实具有相同特征的要求是一个非常基本的要求,并且不能轻易绕过。如果额外的特征来自管道的预处理部分,那么对于看不见的数据也应该这样做。而且,不太清楚df 是什么,但我们从不对看不见的数据执行.fit_transform - 我们只使用.transform 和我们已经安装了训练数据的预处理器。
  • @desertnaut 谢谢你的回答。 df- 是一个看不见的数据示例。如果将其传递给管道进行转换 - 它返回 (1, 15) 形状

标签: python machine-learning scikit-learn eli5


【解决方案1】:

我们从不unseen数据上使用.fit_transform();正确的方法是使用已经适合您的训练数据的预处理器的.transform() 方法(此处为xgb['preprocessor'])。这样,我们确保(转换后的)未见数据与我们(转换后的)训练数据具有相同的特征,因此它们与使用后者构建的模型兼容。

所以,你应该在这里替换.fit_transform(df)

eli5.show_prediction(xgb['classifier'], xgb['preprocessor'].fit_transform(df), columns = xgb['classifier'].get_booster().feature_names))

.transform(df):

eli5.show_prediction(xgb['classifier'], xgb['preprocessor'].transform(df), columns = xgb['classifier'].get_booster().feature_names))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-16
    • 1970-01-01
    • 2017-03-10
    • 2017-10-05
    • 2019-06-27
    • 1970-01-01
    • 2020-01-14
    相关资源
    最近更新 更多