过滤式/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正则化的截断效应,过滤掉影响小的参数