StandardScaler 与 Min-Max Scaler 的线性回归模型性能差异

Differences in Linear Regression Model Performance with StandardScaler vs. Min-Max Scaler

提问人:Mohan Pashte 提问时间:10/4/2023 最后编辑:Matt HallMohan Pashte 更新时间:10/4/2023 访问量:73

问:

我正在研究一个线性回归问题,我注意到在使用不同的缩放技术时模型性能存在显着差异:StandardScaler 和 Min-Max Scaler。我希望社区对此事有深刻的见解和意见。

import pandas as pd
from sklearn.preprocessing import LabelEncoder, MinMaxScaler
from sklearn import linear_model
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, r2_score

data = pd.read_csv("/content/weight.csv")

label_encoder = LabelEncoder()
data["Gender"] = label_encoder.fit_transform(data["Gender"])

category_mapping = {}
category_mapping["Gender"] = dict(zip(label_encoder.classes_, label_encoder.transform(label_encoder.classes_)))

inputs = data.drop("Weight", "columns")
output = data.drop(["Gender", "Height", "Index"], "columns")

scaler = MinMaxScaler()
inputs_scaled = scaler.fit_transform(inputs)

x_train, x_test, y_train, y_test = train_test_split(inputs_scaled, output, train_size=0.8)

model = linear_model.LinearRegression()
model.fit(x_train, y_train)

# Model application.
gen = int(input("Enter Gender : "))
hght = int(input("Enter Height : "))
indx = int(input("Enter index : "))

input_value = scaler.fit_transform([[gen, hght, indx]])
y_pred = model.predict(input_value)

r2 = r2_score(y_test, model.predict(x_test)) * 100

我遇到了一个有趣的线性回归问题。当我使用 StandardScaler 缩放输入要素时,模型预测似乎更准确,但 R 平方 (R2) 分数较低。另一方面,当我使用 MinMaxScaler 时,R2 分数更高,但预测似乎不太准确。

我想了解这种差异背后的潜在原因,并收集关于哪种缩放技术在这种情况下更合适的意见。此外,如果我能采取任何步骤来使用任何一种缩放技术来提高模型性能,我将不胜感激。

我已经尝试了这两种技术,但问题仍然存在。

我的程序的预期输出将是 [平均正确预测(不准确)],以及良好的 r2 分数。

Python 机器学习 scikit-learn 线性回归 缩放

评论


答:

1赞 Luca Citi 10/4/2023 #1

您看到两个缩放器之间差异的一个可能来源是代码中的错误:您不应该使用测试数据 (),而应该只使用基于训练数据训练的测试数据。对于两个缩放器,此误差对预测的影响可能不同,这可能解释了不同的结果。fit_transforminput_valuetransformscaler

对于线性回归(当没有应用正则化时,就像 sk-learn 的情况一样),特征的缩放应该对预测没有影响。当数据具有非常大或极小的范围时,建议进行缩放,这纯粹是出于纯粹的计算原因(因为特征的不良缩放可能会导致需要求解的线性系统条件数较大)。LinearRegression

请参阅下面的示例,该示例将 no scaling 与 和 进行比较。虽然三种情况下的拟合系数不同,但同一输入的预测值是相同的。(注意:如果换成,将看到三个预测变量给出不同的结果)。MinMaxScalerStandardScalertransformfit_transform

import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import StandardScaler, MinMaxScaler

X = np.array([[1, 1], [1, 2], [2, 2], [2, 3]])
# y = 1 * x_0 + 2 * x_1 + 3
y = np.dot(X, np.array([1, 2])) + 3
reg = LinearRegression().fit(X, y)
print('No scaling')
print('intercept', reg.intercept_, 'coef', reg.coef_)
print('prediction', reg.predict(np.array([[3, 5]])))

scaler = MinMaxScaler()
X_ = scaler.fit_transform(X)
reg = LinearRegression().fit(X_, y)
print('MinMaxScaler')
print('intercept', reg.intercept_, 'coef', reg.coef_)
print('prediction', reg.predict(scaler.transform(np.array([[3, 5]]))))

scaler = StandardScaler()
X_ = scaler.fit_transform(X)
reg = LinearRegression().fit(X_, y)
print('StandardScaler')
print('intercept', reg.intercept_, 'coef', reg.coef_)
print('prediction', reg.predict(scaler.transform(np.array([[3, 5]]))))


### gives
No scaling
intercept 3.0000000000000018 coef [1. 2.]
prediction [16.]
MinMaxScaler
intercept 6.000000000000002 coef [1. 4.]
prediction [16.]
StandardScaler
intercept 8.5 coef [0.5        1.41421356]
prediction [16.]

另请注意,您不应该在应用之前重新缩放数据,而应该在应用之后,通过对训练数据和 ing 测试数据进行调整,train_test_splitfit_transformtransform