特征选择是机器学习和统计建模中的重要步骤,它涉及选择最相关、最有信息价值的特征,以提高模型性能、降低过拟合风险,并加速训练过程。以下是一些常见的特征选择方法:
(1)方差选择法
计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征作为筛选出来的特征。这里是针对于各个变量独立地进行方差计算,然后按照方差大小对特征进行降序排列,保留前几个方差较大的变量。
(2)随机森林特征重要度
随机森林由多个决策树构成。决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度或者信息增益,对于回归问题,通常采用的是方差或者最小二乘拟合。当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的值。这里相当于建立了一个随机森林模型,特征变量和因变量是共同参与模型训练的,然后按照特征重要性对特征(自变量)进行降序排列,保留前几个特征重要性较大的变量。
(3)XGBoost
XGBoost算法基于使用梯度提升算法,在提升树被创建后,可以相对直接地得到每个特征的重要性得分,特征重要性是通过对数据集中的每个特征进行计算,并进行排序得到。在单个决策书中通过每个特征分裂点改进性能度量的量来计算特征重要性,由节点负责加权和记录次数,即一个特征对分裂点改进性能度量越大(越靠近根节点),权值越大;被越多提升树所选择,特征越重要。这里相当于建立了一个xgboost模型,特征变量和因变量是共同参与模型训练的,然后按照特征重要性对特征(自变量)进行降序排列,保留前几个特征重要性较大的变量。
(4)相关系数法
相关系数法通过Pearson系数作为特征评分标准,相关系数绝对值越大,相关性越强。这里对每一个自变量和因变量进行Pearson相关性分析,然后按照Pearson系数对特征(自变量)进行降序排列,保留前几个相关系数较大的变量。
(5)互信息法
互信息(mutual information)是用来评价一个事件的出现对于另一个事件的出现所贡献的信息量,实际做单特征选择的时候,互信息通常把某个特征是否出现和分类是否正确这两个事件放在一起计算。把得分较高的特征进行保留。
(6)卡方检验法
卡方值越大,说明对原假设的偏离越大,为每个特征计算它与实际类别的卡方值,从大到小排序,取前k个特征。
(7)VIF法
方差膨胀系数(variance inflation factor,VIF)是衡量多元线性回归模型中复 (多重)共线性严重程度的一种度量。它表示回归系数估计量的方差与假设自变量间不线性相关时方差相比的比值。一般大于10则代表具有多重共线性。这里相当于对自变量和因变量建立回归分析,然后按照各个自变量的VIF值对特征(变量)进行升序,保留前几个VIF较小的值。
(8)递归消除特征法
递归特征消除的主要思想是反复的构建模型(如随机森林或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
在选择特征选择方法时,需要考虑数据集的特性、模型的类型以及问题的复杂性。通常,可以尝试不同的方法并根据交叉验证等技术选择最适合特定任务的方法。
邻里成分分析
邻里成分分析(Neighbourhood components analysis,Nca)是一种监督式学习的方法,根据一种给定的距离度量算法对样本数据进行度量,然后对多元变量数据进行分类。在功能上其和k近邻算法的目的相同,直接利用随机近邻的概念确定与测试样本临近的有标签的训练样本。
邻里成分分析是一种距离度量学习方法,其目的在于通过在训练集上学习得到一个线性空间转移矩阵,在新的转换空间中最大化平均留一(LOO)分类效果。该算法的关键是与空间转换矩阵相关的的一个正定矩阵A,该矩阵A可以通过定义A的一个可微的目标函数并利用迭代法(如共轭梯度法、共轭梯度下降法等)求解得到。该算法的好处之一是类别数K可以用一个函数f(确定标量常数)来定义。因此该算法可以用来解决模型选择的问题。MATLAB 提供了fscnca和fsrnca两个函数进行邻里成分分析。
fscnca函数
创建测试数据
- rng(0,'twister'); % For reproducibility
- N = 100;
- X = rand(N,20);
- y = -ones(N,1);
- y(X(:,3).*X(:,9)./X(:,15) < 0.4) = 1;
调用fscnca函数进行分类
mdl = fscnca(X,y,'Solver','sgd','Verbose',1);
绘制特征选择的权重数据,不相关特征的权重会非常接近于0
- figure()
- plot(mdl.FeatureWeights,'ro')
- grid on
- xlabel('Feature index')
- ylabel('Feature weight')
运行结果如下:
调节正则化参数
- clear
- load('twodimclassdata.mat');
- figure()
- gscatter(X(:,1),X(:,2),y)
- xlabel('x1')
- ylabel('x2')
添加100个不相关的特征
- n = size(X,1);
- rng('default')
- XwithBadFeatures = [X,randn(n,100)*sqrt(20)];
- XwithBadFeatures=(XwithBadFeatures-min(XwithBadFeatures))./range(XwithBadFeatures,1);
- X = XwithBadFeatures;
使用nca模型进行拟合
- ncaMdl = fscnca(X,y,'FitMethod','exact','Verbose',1,...
- 'Solver','lbfgs');
- % 'FitMethod','exact' 使用所有的数据进行拟合
- % 'Verbose',1 信息显示
- % 'Solver','lbfgs' 求解器的设置,'lbfgs' — Limited memory Broyden-Fletcher-Goldfarb-Shanno (LBFGS) algorithm
o Solver = LBFGS, HessianHistorySize = 15, LineSearchMethod = weakwolfe |====================================================================================================| | ITER | FUN VALUE | NORM GRAD | NORM STEP | CURV | GAMMA | ALPHA | ACCEPT | |====================================================================================================| | 0 | 9.519258e-03 | 1.494e-02 | 0.000e+00 | | 4.015e+01 | 0.000e+00 | YES | | 1 | -3.093574e-01 | 7.186e-03 | 4.018e