gpt4 book ai didi

python - scitkit-learn.ensemble.GradientBoostingRegressor 的均方根对数平方误差问题

转载 作者:行者123 更新时间:2023-11-28 19:47:14 26 4
gpt4 key购买 nike

我正在参加 Kaggle 竞赛 (data here) ,我在使用 scikit-learn 的 GradientBoostingRegressor 时遇到了问题。比赛使用均方根误差 (RMLSE) 来评估预测。


为了 MWE,这里是我用来清理上面链接中的 train.csv 的代码:

import datetime
import pandas as pd

train = pd.read_csv("train.csv", index_col=0)

train.pickup_datetime = pd.to_datetime(train.pickup_datetime)
train["pickup_month"] = train.pickup_datetime.apply(lambda x: x.month)
train["pickup_day"] = train.pickup_datetime.apply(lambda x: x.day)
train["pickup_hour"] = train.pickup_datetime.apply(lambda x: x.hour)
train["pickup_minute"] = train.pickup_datetime.apply(lambda x: x.minute)
train["pickup_weekday"] = train.pickup_datetime.apply(lambda x: x.weekday())
train = train.drop(["pickup_datetime", "dropoff_datetime"], axis=1)
train["store_and_fwd_flag"] = pd.get_dummies(train.store_and_fwd_flag, drop_first=True)

X_train = train.drop("trip_duration", axis=1)
y_train = train.trip_duration

为了说明有效,如果我使用随机森林,则 RMSLE 计算得很好:

import numpy as np
from sklearn.ensemble import RandomForestRegressor, GradientBoostingRegressor
from sklearn.metrics import make_scorer
from sklearn.model_selection import cross_val_score


def rmsle(predicted, real):
sum=0.0
for x in range(len(predicted)):
p = np.log(predicted[x]+1)
r = np.log(real[x]+1)
sum = sum + (p - r)**2
return (sum/len(predicted))**0.5

rmsle_score = make_scorer(rmsle, greater_is_better=False)

rf = RandomForestRegressor(random_state=1839, n_jobs=-1, verbose=2)
rf_scores = cross_val_score(rf, X_train, y_train, cv=3, scoring=rmsle_score)
print(np.mean(rf_scores))

这运行得很好。 但是,梯度提升回归器抛出RuntimeWarning: invalid value encountered in log,我从print中得到一个nan > 声明。查看三个 RMSLE 分数的数组,它们都是 nan

gb = GradientBoostingRegressor(verbose=2)
gbr_scores = cross_val_score(gb, X_train, y_train, cv=3, scoring=rmsle_score)
print(np.mean(gbr_scores))

我认为这是因为我在某些不该出现的地方得到了负值。 Kaggle 告诉我它也遇到了零或非负 RMSLE,当我在那里上传我的预测以查看它是否与我的代码有关时。梯度提升不能用于这个问题有什么原因吗?如果我使用 mean_squared_error 作为记分器 (mse_score = make_scorer(mean_squared_error, greater_is_better=False)),它会很好地返回。

我确定我遗漏了一些关于梯度提升的简单知识;为什么这种评分方法适用于梯度提升回归器?

最佳答案

我建议你把这个矢量化

def rmsle(y, y0):
return np.sqrt(np.mean(np.square(np.log1p(y) - np.log1p(y0))))

可以在这里找到基准

https://www.kaggle.com/jpopham91/rmlse-vectorized

关于python - scitkit-learn.ensemble.GradientBoostingRegressor 的均方根对数平方误差问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46202223/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com