【问题标题】:Different RMSE from cross_validate and iterating Kfolds与 cross_validate 和迭代 Kfolds 不同的 RMSE
【发布时间】:2020-03-19 11:03:00
【问题描述】:

我想编写自己的交叉验证函数,因为在这种情况下我不能使用 cross_validate。

如果我错了,请纠正我,但我的交叉验证代码是:

cv = cross_validate(elastic.est,X,y,cv=5,scoring='neg_mean_squared_error')

输出:

{'fit_time': array([3.90563273, 5.272861  , 2.19111824, 6.42427135, 5.62084389]),
 'score_time': array([0.05504966, 0.06105542, 0.0530467 , 0.06006551, 0.05603933]),
 'test_score': array([-0.00942235, -0.01220626, -0.01157624, -0.00998556, -0.01144867])}

所以我这样做是为了计算 RMSE。

math.sqrt(abs(cv["test_score"]).mean())

结果始终在 0.104

左右

然后我编写了下面的函数来循环 kFolds,我总是得到一个低得多的 RMSE 分数(它的运行速度大约快 10 倍)

def get_rmse(y_true,y_pred):    
    score = math.sqrt(((y_pred-y_true) ** 2).mean())
    return score

listval=[]

kf = KFold(n_splits=5,shuffle=True)

for train_index, test_index in kf.split(X,y):

    Xx = np.array(X)
    yy = np.array(y)

    X_train, X_test = Xx[train_index], Xx[test_index]
    y_train, y_test = yy[train_index], yy[test_index]

    elastic.est.fit(X_train,y_train)
    preds = elastic.est.predict(X_test)
    listval.append(get_rmse(y_test,preds))

np.mean(listval)

结果是 0.0729 并且总是落在这个值附近。

我错过了什么?相同的数据,相同的估算器,相同的折叠次数?

【问题讨论】:

  • 不确定它是否会起作用-不要使用 int 5 作为cross_validate 的 cv 参数,而是尝试发送 KFold 对象

标签: python scikit-learn cross-validation k-fold


【解决方案1】:

您观察到的差异来自于您以不同方式计算最终数字的事实:

  • 对于 cross_validate 输出,您首先要平均 MSE,然后取平方根。
  • 对于自定义实现,您首先获取根,然后才对折叠取平均值。

当然,在一般情况下,均值的根不等于根的均值。

【讨论】:

    猜你喜欢
    • 2018-08-14
    • 2012-05-09
    • 1970-01-01
    • 1970-01-01
    • 2020-09-18
    • 2017-03-18
    • 2016-03-22
    • 2017-09-30
    • 2018-07-10
    相关资源
    最近更新 更多