Matlab 支持向量机整理
工具包libsvm3.23
-
#iter为迭代次数,
nu 与前面的操作参数-n nu 相同,
obj为SVM文件转换为的二次规划求解得到的最小值,
rho 为判决函数的常数项b,
nSV 为支持向量个数,
nBSV为边界上的支持向量个数,
Total nSV为支持向量总个数。
-
libsvm使用误区
(1) 直接将训练集合和测试集合简单归一化到[0,1]区间,可能导致实验结果很差。
(2) 如果样本的特征数非常多,那么就不必使用RBF核将样本映射到高维空间。
a) 在特征数非常多的情况下,使用线性核,结果已经非常好,并且只需要选择参数C即可。
b) 虽然说RBF核的结果至少比线性核好,前提下搜索整个的空间。
(3) 样本数<<特征数的情况:推荐使用线性核,可以达到与RBF同样的性能。
(4) 样本数和特征数都非常多:推荐使用liblinear,更少的时间和内存,可比的准确率。
(5) 样本数>>特征数:如果想使用线性模型,可以使用liblinear,并且使用-s 2参数
数据处理
- mat
- excel
读取xlsx
首先,如果仅仅是需要处理其中数据,那么方法同1。
如果既要处理数据又要处理字符型变量的话,就经常用到下面两种格式:
[num,txt]=xlsread(‘filename’,‘sheet’,‘range’)
[num,txt,raw]=xlsread(‘filename’,‘sheet’,‘range’)
产生训练集测试集
选择核函数
- 线性核函数
- RBF核函数
- 多项式核函数
- Sigmoid核函数
创建模型
只有 training data 才可以用在 model 的训练过程中,test data 则必须在 model 完成之后才被用来评估 model 优劣的依据。 怎么将完整的 dataset 分为 training set 与 test set 也是学问,必须遵守两个要点:
1. training set 中样本数量必须够多,一般至少大于总样本数的 50%。
2. 两组子集必须从完整集合中均匀取样。
其中第 2 点特别重要,均匀取样的目的是希望减少 training/test set 与完整集合之间的偏差(bias),但却也不易做到。一般的作法是随机取样,当样本数量足够时,便可达到均匀取样的效果。然而随机也正是此作法的盲点,也是经常是可以在数据上做手脚的地方。举例来说,当辨识率不理想时,便重新取样一组training set 与 test set,直到 test set 的辨识率满意为止,但严格来说这样便算是作弊了。
Cross-validation 正是为了有效的估测 generalization error 所设计的实验方法,可以细分为 double cross-validation、k-fold cross-validation 与leave-one-out cross-validation。
-
Double cross-validation 也称 2-fold cross-validation(2-CV),作法是将 dataset
分成两个相等大小的 subsets,进行两回合的分类器训练。 在第一回合中,一个 subset 作为 training
set,另一个便作为 test set; 在第二回合中,则将 training set 与 test set
对换后,再次训练分类器,而其中我们比较关心的是两次 test sets 的辨识率。 不过在实务上 2-CV 并不常用,主要原因是
training set 样本数太少,通常不足以代表母体样本的分布,导致 test 阶段辨识率容易出现明显落差。此外,2-CV 中分
subset的变异度大,往往无法达到「实验过程必须可以被复制」的要求。
-
K-fold cross-validation (k-CV)则是 double cross-validation 的延伸,作法是将
dataset 切成 k 个大小相等的 subsets,每个 subset 皆分别作为一次 test set,其余样本则作为
training set,因此一次 k-CV 的实验共需要建立 k 个models,并计算 k 次 test sets
的平均辨识率。在实作上,k 要够大才能使各回合中的 training set 样本数够多,一般而言 k=10 算是相当足够了。
-
leave-one-out cross-validation (LOOCV),假设 dataset 中有 n 个样本,那 LOOCV也就是 n-CV,意思是每个样本单独作为一次 test set,剩余 n-1个样本则做为 training set,故一次 LOOCV共要建立 n 个 models。相较于前面介绍的 k-CV,LOOCV 有两个明显的优点: 每一回合中几乎所有的样本皆用于训练model,因此最接近母体样本的分布,估测所得的 generalization error比较可靠;实验过程中没有随机因素会影响实验数据,确保实验过程是可以被复制的。但 LOOCV 的缺点则是计算成本高,因为需要建立的models 数量与总样本数量相同,当总样本数量相当多时,LOOCV 在实作上便有困难,除非每次训练 model的速度很快,或是可以用平行化计算减少计算所需的时间。
在MATLAB中,用户可以使用cvpartition、repartition等命令对数据集进行拆分,完成交叉验证。
c = cvpartition(n,'KFold',k)
构造 cvpartition类的对象c , 定义 k 的随机非分层分区k-在n个观测值上折叠交叉验证。分区将观测结果划分为k不相交子样本 (或褶皱), 随机选择, 但大小大致相等。k的默认值为10.
c = cvpartition(n,'HoldOut',p)
创建一个随机的非分层分区, 以便在n进行保留验证。此分区将观测结果划分为训练集和测试集 (或保留集)。参数p必须是标量。
当0 < p<1时,cvpartition随机为测试集随机选择大约p*n。当p是整数时, cvpartition会随机选择测试集的p。p的默认值为1/10.
c = cvpartition(group,'KFold',k)
为分层k倍交叉验证创建一个随机分区。group是指示每个观察的类的字符向量的数字向量、分类数组、字符数组、字符串数组或单元格数组。每个子样本的大小和类比例大致相等, 与group中的大小和类比例大致相同.
当您将group作为cvpartition的第一个输入参数提供时, 该函数将创建交叉验证分区,
测试模型
|
请发表评论