Machine learning 标准化或标准化后,线性回归的结果更差

Machine learning 标准化或标准化后,线性回归的结果更差,machine-learning,scikit-learn,linear-regression,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(colu

我正在对此数据集执行线性回归: 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_和_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))
结果令人惊讶,因为它们都会带来更糟糕的结果:

线性调节。原始数据:MAE=1620.510555135375

线性调节。使用标准化器后:MAE=1979.8525218964242

线性调节。使用StandardScaler后:MAE=2915.024521207241

线性调节。使用PowerScaler后:MAE=1663.7148884463259

这只是一个特例,标准化没有帮助,还是我做错了什么


编辑:即使我不使用二进制特性,大多数转换器也会产生更糟糕的结果。

您的数据集有许多分类和顺序特性。你应该分别处理好第一个。此外,您似乎也在对分类变量应用规范化,这是完全错误的


这里解释了如何处理回归问题的分类特征。

除了URL之外,哪些特征是分类的,我已经从X数据集中排除了?分类数据放在一边,考虑标准化二进制值。您会得到非二进制值,比如0.42,这是没有意义的。有20多个功能需要转换。我保留了二进制值的方式,但仍然得到了更糟糕的结果。这是多类问题,请尝试在ligistic回归()中使用mult-class选项。小建议,在应用任何模型之前,请先浏览数据集。因为对数据的理解有助于你适应好的模型。我观察到了完全相同的问题。我确信我的数据也是分类的。