你的问题有几个问题...
首先,你犯了一个非常基本的错误:你think当您处于回归设置时,您使用准确性作为指标,并且下面使用的实际指标是均方误差 https://en.wikipedia.org/wiki/Mean_squared_error (MSE).
准确度是一个衡量标准分类,它与正确分类示例的百分比有关 - 检查维基百科 https://en.wikipedia.org/wiki/Precision_and_recall条目了解更多详细信息。
您选择的回归器(随机森林)内部使用的度量包含在您的详细输出中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,并且not 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
出于所有实际目的,这是零 - 您适合training设置几乎完美;为了确认,这里是(再次完美)您的 R 平方分数training set:
train_pred = regressor.predict(x_train)
r2_score(y_train , train_pred)
# 1.0
但是,一如既往,当您将模型应用到实际应用中时,关键时刻就会到来。test放;你的second这里的错误是,因为你用scaled训练你的回归器y_train
,你还应该缩放y_test
评估前:
y_test = sc_y.transform(y_test)
r2_score(y_test , y_pred)
# 0.9998476914664215
你会得到一个非常好的 R 平方test设置(接近 1)。
那么MSE呢?
from sklearn.metrics import mean_squared_error
mse_test = mean_squared_error(y_test, y_pred)
mse_test
# 0.00015230853357849051