python - 与 cross_validate 和迭代 Kfolds 不同的 RMSE
问题描述
我想编写自己的交叉验证函数,因为在这种情况下我不能使用 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并且总是落在这个值附近。
我错过了什么?相同的数据,相同的估算器,相同的折叠数量?
解决方案
您观察到的差异来自以下事实,即您以不同方式计算最终数字:
- 对于
cross_validate
输出,您首先在折叠上平均 MSE,然后取平方根。 - 对于自定义实现,您首先取根,然后再取平均值。
当然,在一般情况下,均值的根不等于根的均值。
推荐阅读
- android - 如何在 Flutter 中使用 Twilio API 连接调用方和接收方
- python - 如何使用python用逗号替换文件中的字符和空格以提取到CSV
- reactjs - 没有测试文件,但 NextJs 仍然显示这个`测试时,导致 React 状态更新的代码应该被包装到 act(...) 中:`
- ios - SDAVAssetExportSession 不匹配提供的比特率与 4k 视频
- reactjs - 在 create-react-app (react-scripts v4) 中保留注释
- c - 将文件目录从一个函数发送到另一个函数
- embedded-resource - 在非规范化嵌入关系时如何不允许 IRI?
- angular - 延迟加载模块时生成错误
- reactjs - Firebase存储更改名称时无法移动/上传文件,反应js,redux
- javascript - cypress.io 参数化测试的问题