1、去掉方差较小的特征
删除方差不满足某个阈值的所有特征,默认情况下,它删除所有0方差特征,即在所有样本中具有相同值的特征。
from sklearn.datasets import load_boston
from sklearn.feature_selection import VarianceThreshold
boston = load_boston()
x = boston.data
y = boston.target
# 删除方差不满足某个阈值的所有特征,默认情况下,它删除所有0方差特征,即在所有样本中具有相同值的特征。
select_feature = VarianceThreshold(threshold=(0.8*(1-0.8)))
x_n = select_feature.fit_transform(x)
print(x.shape, x_n.shape) # (506, 13) (506, 11)
2、单变量特征选择
单变量特征选择通过单变量统计检验选择特征
SelectKBest只保留K个最高分的特征
SelectPercentile只保留用户指定的百分比的最高得分的特征
使用常见的单变量统计检验
分类:
使用chi2卡方
f_classif方差分析
mutual_info_classif互信息
回归:
使用f_regression相关系数
mutual_info_regression互信息
# 分类使用chi2
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest, chi2
iris = load_iris()
x = iris.data
y = iris.target
x_n = SelectKBest(chi2, k=2).fit_transform(x, y)
print(x.shape, x_n.shape) # (150, 4) (150, 2)
# 回归使用f_refression,计算每个变量和目标变量的相关系数,计算f score,p-value
from sklearn.datasets import load_boston
from sklearn.feature_selection import SelectKBest, f_regression
boston = load_boston()
x = boston.data
y = boston.target
x_n = SelectKBest(f_regression, k=10).fit_transform(x, y)
print(x.shape, x_n.shape) # (506, 13) (506, 10)
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectPercentile, chi2
iris = load_iris()
x = iris.data
y = iris.target
x_n = SelectPercentile(chi2, percentile=50).fit_transform(x, y)
print(x.shape, x_n.shape) # (150, 4) (150, 2)
3、递归特征消除
给特征赋予一个外部模型产生的权重(比如:线性模型系数),RFE递归使用越来越少的特征进行特征选择。首先,在原始数据上建立模型并且给每个特征一个权重;然后,消除绝对权重最小的特征,递归执行这个过程直到达到希望的特征数。
from sklearn.datasets import load_iris
from sklearn.feature_selection import RFE
from sklearn.svm import SVC
iris = load_iris()
x = iris.data
y = iris.target
svc = SVC(kernel='linear', C=1)
rfe = RFE(estimator=svc, n_features_to_select=3).fit(x, y)
x_n = rfe.transform(x)
print(x.shape, x_n.shape) # (150, 4) (150, 3)
4、使用SelectFromModel方法特征选择
SelectFromModel是一个元转换器,可以与那些有coef_或者fearure_importances_属性的模型一起使用。如果coef_或者fearure_importances_小于阈值,认为特征是不重要的。
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_digits
digits = load_digits()
x = digits.data
y = digits.target
rf = RandomForestClassifier(n_estimators=100)
select = SelectFromModel(rf, threshold='median')
select.fit(x, y)
x_n = select.transform(x)
print(x.shape, x_n.shape) # (1797, 64) (1797, 32)