一.什么是维度?
在机器学习中,维度就是指的是特征数量,降维降的就是特征个数,去其无用的特征,保留有效特征,提升模型上限,毕竟数据不给力,再高级的算法都没什么鸟用。
二.方法
1.特征选择
(1).通过业务逻辑常识去自主选择,比如预测一个辆车的价格,那么就与买车的人是男是女没有多大关系(当然也可能出现是美女就降价打个折什么的,但我不想做讨论)。
(2).发现特征太多没办法通过业务逻辑去选,那就只有去用数学方面的工具去解决。
- 过滤法
考虑这样一个情况,一列数字全是一模一样的值,即这个特征对于预测目标来说,毫无意义,因为在这个特征上值是不带变化的,你都不带变化,我怎么能看出你是不是与我的预测目标相关呢?就像是舔狗一样,舔到最后一无所有,对方心里还毫无波动,那还舔个屁。可以用方差来描述这种波动,即是所带信息量,方差越大说明这个特征所带信息量越多,方差越小说明这个特征所带信息量越小。把方差小的进行过滤,就可以达到降维的目的。相关代码:
from sklearn.feature_selection import VarianceThreshold
select = VarianceThreshold()#不填任何值默认删除方差为0的特征
select.fit_transform(x)
到底填多少好呢,自己去利用学习曲线调参吧。
好了方差过滤完毕,但是你留下的这些特征,与我的目标到底相关不相关呢?比如你为你女票做了很多事,包含了大量的信息,可这并不妨碍她移情别恋(你所做的都是无用功)。一般常用三种方式:卡方,F检验,互信息
首先是卡方:卡方是计算每个非负特征和标签的统计量,并依照卡方统计量由高到低为特征排名。选取排名高的就可以再一次过滤。(分类问题用)卡方是先进行独立性假设 得到特征取值的无关理论值 再进行卡方计算 得到的结果再与卡方分布的临界值表进行对比 得相关性的概率大小 。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
SelectKBest(chi2,k=?).fit_transform(x,y)
k为超参数 利用学习曲线调参
其次是F检验,目的是用来捕捉每个特征与标签之间的线性关系的过滤方法。回归分类都可以用。和卡方一样:其原假设是数据不存在显著的线性关系,我们希望选取p值小于某值时的特征,这些特征与标签是显著线性相关的。
from sklearn.feature_selection import f_classif
F,pvalues_f = f_classif(x,y)
SelectKBest(f_classif,k=?).fit_transform(x,y)
最后是 互信息法
互信息法是用来捕捉每个特征与标签之间的任意关系(包括线性和非线性关系)的过滤方法。它分类回归都可以做。
from sklearn.feature_selection import mutual_info_classif as MIC
result = MIC(x,y)
SelectKBest(MIC,K=?).fit_transform(x,y)
互信息返回的是每个特征与目标的互信息量的估计,这个估计量在[0,1]之间取值,为0则表示两个变量独立,为1表示两个完全相关。
- 嵌入法
嵌入法是一种让算法决定自己使用哪些特征方法,即特征选择和算法训练同时进行。我们先使用某些机器学习算法和模型进行训练,得到各个特征的权值系数,根据权值选特征。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier as RFC
RFC_ = RFC(n_estimators=?,random_state=?)
X1 = SelectFromModel(RFC_,threshold=?).fit_transform(x,y)
threshold 阈值 小于阈值都要被删除
- 包装法
包装法使用一个目标函数作为黑盒来帮助我们选取特征,而不是输入某个评估指标。在初试特征集上训练评估器,并且通过coef_属性或通过feature_importances_属性获得每个特征的重要性。然后,从当前的一组特征修剪最不重要的特征。包装法是最能保证模型效果的特征选择方法。但是是算的最慢的算法。
from sklearn.feature_selection import RFE
RFC_ = RFC(n_estimators=?,random_state=0)
selector = RFE(RFC_,n_features_to_select=?,step=?).fit(x,y)
X_w = selector.transform(x)
RFE 递归特征消除法。它是一种贪婪的优化算法,旨在找到性能最佳的特征子集。它反复创建模型,并在每次迭代时保留最佳特征或剔除最差特征。
2. PCA
PCA是一种降维算法 与上面不同的是 它的降维类似压缩,从高维数据降到低维,并且信息损失较少。数学方面的内容不做阐述了 可以去自己翻阅资料。在sklearn PCA不是单纯的PCA 它是SVD与PCA的结合。SVD算出新特征向量空间V,V在乘上原特征向量,就达到了降维的效果。
from sklearn.decompositions import PCA
pca = PCA(n_components=?,svd_solver=?)#参数是降到几维或保留多少信息量,SVD四个参数“full","auto","arpack","randomized"
pca = pca.fit(x)
x1 = pca.transform(x)
full:SVD算出完整的结果
auto:自动选择 精准计算 还是采用randomized计算结果
randomized:生成多个随机向量,一一进行检测看是否符合分解需求,如果符合就用这个向量,不符合就继续试。
arpark:分解时就将特征数量降低到输入的数值K,可以加快运算速度,一般用于稀疏矩阵的时候。
参考资料:菜菜的sklearn课堂(B站可看视频)