我正在尝试在 R(e1071 包)中使用 SVM 将样本分类为正常或肿瘤。我有两个独立的数据集 - 训练(约 50 个样本,100 个特征)和测试(约 60 个样本)。这些数据集是来自两个不同研究组执行的两个不同微阵列平台的微阵列表达值,因此它们的值范围非常不同。我是 SVM 和 R 的新手,所以一开始,我对我的训练集进行了 Z-score 标准化,然后分别对我的测试集进行了 Z-score 标准化。IE
(x_Train - mean_Train) / (stdev_Train)
(x_Test - mean_Test) / (stdev_Test)
当我探索有关此主题的更多论坛帖子时,我发现建议在我的测试集上使用训练集的参数
(x_Test - mean_Train) / (stdev_Train)
这样我的 SVM 模型更具有泛化性,可以应用于新样本。
问题来了,
当我分别对集合进行标准化时,我最好的模型(在使用 tune 函数进行 10 倍交叉验证后)对测试集进行分类的准确率约为 75%。然而,在按照我的训练参数的建议进行标准化后,我的模型对测试集进行分类的准确度急剧下降到 25%,使用相同的特征。
我尝试使用不同的特征组合来查看它是否有所不同,我发现无论我做了什么改变,测试集中的所有样本都被归为一类(全部正常,肿瘤为零),而我之前的具有单独标准化的模型将样本分为两类。
这是其中一项功能的示例
Training set (raw)
Feature 1
Sample 1 25.82977
Sample 2 42.62437
Sample 3 28.91158
Sample 4 53.5708
Sample 5 30.92296
Sample 6 99.16994
Sample 7 40.75973
Test set (raw)
Feature 1
Sample 1 2.885865028
Sample 2 2.572860413
Sample 3 2.809136715
Sample 4 2.259630716
Sample 5 2.797155715
Sample 6 2.439700763
Sample 7 2.197087754
Training set (standardized)
Feature 1
Sample 1 -0.795137358
Sample 2 -0.132081654
Sample 3 -0.673466601
Sample 4 0.300086594
Sample 5 -0.594056732
Sample 6 2.100353934
Sample 7 -0.205698184
Test set (standardized)
Feature 1
Sample 1 -1.700969415
Sample 2 -1.713326928
Sample 3 -1.703998671
Sample 4 -1.725693328
Sample 5 -1.704471684
Sample 6 -1.71858411
Sample 7 -1.728162542
我知道 SVM 使用阈值将样本分类为正常或肿瘤。从我上面显示的情况来看,它们的范围完全不同,是什么影响了它的决定?
这里有什么问题,我该如何解决,提前谢谢你。我很迷茫,需要每一个建议!
*编辑:正如您所见,训练集的值与测试集的值有完全不同的范围,我仍然可以使用训练集的均值和标准差来缩放测试集中的相应特征吗?