python交叉验证和训练测试分离案例的评估指标值差异很大

python交叉验证和训练测试分离案例的评估指标值差异很大,python,Python,编写程序,使用支持向量回归SVR进行预测,首先将数据集拆分为训练数据集和测试数据集,测试数据集的比率为20%(案例1);其次,使用交叉验证,将数据集分为5组进行预测(案例2),但是,使用相同的评价指标(R2、MAE、MSE)对两种方法进行评价,结果相差很大 计划如下: dataset = pd.read_csv('Dataset/allGlassStraightThroughTube.csv') tube_par = dataset.iloc[:, 3:8].values tube_eff =

编写程序,使用支持向量回归SVR进行预测,首先将数据集拆分为训练数据集和测试数据集,测试数据集的比率为20%(案例1);其次,使用交叉验证,将数据集分为5组进行预测(案例2),但是,使用相同的评价指标(R2、MAE、MSE)对两种方法进行评价,结果相差很大
计划如下:

dataset = pd.read_csv('Dataset/allGlassStraightThroughTube.csv')
tube_par = dataset.iloc[:, 3:8].values
tube_eff = dataset.iloc[:, -1:].values


# # form train dataset , test dataset
tube_par_X_train, tube_par_X_test, tube_eff_Y_train, tube_eff_Y_test = train_test_split(tube_par, tube_eff, random_state=33, test_size=0.2)

# normalize the data
sc_X = StandardScaler()
sc_Y = StandardScaler()
sc_tube_par_X_train = sc_X.fit_transform(tube_par_X_train)
sc_tube_par_X_test = sc_X.transform(tube_par_X_test)
sc_tube_eff_Y_train = sc_Y.fit_transform(tube_eff_Y_train)
sc_tube_eff_Y_test = sc_Y.transform(tube_eff_Y_test)
# fit rbf SVR to the sc_tube_par_X dataset
support_vector_regressor = SVR(kernel='rbf')
support_vector_regressor.fit(sc_tube_par_X_train, sc_tube_eff_Y_train)
#
# # predict new result according to the sc_tube_par_X Dataset
pre_sc_tube_eff_Y_test = support_vector_regressor.predict(sc_tube_par_X_test)

pre_tube_eff_Y_test = sc_Y.inverse_transform(pre_sc_tube_eff_Y_test)

# calculate the predict quality
print('R2-score value rbf SVR')
print(r2_score(sc_Y.inverse_transform(sc_tube_eff_Y_test), sc_Y.inverse_transform(pre_sc_tube_eff_Y_test)))
print('The mean squared error of rbf SVR is')
print(mean_squared_error(sc_Y.inverse_transform(sc_tube_eff_Y_test), sc_Y.inverse_transform(pre_sc_tube_eff_Y_test)))
print('The mean absolute error of rbf SVR is')
print(mean_absolute_error(sc_Y.inverse_transform(sc_tube_eff_Y_test), sc_Y.inverse_transform(pre_sc_tube_eff_Y_test)))


# normalize
sc_tube_par_X = sc_X.fit_transform(tube_par)
sc_tube_eff_Y = sc_Y.fit_transform(tube_eff)

scoring = ['r2','neg_mean_squared_error', 'neg_mean_absolute_error']
rbf_svr_regressor = SVR(kernel='rbf')
scores = cross_validate(rbf_svr_regressor, sc_tube_par_X, sc_tube_eff_Y, cv=5, scoring=scoring, return_train_score=False)
在案例1中,评价指标输出为:

R2-score value rbf SVR
0.6486074476528559
The mean squared error of rbf SVR is
0.00013501023459497165
The mean absolute error of rbf SVR is
0.007196636233830076
R2-score
0.2621779727614816
test_neg_mean_squared_error
-0.6497292887710239
test_neg_mean_absolute_error
-0.5629408849740231
在案例2中,评估指数输出为:

R2-score value rbf SVR
0.6486074476528559
The mean squared error of rbf SVR is
0.00013501023459497165
The mean absolute error of rbf SVR is
0.007196636233830076
R2-score
0.2621779727614816
test_neg_mean_squared_error
-0.6497292887710239
test_neg_mean_absolute_error
-0.5629408849740231
案例1和案例2之间的差异很大,您能告诉我原因以及如何更正吗

我准备了一个小例子,看看使用交叉验证结果是如何变化的。我建议您尝试在没有种子的情况下分割数据,并查看结果如何变化

您将看到,交叉验证结果几乎是一个常数,与数据分割无关

从sklearn导入数据集
从sklearn.preprocessing导入StandardScaler
从sklearn.model\u选择导入列车测试\u分割、交叉验证
#从sklearn.cross\u验证导入序列测试\u分割
从sklearn.svm导入SVR
从sklearn.linear\u模型导入线性回归
从sklearn.metrics导入r2_分数、均方误差、均方绝对误差
将matplotlib.pyplot作为plt导入
def打印度量(真实、预测):
#计算预测质量
打印('R2分数值{:>8.4f}'。格式(R2分数(实际分数,预测分数)))
打印('均方误差为{:>8.4f}'。格式(均方误差(实际值,预测值)))
打印('平均绝对误差为{:>8.4f}\n\n'。格式(平均绝对误差(实际误差,预测误差)))
def显示图(真实、预测):
图,ax=plt.子批次()
ax.散射(真实、预测、边缘颜色=(0,0,0))
ax.plot([real_y.min(),real_y.max()],[real_y.min(),real_y.max()],“k--”,lw=4)
ax.设置标签(“测量”)
ax.set_ylabel(“预测”)
plt.show()
#数据集加载
boston=datasets.load_boston()
#数据集信息
#打印(boston.keys())
#打印(boston.DESCR)
#打印(boston.data.shape)
#打印(波士顿。功能名称)
#numpy_阵列
X=boston.data
Y=boston.target
##形成列车数据集、测试数据集
X_系列,X_测试,Y_系列,Y_测试=系列测试分割(X,Y,测试尺寸=0.2)
#X_序列,X_测试,Y_序列,Y_测试=序列测试分割(X,Y,随机状态=33,测试大小=0.2)
#X_序列,X_测试,Y_序列,Y_测试=序列测试分割(X,Y,随机状态=5,测试大小=0.2)
#适合定标器
sc_X=标准缩放器().fit(X_系列)
#标准化X(列车和试验)
X_列=sc_X.变换(X_列)
X_测试=sc_X.变换(X_测试)
######################################################################
###############################SVR##################################
######################################################################
支持向量回归器=SVR(kernel='rbf')
支持向量回归拟合(X列,Y列)
预测Y=支持向量回归。预测(X检验)
打印度量(预测、Y检验)
显示曲线图(预测曲线,Y曲线测试)
######################################################################
###########################线性回归器#########################
######################################################################
lin_模型=线性回归()
lin_模型拟合(X_系列、Y_系列)
预测Y=lin模型。预测(X检验)
打印度量(预测、Y检验)
显示曲线图(预测曲线,Y曲线测试)
######################################################################
#########################SVR+交叉验证#####################
######################################################################
sc=标准缩放器().fit(X)
标准化_X=sc.transform(X)
得分=['r2','neg_平均值平方误差','neg_平均值绝对误差']
rbf_svr_回归器=svr(kernel='rbf')
分数=交叉验证(rbf\u svr\u回归器,标准化的X,Y,cv=10,分数=分数,返回\u训练\u分数=假)
打印(分数[“测试r2”].mean())
打印(-1*(分数[“测试负均方误差”].mean())
打印(-1*(分数[“测试负平均值”]。平均值())