归一化或标准化后,线性回归给出较差的结果

时间:2019-01-12 15:31:26

标签: machine-learning scikit-learn linear-regression

我正在对此数据集执行线性回归: archive.ics.uci.edu/ml/datasets/online+news+popularity

它包含各种类型的功能-费率,二进制,数字等。

我曾尝试使用scikit-learn Normalizer,StandardScaler和PowerTransformer,但与不使用它们相比,所有结果都较差。

我这样使用它们:

from sklearn.preprocessing import StandardScaler
X = df.drop(columns=['url', 'shares'])
Y = df['shares']
transformer = StandardScaler().fit(X)
X_scaled = transformer.transform(X)
X_scaled = pd.DataFrame(X_scaled, columns=X.columns)
perform_linear_and_ridge_regression(X=X_scaled, Y=Y)

最后一行perform_linear_and_ridge_regression()上的函数肯定是正确的,并且正在使用GridSearchCV确定最佳超参数。

只需确保我也包含该功能:

def perform_linear_and_ridge_regression(X, Y):
    X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.25, random_state=10) 
    lin_reg_parameters = { 'fit_intercept': [True, False] }
    lin_reg = GridSearchCV(LinearRegression(), lin_reg_parameters, cv=5)
    lin_reg.fit(X=X_train, y=Y_train)
    Y_pred = lin_reg.predict(X_test)
    print('Linear regression MAE =', median_absolute_error(Y_test, Y_pred))

结果令人惊讶,因为它们都提供了更差的结果:

线性reg。根据原始数据:MAE = 1620.510555135375

线性reg。使用Normalizer后:MAE = 1979.8525218964242

线性reg。使用StandardScaler之后:MAE = 2915.024521207241

线性reg。使用PowerScaler之后:MAE = 1663.7148884463259

这只是特殊情况,标准化无济于事,还是我做错了事?

编辑:即使我忽略了二进制功能,大多数变压器也给出了较差的结果。

1 个答案:

答案 0 :(得分:1)

您的数据集具有许多分类和顺序特征。首先,您应该分开。另外,似乎您也将归一化应用于分类变量,这是完全错误的。

这里是nice-link,它说明了如何处理回归问题的分类特征。