类 | 所属方法 | 具体方法 |
---|---|---|
varianceThreshold | Filter | 方差选择法 |
SelectKBest | Filter | 将可选相关系数、卡方检验或最大信息系数作为得分计算的方法 |
RFE | Wrapper | 递归消除特征法 |
SelectFromModel | Embedded | 基于模型的特征选择法 |
过滤法:相关系数、卡方检验、信息增益、互信息
包装法:完全搜索、启发搜索、随机搜索(遗传算法、模拟退火算法)
嵌入法:决策树
from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
iris = load_iris()
VarianceThreshold(threshold=3).fit_transform(iris.data)
import numpy as np
from sklearn.datasets import load_iris
iris = load_iris()
from array import array
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
SelectKBest(
lambda X,Y: np.array(list(map(lambda x: pearsonr(x,Y), X.T))).T[0],k=2).fit_transform(iris.data, iris.target)
(2)卡方检验
经典的卡方检验是检验定性自变量与定性因变量的相关性。假定自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望之间的差距,构建统计量:
x 2 = ∑ ( A − E ) 2 / E x^2=∑(A-E)^2/E x2=∑(A−E)2/E
from sklearn.datasets import load_iris
iris = load_iris()
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)
(3)最大信息系数法
经典的互信息是评价定性自变量与定性因变量相关性的方法,互信息计算公式如下:
import numpy as np
from sklearn.feature_selection import SelectKBest
from minepy import MINE
def mic(x, y):
m = MINE()
m.compute_score(x, y)
retrun (m.mic(), 0.5)
SelectKBest(lambda X,Y: np.array(list(map(lambda x: pearsonr(x,Y), X.T))).T[0],k=2).fit_transform(iris.data, iris.target)
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
RFE(estimator=LogisticRegression(multi_class='auto',solver='lbfgs',max_iter=500),n_features_to_select=2).fit_transform(iris.data,iris.target)
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
SelectFromModel(LogisticRegression(penalty='l2',C=0.1,solver='lbfgs',multi_class='auto')).fit_transform(iris.data,iris.target)
(2)基于树模型的特征选择法
在树模型中,GBDT梯度提升迭代决策树可以作为基模型进行特征选择
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
# SelectFromModel(GradientBoostingClassifier()).fit_transform(iris.data, iris.target)
SelectFromModel(GradientBoostingClassifier()).fit_transform(gas_data,gas_target)