当直接从特征计算标签时,岭回归(sklearn)的 MSE/MAE 非常高

数据挖掘 scikit-学习 毫秒 岭回归
2021-09-18 14:04:23

编辑:根据要求删除TransformedTargetRegressor和添加更多信息。

Edit2:有 18K 行的关系不成立。对不起:(。删除这些行并根据@Ben Reiniger 的建议,我使用了LinearRegression,指标看起来更合理。新指标粘贴在下面。

原始问题:

鉴于totalRevenueand costOfRevenue,我试图预测grossProfit鉴于这是一个简单的公式totalRevenue - costOfRevenue = grossProfit,我期待下面的代码可以工作。是超参数优化的问题还是我错过了一些数据清理。我已经尝试了所有的缩放器和其他回归,sklearn但我没有看到任何大的区别。

# X(107002 rows × 2 columns)
+--------------+---------------+
| totalRevenue | costOfRevenue |
+--------------+---------------+
| 2.256510e+05 | 2.333100e+04  |
| 1.183960e+05 | 2.857000e+04  |
| 2.500000e+05 | 1.693000e+05  |
| 1.750000e+05 | 8.307500e+04  |
| 3.905000e+09 | 1.240000e+09  |
+--------------+---------------+

# y
+--------------+
| 2.023200e+05 |
| 8.982600e+04 |
| 8.070000e+04 |
| 9.192500e+04 |
| 2.665000e+09 |
+--------------+
Name: grossProfit, Length: 107002, dtype: float64

# Training


import numpy as np
import sklearn

from sklearn.compose import TransformedTargetRegressor
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import Ridge
from sklearn.model_selection import train_test_split
from sklearn.pipeline import Pipeline



X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=13)

x_scaler = StandardScaler()

pipe_l = Pipeline([
        ('scaler', x_scaler),
        ('regressor', Ridge())
        ])


regr = pipe_l

regr.fit(X_train, y_train)

y_pred = regr.predict(X_test)

print('R2 score: {0:.2f}'.format(sklearn.metrics.r2_score(y_test, y_pred)))
print('Mean Absolute Error:', sklearn.metrics.mean_absolute_error(y_test, y_pred))  
print('Mean Squared Error:', sklearn.metrics.mean_squared_error(y_test, y_pred))  
print('Root Mean Squared Error:', np.sqrt(sklearn.metrics.mean_squared_error(y_test, y_pred)))


print("Scaler Mean:",x_scaler.mean_)
print("Scaler Var:", x_scaler.var_)
print("Estimator Coefficient:",regr.steps[1][1].coef_)

训练后上述指标的输出(旧指标有 18k 行,未确认关系)

R2 score: 0.69
Mean Absolute Error: 37216342513.01034
Mean Squared Error: 7.601569571667974e+23
Root Mean Squared Error: 871869805169.7842
Scaler Mean: [1.26326695e+13 2.14785735e+14]
Scaler Var: [1.24609190e+31 2.04306993e+32]
Estimator Coefficient: [1.16354874e+15 2.59046205e+09]

Ridge(删除 18k 坏行后)


R2 score: 1.00
Mean Absolute Error: 15659273.260432156
Mean Squared Error: 8.539990125466045e+16
Root Mean Squared Error: 292232614.97420245
Scaler Mean: [1.57566809e+11 9.62274405e+10]
Scaler Var: [1.20924187e+25 5.95764210e+24]
Estimator Coefficient: [ 3.47663586e+12 -2.44005648e+12]

线性回归(删除 18K 行后)

R2 score: 1.00
Mean Absolute Error: 0.00017393178061611583
Mean Squared Error: 4.68109129068828e-06
Root Mean Squared Error: 0.0021635829752261132
Scaler Mean: [1.57566809e+11 9.62274405e+10]
Scaler Var: [1.20924187e+25 5.95764210e+24]
Estimator Coefficient: [ 3.47741552e+12 -2.44082816e+12]
2个回答

(将评论线程总结为答案)

您的原始分数:

Mean Absolute Error: 37216342513.01034
Root Mean Squared Error: 871869805169.7842

基于原始尺度目标变量并且介于 10101012,至少明显小于特征(和目标)的平均值?所以这些并不是自然而然的坏分数,尽管对于完美的关系,我们应该希望得到更好的结果。此外,0.69 R2 值非常低,不需要规模意识。

模型的两个系数都为正是最令人担忧的一点。我很高兴您确定了罪魁祸首行;我不知道我怎么会从这里诊断出来。

您的新岭回归仍然存在“大”错误,但比以前小得多,并且与特征/目标比例相比非常小。现在系数有不同的符号。(我认为如果你离开了TransformedTargetRegressor,你会得到大致相同的结果,但惩罚更少。)

最后,当这种确切的关系是事实时,不惩罚回归是有意义的。你这里的系数有点大,误差几乎没有下降,特别是考虑到目标的规模。

您似乎两次使用标准缩放器,一次在您的管道中,一次在TransformedTargetRegressor. 除此之外,您只是在安装缩放器,从不实际缩放输入(即转换输入)。