特征选择

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章