SVR - 归一化数据后 RMSE 更差

数据挖掘 scikit-学习 特征缩放 支持 rmse
2022-02-14 18:59:48

我正在使用自定义内核 SVR 构建模型,该模型查看我的数据框的一些功能并检查每对数据点之间的接近度/距离。对特征进行加权,并使用交叉验证计算权重。

最初我的数据框没有标准化,模型的结果不是很好(RMSE 高于目标范围的 25%)。因为我读过 SVR 对扩展是明智的,所以我决定尝试对数据进行标准化,这导致了更糟糕的“预测”。

均方根误差的原始结果如下:

RMSE (test_set):  6.59
RMSE (training_set):  6.56
RMSE (validation_set):  5.90

具有标准化数据的新结果如下:

RMSE (test_set):  2404.68
RMSE (training_set):  148.06
RMSE (validation_set):  2546.44

这些值远远超出了我的结果变量的正常范围。这让我怀疑我做错了什么。

笔记:

  1. 我在标准化后重新计算了内核的权重。
  2. 在将数据拆分为训练/测试/验证后,我对其进行了标准化。
  3. 我没有标准化 y(结果变量)向量。

为了规范化数据,我使用了以下代码:

from sklearn.preprocessing import StandardScaler
sc = StandardScaler()

def normalize(df):
    x = df.values
    df_scaled = sc.fit_transform(x)
    return pd.DataFrame(df_scaled, columns=df.columns)

X_train = normalize(X_train)
X_test = normalize(X_test)
X_validation = normalize(X_validation)

然后我使用这 3 个变量来训练和测试模型。

regressor = SVR(kernel=my_kernel)
regressor.fit(X_train, y_train)

关于我做错了什么的任何提示?谢谢。

1个回答

您在拆分为训练/测试/验证后对其进行了规范化,但您做错了。您需要对训练集进行归一化X_train_normalized = scaler.fit_transform(X_train),然后使用相同的统计数据对测试集和验证集进行归一化X_valid_normalized = scaler.transform(X_valid); X_test_normalized = scaler.transform(X_test)

如果你不这样做,你就会对不同的分布进行归一化(均值和方差不同)。因此,如果您要标准化为 z 分数,将每个特征值替换为与平均值的多少标准差,则模型在训练数据中看到的 1.0 值与验证中的 1.0 具有不同的原始值集和测试集。

所以正确的方法是计算训练集(的fit部分fit_transform)的统计数据,并假设验证集和测试集来自相同的分布(你只应该在训练时知道训练集)。然后在验证集和测试集上使用相同的统计数据,以确保您将苹果与苹果进行比较。