在sklearn中进行交叉验证时如何转换预测结果?

数据挖掘 Python scikit-学习 交叉验证
2022-03-08 13:25:42

我想像下面这样在 sklearn 中进行交叉验证,但是仍然需要对 X 的预测结果进行转换以减少与 y 的距离。如何通过添加自定义功能来做到这一点?

model = XGBRegressor(n_estimator = 500,
                     learn_rate = 0.05,
                     random_state = 0)

pipeline = Pipeline( steps = [('preprocessor', preprocessor),
                            ('model', model)
                            ])

scores = -1 * cross_val_score(pipeline, X, y,
                            cv = 3,
                            scoring = 'neg_mean_absolute_error',
                            verbose = 0)

y 中只有 0 和 1,所以我想在 X 的预测步骤之后对 X 的结果进行四舍五入并去掉小数。

将来我可能需要对 y 进行其他操作。例如,拟合正确的结果只包括像 0.5、1.5、2.5 ...

例子:

X - 输入

ID Column_1 Column_2 Column_3
0    'A'       10     True
1    'A'       20     False
2    'B'       30     True

y - 正确的结果

ID Result
0  1
1  0
2  1

当前输出

ID Result
0   0.899
1  -0.001
2   1.102

预期输出

ID Result
0    1
1    0
2    1

我已经在 Stack Overflow 上发布了这个问题,但也没有得到任何答案。

1个回答

如果您的目标值只是 0 和 1,您可能应该将其视为分类,并使用 egXGBClassifier而不是XGBRegressor.

您提出了(最初在您的 SO 帖子的评论中,现在已编辑到您的问题中)您的真实值可能限制为 0.5、1.5、2.5 的场景。这很不寻常,我怀疑最佳答案取决于上下文,但是:

  1. 考虑序数回归,它将目标值视为有序但非数字。

  2. 如果确实要以数字方式处理这些值,那么(我认为)您就只能手动进行操作,这与您的原始问题最接近。(我想再强调一次,这很奇怪,优化你的损失函数可能会做一些不直观的事情。)由于 sklearn 的预测将是 numpy 数组,所以可以尝试numpy.digitize

    注意:这对于后处理很有用,但不容易合并到模型拟合或管道中(因为 sklearn 的predict行为方式与 不同transform)。如果您真的需要在模型拟合中评分之前处理连续预测,我认为您只需要修改模型的代码即可;并且使用 xgboost,这将是一项艰巨的任务。