首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >R与scikit中的交叉验证-学习线性回归R2

R与scikit中的交叉验证-学习线性回归R2
EN

Stack Overflow用户
提问于 2019-12-13 12:06:08
回答 1查看 261关注 0票数 2

我有一个简单的线性回归模型:

Y= Mean_energy,X=A+B

我的数据集只有23行。

因此,为了获得模型的训练R2,我进行了5次交叉验证(cv)。

Python中使用的模型是scikit的LinearRegression,而R中使用的是lm。

为了用python语言做cv,我使用了scikit-learn中的cross_validate函数,

cross_validate(model, X, Y, cv=5, scoring='r2')

为了在R中做cv,我使用了插入符号包

model <- train(Y ~ A + B ,data = df, method = "lm", trControl = train.control)

trControl=trainControl(method = "cv", number = 5)。然后使用model$resample检查cv R2。

与Python相比,R中的cv R2波动很大。请看下面的结果。知道为什么吗?谢谢。

注意:下面的R2不是测试分数,它是模型的训练R2。

在R中训练cv R2:

代码语言:javascript
运行
复制
Fold 1 = 0.6686680
Fold 2 = 0.3571826
Fold 3 = 0.8858084
Fold 4 = 0.7081766
Fold 5 = 0.3101449

用Python训练cv R2:

代码语言:javascript
运行
复制
Fold 1 = 0.29353287
Fold 2 = 0.24257606
Fold 3 = 0.38664367
Fold 4 = 0.26943862
Fold 5 = 0.24531835

仅供参考,对于R交叉验证,我参考https://quantdev.ssri.psu.edu/tutorials/cross-validation-tutorial

数据集:https://drive.google.com/file/d/1rLeJ9_myCboM4jzX0wZ9rSZ3s9aRpLTo/view?usp=sharing

代码语言:javascript
运行
复制
Y, A, B
12.48, 0.22, 0.33
5.32, 0.11, 0.22
13.71, 0.33, 0.44
27.48, 0.56, 0.44
3.87, 0.22, 0.56
3.88, 0.33, 0.11
37.90, 0.56, 0.11
10.62, 0.44, 0.22
41.71, 0.44, 0.44
1.96, 0.11, 0.33
25.14, 0.22, 0.33
2.25, 0.33, 0.33
9.73, 0.11, 0.22
8.67, 0.44, 0.33
3.80, 0.56, 0.33
35.90, 0.44, 0.33
3.43, 0.33, 0.11
6.68, 0.11, 0.56
13.54, 0.44, 0.44
8.04, 0.33, 0.22
6.41, 0.56, 0.11
31.67, 0.11, 0.67
70.59, 0.33, 0.56
EN

回答 1

Stack Overflow用户

发布于 2019-12-13 15:46:51

我不知道这是否有帮助,但python得分是正确的:

代码语言:javascript
运行
复制
import pandas as pd
d = {'Y': [12.48, 5.32, 13.71, 27.48, 3.87, 3.88, 37.90, 10.62, 41.71, 1.96, 25.14, 2.25, 9.73, 8.67, 3.80, 35.90, 3.43, 6.68, 13.54, 8.04, 6.41, 31.67, 70.59],
     'A': [0.22, 0.11,0.33,0.56,0.22, 0.33, 0.56, 0.44, 0.44, 0.11, 0.22, 0.33, 0.11, 0.44, 0.56, 0.44, 0.33, 0.11, 0.44, 0.33, 0.56, 0.11, 0.33],
     'B': [0.33, 0.22, 0.44, 0.44, 0.56, 0.11, 0.11, 0.22, 0.44, 0.33, 0.33, 0.33, 0.22, 0.33, 0.33, 0.33, 0.11, 0.56, 0.44, 0.22, 0.11, 0.67, 0.56]}
df = pd.DataFrame(data=d)
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import cross_validate
model = LinearRegression()
X = df[['A', 'B']]
Y = df[['Y']]
cross_validate(model, X, Y, cv=5, scoring='r2')

输出:

代码语言:javascript
运行
复制
{'fit_time': array([0.        , 0.        , 0.        , 0.        , 0.01559973]),
 'score_time': array([0.01559997, 0.        , 0.        , 0.        , 0.        ]),
 'test_score': array([-1.31785296,  0.02722109, -4.055718  , -0.07446545, -0.39258268]),
 'train_score': array([0.29353287, 0.24257606, 0.38664367, 0.26943862, 0.24531835])}

如果你看到测试分数,结果就更糟了。

我不知道R在做什么,但是如果你看到correlationdf.corr()

这也不是很好,如果你问我,R正在做一些过拟合,你看到训练分数了吗?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59315992

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档