如何缩放 SVM 分类的输入特征?

Posted

技术标签:

【中文标题】如何缩放 SVM 分类的输入特征?【英文标题】:How to scale input features for SVM classification? 【发布时间】:2015-12-09 04:23:44 【问题描述】:

我正在尝试在 MATLAB 中使用 SVM 执行两类分类。 'Normal' 和 'Infected' 两个类别分别用于将细胞图像分类为 Normal 或 Infected。

我使用由 1000 个正常细胞图像和 300 个感染细胞图像组成的训练集。我从每个单元格中提取了 72 个特征。所以我的训练特征集矩阵是 72x1300,其中每一行代表一个特征,每一列代表从相应图像测量的相应特征值。
data: 72x1300 double

我的类标签向量初始化为:

cellLabel(1:1000) = 'normal';
cellLabel(1001:1300) = 'infected';

正如这些链接中所暗示的: http://www.csie.ntu.edu.tw/~cjlin/papers/guide/guide.pdf 和 svm scaling input values,我开始这样做缩放特征值:

for i=1:1:size(data,1)
mu(i) = mean(data(:,i));
sd(i) = std(data(:,i));
scaledData(:,i) = (data(:,i) - mu(i))./sd(i);
end

为了进行测试,我读取了一张测试图像并计算了一个 72x1 的特征向量。在我分类之前,我使用来自“数据”的相应均值和标准差值来缩放测试向量,然后进行分类。如果我这样做,我将获得 0% 的训练准确度。 但是,如果我分别从每个类中缩放每个类并连接起来,我将获得 98% 的训练准确度。有人可以解释我的方法是否正确吗?为了训练的准确性,我知道我使用的是什么图像,因此读取了平均值和 SD 值。对于图像标签未知的情况,我应该怎么做?

这就是我的训练方式:

[idx,z] = rankfeatures(data,cellLabel,'Criterion','wilcoxon','NUMBER',7);
rnkData = data(idx,:);
rnkData = rnkData';
cellLabel = cellLabel';
SVMModel = fitcsvm(rnkData,cellLabel,'Standardize',true,'KernelFunction','RBF','KernelScale','auto');

您可以看到我尝试使用内置的缩放属性,但无论输入如何分类都倾向于显示“正常”类。

【问题讨论】:

在 MATLAB 中最新的 SVM 实现中,内置函数默认缩放输入 你能发布一个关于你如何进行培训的 sn-p 吗? 【参考方案1】:

对应的均值和标准差值

你这是什么意思? 你有平均和标准吗?开发。每个功能?为什么不使用实际的最小/最大比?

我不确定这在 Matlab 中实现有多可行,但在我的 OpenCV/SVM 代码中,我存储了每个特征的训练数据中的所有最小值/最大值,并使用这些最小值/最大值来缩放测试数据对应的特征。

如果测试数据的值经常超出训练数据的最小值/最大值范围,这强烈暗示训练数据量不足。 使用均值和标准。开发。值,您不会如此明确地检测到这一点。

【讨论】:

感谢@Heinitz 的回答。我发现通过在 fitcsvm 函数中指定一个选项:'Standardize',true 来实现类似的功能。

以上是关于如何缩放 SVM 分类的输入特征?的主要内容,如果未能解决你的问题,请参考以下文章

SVM 用于图像特征分类?

如何使用 SIFT 和 SVM 实现通用图像分类器

SVM 分类 - R 中的归一化

如何将两个特征/分类器组合成一个统一且更好的分类器?

在 CNN 提取特征之上使用 SVM - 如何进行多类分类?

如何存储 CNN 提取的特征来训练 SVM 分类器