我正在参加一个Kaggle竞赛 (数据在这里),并且在使用scikit-learn的GradientBoostingRegressor时遇到了问题。这场竞赛使用根均方对数误差(RMLSE)来评估预测结果。
为了提供一个最小的工作示例(MWE),以下是我用于清理上述链接中train.csv
的代码:
为了展示一个有效的工作示例,如果我使用随机森林,则RMSLE可以正常计算:
这段代码运行得很好。然而,梯度提升回归器会抛出RuntimeWarning: invalid value encountered in log
,并且我从print
语句中得到一个nan
。查看三个RMSLE分数的数组,它们都是nan
。
我认为这是因为在某些地方得到了不该有的负值。Kaggle告诉我,当我上传我的预测结果时,也遇到了零或非负的RMSLE。我想知道为什么梯度提升不能用于这个问题?如果我使用mean_squared_error
作为评分器(mse_score = make_scorer(mean_squared_error, greater_is_better=False)
),它可以正常返回结果。
我肯定是忽略了关于梯度提升的简单问题;为什么这种评分方法对梯度提升回归器不起作用?
回答:
首先,make_scorer接受的函数语法应如下形式:
而不是
因此,您需要在代码中打印real
值以获得回归器的实际predicted
值。
只需按以下方式更改函数,它就应该能正确工作:
其次,您的回归器在第一个交叉验证集中的第399937行预测出了错误的值。希望这对您有帮助!祝您在比赛中好运。