SVM 测试 - 测试数据的标准化 [重复]

Posted

技术标签:

【中文标题】SVM 测试 - 测试数据的标准化 [重复]【英文标题】:SVM testing - normalization of test data [duplicate] 【发布时间】:2022-01-20 07:29:16 【问题描述】:

我正在使用 SVM 模型对 5 个不同的类别进行分类。 (N1、N2、N3、W、R) 特征提取 -> 数据归一化 -> 训练 SVM 当我测试模型时(20%,80% 通常的 train-test-split),它显示出很高的准确率enter image description here

但是当我尝试使用全新的数据集进行测试时,使用相同的方法 特征提取 -> 数据归一化 -> 对训练有素的 SVM 模型进行测试 结果真的很糟糕。

假设训练中使用的原始数据集是 A,新的测试数据集是 B。 当我只用 A 训练模型并测试 B 时,结果非常糟糕。

首先我认为这是模型过度拟合,所以我加入了 A 和 B 来训练模型并用 B 进行测试。结果又很糟糕......

我认为问题在于规范化过程。当我尝试新的数据集 C 时,它最终奏效了,但这次我带来了训练 A 数据,连接 A+C 进行归一化,然后只从中删除 C 数据集。当我将它与单独归一化的数据 C 进行比较时,它是不同的..

我使用了 sklearn 的 MinMaxScaler。 我的意思是从数学上讲当然是不同的。因为每个数据集都有不同的最小值最大值,并且归一化的数据在与其他数据混合时会有所不同。

我的问题是,当您使用新数据集进行测试时,将训练数据集归一化然后仅取出测试数据部分是否正常?这就像将 A(112x12)、B(15x12) -> 归一化 (127x12) 混合在一起 -> 取出 (15x12)

或者我应该从修复特征提取和训练 SVM 的代码开始?

(我附上了代码,每个特征都有 12x1 的形状,这意味着每个阶段都有 12xN 矩阵。)

from sklearn import preprocessing
scaler = preprocessing.MinMaxScaler()

# Load training data
N1_train = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Train_N1_features")
N2_train = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Train_N2_features")
N3_train = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Train_N3_features")
W_train = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Train_W_features")
R_train = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Train_R_features")

# Load test data
N1_test = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Test_N1_features")
N2_test = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Test_N2_features")
N3_test = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Test_N3_features")
W_test = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Test_W_features")
R_test = pd.read_pickle("C:/Users/User/Desktop/EWHADATASETS/Features/Test_R_features")

# normalize with original raw features and take only test out
N1_scaled_test = features.normalize_together(N1_test, N1_train, "N1")
N2_scaled_test = features.normalize_together(N2_test, N2_train, "N2")
N3_scaled_test = features.normalize_together(N3_test, N3_train, "N3")
W_scaled_test = features.normalize_together(W_test, W_train, "W")
R_scaled_test = features.normalize_together(R_test, R_train, "R")

def normalize_together(test, raw, stage_no):
    together = pd.concat([test, raw], ignore_index=True)
    scaled_test = pd.DataFrame(scaler.fit_transform(together.iloc[:, :-1]))
    scaled_test['label'] = "".format(stage_no)
    scaled_test = scaled_test.iloc[0:test.shape[0], :]

    return scaled_test

【问题讨论】:

如在几个地方(例如@ 987654322@) - idownvotedbecau.se/noresearch 【参考方案1】:

测试数据在训练期间应保持看不见(包括预处理) - 不要同时使用测试数据和训练数据来计算常见的归一化因子。规范化训练集。另外,对测试集进行归一化。

为什么?使用 unseen 测试分区来评估您的训练模型至关重要。否则,您还没有测试模型的泛化能力 - 想象一下在玩纸牌游戏时,您已经事先了解了纸牌或牌组的顺序。

【讨论】:

以上是关于SVM 测试 - 测试数据的标准化 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

用于测试非线性 SVM 的数据集

为啥缩放训练和测试数据后我的 SVM 的性能会下降?

第八篇:支持向量机 (SVM)

未标记测试数据时如何运行 LIBSVM 的“svm-predict.exe”?

predict.svm 中的错误:测试数据与模型不匹配

基于MATLAB的SVM支持向量机的数据分类仿真,包括训练和测试