特征选择

过滤式/Filter

SelectKBest

from sklearn.feature_selection import SelectKBest
from sklearn.datasets import load_iris

iris = load_iris()
X,y = iris.data,iris.target

X[:5,:]

过滤式

X_new = SelectKBest(k=2).fit_transform(X,y)

X_new[:5,:]  # 计算相关系数后 发现这两列和y值相关度最高

结果:

X_new[:5,:]  # 计算相关系数后 发现这两列和y值相关度最高
1
X_new[:5,:]  # 计算相关系数后 发现这两列和y值相关度最高
array([[1.4, 0.2],
       [1.4, 0.2],
       [1.3, 0.2],
       [1.5, 0.2],
       [1.4, 0.2]])

包裹型

RFE

# 递归特征筛选
from sklearn.feature_selection import RFE

# 判断特征重要度的模型 随机森林分类器
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()

rfe = RFE(estimator=rf,n_features_to_select=2)  # 基于rf模型做特征选择  保留2个特征

X_rfe = rfe.fit_transform(X,y)

X_rfe[:5,:]  # 结果与刚刚过滤式一样

结果:

array([[1.4, 0.2],
       [1.4, 0.2],
       [1.3, 0.2],
       [1.5, 0.2],
       [1.4, 0.2]])

嵌入式/EMmbedded

SelectFromModel

from sklearn.feature_selection import SelectFromModel

from sklearn.svm import LinearSVC  # svm分类器

lsvc = LinearSVC(C=0.01,penalty='l1',dual=False).fit(X,y)  # 正则化 L1

model = SelectFromModel(lsvc,prefit=True)

x_embed = model.transform(X)

x_embed[:5,:]

结果:

array([[5.1, 3.5, 1.4],
       [4.9, 3. , 1.4],
       [4.7, 3.2, 1.3],
       [4.6, 3.1, 1.5],
       [5. , 3.6, 1.4]])

小结

在实际的工业级中,特征量级特别大,用逻辑回归 linearSVM的话,常用嵌入式。借助L1正则化的截断效应,过滤掉影响小的参数