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

标签 python machine-learning scikit-learn random-forest

对于下面的代码,我的 r 平方分数为负,但使用 k 折交叉验证的准确度分数为 92%。这怎么可能?我使用随机森林回归算法来预测一些数据。数据集的链接在下面的链接中给出: https://www.kaggle.com/ludobenistant/hr-analytics

import numpy as np
import pandas as pd
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

dataset = pd.read_csv("HR_comma_sep.csv")
x = dataset.iloc[:,:-1].values   ##Independent variable
y = dataset.iloc[:,9].values     ##Dependent variable

##Encoding the categorical variables

le_x1 = LabelEncoder()
x[:,7] = le_x1.fit_transform(x[:,7])
le_x2 = LabelEncoder()
x[:,8] = le_x1.fit_transform(x[:,8])
ohe = OneHotEncoder(categorical_features = [7,8])
x = ohe.fit_transform(x).toarray()


##splitting the dataset in training and testing data

from sklearn.cross_validation import train_test_split
y = pd.factorize(dataset['left'].values)[0].reshape(-1, 1)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2, random_state = 0)

from sklearn.preprocessing import StandardScaler
sc_x = StandardScaler()
x_train = sc_x.fit_transform(x_train)
x_test = sc_x.transform(x_test)
sc_y = StandardScaler()
y_train = sc_y.fit_transform(y_train)

from sklearn.ensemble import RandomForestRegressor
regressor = RandomForestRegressor(n_estimators = 10, random_state = 0)
regressor.fit(x_train, y_train)

y_pred = regressor.predict(x_test)
print(y_pred)
from sklearn.metrics import r2_score
r2_score(y_test , y_pred)

from sklearn.model_selection import cross_val_score
accuracies = cross_val_score(estimator = regressor, X = x_train, y = y_train, cv = 10)
accuracies.mean()
accuracies.std()

最佳答案

您的问题有几个问题...

对于初学者来说,您犯了一个非常基本的错误:您认为您正在使用准确性作为指标,而您处于回归设置中,并且下面使用的实际指标是 mean squared error (MSE)。

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

您选择的回归器(随机森林)内部使用的指标包含在 regressor.fit(x_train, y_train) 命令的详细输出中 - 请注意 criterion='mse' 参数:

RandomForestRegressor(bootstrap=True, criterion='mse', max_depth=None,
           max_features='auto', max_leaf_nodes=None,
           min_impurity_split=1e-07, min_samples_leaf=1,
           min_samples_split=2, min_weight_fraction_leaf=0.0,
           n_estimators=10, n_jobs=1, oob_score=False, random_state=0,
           verbose=0, warm_start=False)

MSE 是一个正连续量,并且上限不为 1,即,如果您得到的值为 0.92,这意味着……嗯,0.92,而不是 92%。

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

cv_mse = cross_val_score(estimator = regressor, X = x_train, y = y_train, cv = 10, scoring='neg_mean_squared_error')
cv_mse.mean()
# -2.433430574463703e-28

对于所有实际目的,该值为零 - 您几乎完美地适应训练集;为了确认,这里是您的训练集的(再次完美)R 平方分数:

train_pred = regressor.predict(x_train)
r2_score(y_train , train_pred)
# 1.0

但是,一如既往,当您将模型应用于测试集时,关键时刻就会到来;这里您的第二个错误是,由于您使用缩放的y_train来训练回归器,因此您还应该在评估之前缩放y_test:

y_test = sc_y.transform(y_test)
r2_score(y_test , y_pred)
# 0.9998476914664215

并且您在测试集中得到了非常好的 R 平方(接近 1)。

MSE 怎么样?

from sklearn.metrics import mean_squared_error
mse_test = mean_squared_error(y_test, y_pred)
mse_test
# 0.00015230853357849051

关于python - 我的 R 平方分数为负,但使用 k 倍交叉验证的准确度分数约为 92%,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46864926/

相关文章:

Python:使用自定义格式读取 CSV 并写入文件

python - 如何为时间序列制作自定义 sklearn 转换器?

python - 找不到 sklearn.model_selection 模块

python - GridSearchCV 将为此运行多少种组合?

python - 为什么我在 Python 'cannot import name NoneType' 中收到错误消息?

python - 正则表达式用于匹配不具有相同单词出现在另一个关键字之前的关键字

python - 在 Python egg sdist 安装目录中安装静态文件

python - 在keras中实现自定义目标函数

machine-learning - 如何使用 nngraph 访问中间层的输出?

MATLAB:协方差矩阵的行列式是 0 或 inf