MATLAB中可以通过支持向量机递归特征消除(Support Vector Machine Recursive Feature Elimination :SVM-RFE)来获得SVM的特征重要性排序!!!

SVM-RFE算法是根据SVM在训练时生成的权向量w来构造排序系数,每次迭代去掉一个排序系数最小的特征属性,最终得到所有特征属性的递减顺序的排序。

经典的SVM-RFE采用的是线性核函数,推广到非线性情况,这里我们采用的是RBF核函数,此时采用的排序系数为:

svr特征重要性分析python代码_核函数

svr特征重要性分析python代码_svr特征重要性分析python代码_02

整体SVM-RFE(RBF核)算法过程如下:

svr特征重要性分析python代码_MATLAB_03

svr特征重要性分析python代码_MATLAB_04

在每一次循环中,具有最小排序系数的特征将被移除,然后SVM对剩余的特征重新训练以获取新的排序系数。SVM-RFE方法通过迭代执行这一过程,最后得到一个特征排序表,利用该排序列表,定义若干个嵌套的特征子集

svr特征重要性分析python代码_MATLAB_05

来训练SVM,并以SVM的预测正确率评估这些子集的优劣,从而获得最优的特征子集。需要注意的是,排在前面的那些特征,单个并不一定使得SVM分类器获得最好的分类性能,而是多个特征组合在一起,才使得分类器获得最优的分类性能,因此,SVM-RFE算法能选择出互补的特征组合。


在选择最佳特征子集的过程中,我们采用训练集留一交叉检验错误识别率(LooErrorRate)和独立测试集错误识别率(TestErrorRate)两个指标来综合判定最佳的特征子集。由于采用RBF核函数,这就涉及到参数的选取设定(惩罚因子c和RBF核函数参数 ),在SVM-RFE确定特征排序表过程和训练集留一交叉检验过程中,采用固定的参数组 ,在独立测试集识别过程中将使用网格寻参(grid search)的方法来进行参数寻优。整体确定最佳特征子集过程如下表所示:

svr特征重要性分析python代码_机器学_06

SVM-RFE 代码实现

function r = SVMRFE(label, data)
% SVM-RFE
% SVM Recursive Feature Elimination (SVM RFE)
% by liyang @BNU Math
% Email:patrick.lee@foxmail.com
% last modified 2010.09.18
%%
n = size(data,2);
s = 1:n;
r = [];
iter = 1;
while ~isempty(s)
%     if mod(iter, 10) == 0
%         str = ['===',num2str(iter),'==='];
%         disp(str);
%         disp('processing .....');
%     end
    X = data(:,s);
    
%     v = 3;
%     [bestCVaccuracy,bestc,bestg] = SVMcgForClass(label, X, ...
%         -8,8,-8,8,v,0.8,0.8,4.5);
%     cmd = ['-c ',num2str(bestc),' -g ',num2str(bestg)];
%     model = svmtrain(label, X, cmd);
    
    model = svmtrain(label, X);
    
    w = model.SVs' * model.sv_coef;
    c = w.^2;
    [c_minvalue, f] = min(c);
    r = [s(f),r];
    ind = [1:f-1, f+1:length(s)];
    s = s(ind);
    
    iter = iter + 1;
end