特征选择(2):特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数

转载:https://www.cnblogs.com/jasonfreak/p/5448385.html
https://blog.csdn.net/daxiaofan/article/details/53118259
特征选择主要从两个方面入手:

  1. 特征是否发散:特征发散说明特征的方差大,能够根据取值的差异化度量目标信息.
  2. 特征与目标相关性:优先选取与目标高度相关性的.
    对于特征选择,有时候我们需要考虑分类变量和连续变量的不同.
  3. .过滤法:按照发散性或者相关性对各个特征进行评分,设定阈值或者待选择阈值的个数选择特征

变量筛选-方差法(连续)

计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
`

from sklearn.feature_selection import VarianceThreshold
var = VarianceThreshold(threshold=0.2)
data = var.fit_transform([[1,1,1],
                         [1,4,2],
                         [1,10,3]])
print('每列的方差')
print(var.variances_)
print('经过特征筛选后的数据')
data

输出: 每列的方差
[ 0. 14. 0.66666667]
经过特征筛选后的数据
array([[ 1, 1],
[ 4, 2],
[10, 3]])

卡方检验:建议作为分类问题的分类变量的筛选方法(离散-离散)

经典的卡方检验是检验定性自变量对定性因变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量

from sklearn.feature_selection import chi2
from sklearn.datasets import load_iris
import pandas as pd
X,y = load_iris(return_X_y=True)
X_df = pd.DataFrame(X,columns=list(“ABCD”))

(chi2,pval) = chi2(X_df,y)

dict_feature = {}
for i,j in zip(X_df.columns.values,chi2):
dict_feature[i]=j
#对字典按照values排序
ls = sorted(dict_feature.items(),key=lambda item:item[1],reverse=True)
ls:
[(‘C’, 116.16984746363947),
(‘D’, 67.24482758620685),
(‘A’, 10.817820878493993),
(‘B’, 3.5944990176817315)]

互信息法:建议作为分类问题的分类变量的筛选方法(离散-离散))

经典的互信息也是评价定性自变量对定性因变量的相关性的,为了处理定量数据,最大信息系数法被提出。

包装法

递归特征消除法:用一个基模型来进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮训练
包裹式特征选择直接把最终将要使用的学习器性能作为特征子集的评价标准,换而言之选择出了最有利于学习器性能发挥量身定做的特征子集。包裹式特征选择比过滤式特征选择更好,但由于需要在特征选择的过程中多次训练学习器,故计算开销较大。
交叉验证版的REF
from sklearn.datasets import load_iris
import pandas as pd
from sklearn.feature_selection import RFECV
from sklearn.ensemble import RandomForestClassifier
“”“

  • estimator – 基学习器

  • step – 默认1,即每次迭代移除一个特征

  • cv – 默认2,即二折交叉验证的方式进行特征选择

  • scoring – 根据学习目标设定的模型评分标准

  • verbose – 默认0,即不显示中间过程

  • n_jobs – 默认1,即不使用并行计算,单核计算
    ”“”
    X,y = load_iris(return_X_y=True)
    X_df = pd.DataFrame(X,columns=list(“ABCD”))

    refCV = RFECV(estimator=RandomForestClassifier(),
    step=0.5,
    cv =5,
    scoring=None,
    n_jobs=-1)

    refCV.fit(X_df,y)

    #保留特征的数量
    print(refCV.n_features_)
    #保留特征的False、True标记
    print(refCV.support_)
    feature_new = X_df.columns.values[refCV.support_]
    #交叉验证分数
    print(refCV.grid_scores_)

1
[False False True False]
[0.96666667 0.95333333 0.94 ]

SelectFromModel

3.1 以L1为基的特征选择

L1可以稀疏系数,用feature_selection.SelectFromModel可以选择不是0的系数

 from sklearn.svm import LinearSVC
 from sklearn.datasets import load_iris
 from sklearn.feature_selection import SelectFromModel
 iris = load_iris()
 X, y = iris.data, iris.target
 X.shape
(150, 4)
lsvc = LinearSVC(C=0.01, penalty="l1", dual=False).fit(X, y)
model = SelectFromModel(lsvc, prefit=True)
 X_new = model.transform(X)
 X_new.shape
(150, 3)

SlectBest、SelectPercentile

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2

#选择K个最好的特征,返回选择特征后的数据
ch2=SelectKBest(chi2, k=2)
X_new =ch2.fit_transform(X,y)#新的处理之后的数据
ch2.get_support()#获得选取的特征

你可能感兴趣的:(特征选择(2):特征选择:方差选择法、卡方检验、互信息法、递归特征消除、L1范数)