标准化后的 SVM 模型只分类为一类

数据挖掘 r 数据挖掘 支持向量机 正常化 数据分析
2022-02-26 02:43:38

我正在尝试在 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 使用阈值将样本分类为正常或肿瘤。从我上面显示的情况来看,它们的范围完全不同,是什么影响了它的决定?

这里有什么问题,我该如何解决,提前谢谢你。我很迷茫,需要每一个建议!

*编辑:正如您所见,训练集的值与测试集的值有完全不同的范围,我仍然可以使用训练集的均值和标准差来缩放测试集中的相应特征吗?

1个回答

我无法添加评论,所以我会在这里发布。

我的主要问题是,为什么您的测试集和训练集之间的特征值差异如此之大?

例如特征 1 的原始值。

训练集:所有值 > 20,看起来他们平均约为 35-40。
测试集:所有值都在 2 左右,看起来它们都在 2-3 之间。

这是什么原因。在执行训练测试拆分之前,您是否还对数据进行了洗牌?您应该为您的训练集和测试集绘制特征值的分布,并确保它们有些相似。

看起来你在训练集和测试集之间有一个糟糕的协变量转换。不要担心这个,因为我认为这是一个数据预处理问题。首先回答训练集和测试集之间每个特征的值分布是否相似的问题。