转载:https://www.cnblogs.com/jasonfreak/p/5448385.html
https://blog.csdn.net/daxiaofan/article/details/53118259
特征选择主要从两个方面入手:
计算各个特征的方差,然后根据阈值,选择方差大于阈值的特征
`
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 ]
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)
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()#获得选取的特征