Python 我的r平方分数为负值,但我使用k倍交叉验证的准确度分数约为92%

Python 我的r平方分数为负值,但我使用k倍交叉验证的准确度分数约为92%,python,machine-learning,scikit-learn,random-forest,Python,Machine Learning,Scikit Learn,Random Forest,对于下面的代码,我的r平方分数为负,但我使用k倍交叉验证的准确度分数为92%。这怎么可能?Im使用随机森林回归算法对一些数据进行预测。数据集的链接在下面的链接中给出: 将numpy导入为np 作为pd进口熊猫 从sklearn.preprocessing导入LabelEncoder,OneHotEncoder 数据集=pd.read\u csv(“HR\u逗号\u sep.csv”) x=dataset.iloc[:,:-1]。值##自变量 y=dataset.iloc[:,9]。值##因变量

对于下面的代码,我的r平方分数为负,但我使用k倍交叉验证的准确度分数为92%。这怎么可能?Im使用随机森林回归算法对一些数据进行预测。数据集的链接在下面的链接中给出:

将numpy导入为np
作为pd进口熊猫
从sklearn.preprocessing导入LabelEncoder,OneHotEncoder
数据集=pd.read\u csv(“HR\u逗号\u sep.csv”)
x=dataset.iloc[:,:-1]。值##自变量
y=dataset.iloc[:,9]。值##因变量
##对分类变量进行编码
le_x1=LabelEncoder()
x[:,7]=le_x1.fit_变换(x[:,7])
le_x2=标签编码()
x[:,8]=le_x1.fit_变换(x[:,8])
ohe=OneHotEncoder(分类特征=[7,8])
x=ohe.fit_变换(x).toarray()
##在训练和测试数据中拆分数据集
从sklearn.cross\u验证导入序列测试\u分割
y=pd.factorize(数据集['left'].values)[0]。重塑(-1,1)
x_序列,x_测试,y_序列,y_测试=序列测试分割(x,y,测试大小=0.2,随机状态=0)
从sklearn.preprocessing导入StandardScaler
sc_x=StandardScaler()
x_序列=sc_x.拟合变换(x_序列)
x_测试=sc_x.变换(x_测试)
sc_y=StandardScaler()
y_序列=sc_y.拟合变换(y_序列)
从sklearn.employ导入随机森林回归器
回归器=随机森林回归器(n_估计值=10,随机状态=0)
回归器拟合(x_列,y_列)
y_pred=回归预测(x_检验)
打印(y_pred)
从sklearn.metrics导入r2_分数
r2_分数(y_测试,y_预测)
从sklearn.model_选择导入交叉值_分数
准确度=交叉检验分数(估计器=回归器,X=X列,y=y列,cv=10)
准确度。平均值()
精度标准()

您的问题有几个问题

首先,您犯了一个非常基本的错误:您认为您使用的是精度作为度量,而您处于回归设置中,下面使用的实际度量是(MSE)

准确度是分类中使用的一个指标,它与正确分类的示例的百分比有关-查看条目了解更多详细信息

所选回归器(随机林)内部使用的度量包含在
回归器.fit(x\u列,y\u列)
命令的详细输出中-请注意
criteria='mse'
参数:

RandomForestRegressor(引导=True,标准=mse',最大深度=None,
max\u features='auto',max\u leaf\u nodes=None,
最小杂质分离=1e-07,最小样品叶=1,
最小样本分割=2,最小重量分数=0.0,
n_估计值=10,n_工作=1,oob_得分=False,随机_状态=0,
详细信息=0,热启动=False)
MSE是一个正的连续量,它的上限不是1,也就是说,如果你得到的值是0.92,这意味着。。。嗯,0.92,而不是92%

知道这一点后,最好明确将MSE作为交叉验证的评分函数:

cv\u mse=cross\u val\u得分(估计器=回归器,X=X\u序列,y=y\u序列,cv=10,得分为负均方误差)
cv_mse.平均值()
#-2.433430574463703e-28
实际上,这是零——你几乎完美地适应了训练集;为了确认,这里是您的训练集上的(再次完美)R平方分数:

train\u pred=回归器。预测(x\u train)
r2_分数(y_列车,列车前)
# 1.0
但是,和往常一样,当你在测试集上应用你的模型时,关键时刻就来了;您的第二个错误是,由于您使用缩放
y\u-train
来训练回归器,因此在评估之前,您还应该缩放
y\u-test

y_测试=sc_y.fit_变换(y_测试)
r2_分数(y_测试,y_预测)
# 0.9998476914664215
在测试集中得到一个非常好的R平方(接近1)

MSE呢

从sklearn.metrics导入均方误差
mse_检验=均方误差(y_检验,y_预测)
mse_检验
# 0.00015230853357849051