数据分析-特征选择-feature_selection

目录

前言

过滤法

方差选择法

卡方检验法

 相关系数检验法

皮尔逊相关系数

互信息-Mutual information

最大信息系数 maximal information coefficient (MIC)

距离相关系数

包装法

前向搜索

后向搜索

递归特征消除法

嵌入法


前言

特征选择是从全部特征中选取一个特征子集来建立模型,通过降低特征维度,提高模型性能。

通常保留与目标特征相关性高的特征,剔除包含信息较少的特征。

特征选择常用的方法有:

过滤法

先进行特征选择,再建立模型,特征选择的过程中不涉及建模。如方差选择法,卡方检验法,相关系数法。

包装法

建立模型并给定评价标准,选择效果最优的特征子集。如递归特征消除法。

嵌入法

特征选择与模型训练结合,在训练过程中自动进行特征选择,如L1正则化,特征重要性等。

过滤法

方差选择法

方差小的特征波动性小,包含的信息也较少,对模型影响较小

给定一个方差阈值,计算所有特征的方差;保留方差大于阈值的特征;剔除方差小于阈值的特征。

实现

feature_selection.VarianceThreshold

from sklearn.feature_selection import VarianceThreshold
sel_var = VarianceThreshold(threshold=0.5)# 设定方差阈值为0.3
sel_var_X = sel_var.fit_transform(X) #去掉X中方差低于阈值的特征
sel_var_X.shape # 查看剔除低方差特征后X的维度
print(pd.Series(sel_var.get_support(), index=X.columns)) # 查看保留的特征

卡方检验法

原假设 H0:特征X与目标Y独立,备择假设 H1:特征X与目标Y不独立

检验统计量:

\chi =\sum \frac{(A-E)^{2}}{E}

其中A为观察值, E为理论值

给定显著水平α (查表)找到自由度为n的卡方分布的α分位数X_{a}^{2}(n)

\chi ^{2}>X_{a}^{2}(n),则拒绝原假设,认为特征X与目标Y存在相关性。 

\chi ^{2}的值越大,特征X与目标Y相关性越强,可以设定一个阈值,\chi ^{2}大于阈值的特征保留,小于阈值的剔除,实现特征选择。

 相关系数检验法

皮尔逊相关系数

皮尔逊相关系数用于度量两个特征XY的线性相关性,取值在-11之间。-1 表示完全的负相关(这个变量下降,那个就会上升), +1 表示完全的正相关, 0 表示没有线性相关性。Pearson Correlation速度快、易于计算,经常在拿到数据(经过清洗和特征提取之后的)之后第一时间就执行。Scipy的pearsonr方法能够同时计算相关系数和p-value。

Pearson相关系数的一个缺陷是,作为特征排序机制,他只对线性关系敏感。如果关系是非线性的,即便两个变量具有一一对应的关系,Pearson相关性也可能会接近 0 。

样本的皮尔逊相关系数的计算公式:

依次计算每个特征与目标的皮尔逊相关系数,给定一个阈值,保留相关系数大于阈值的特征,剔除相关系数小于阈值的特征。

from scipy.stats import pearsonr
from sklearn.feature_selection import SelectKBest  # 根据给定的得分函数选出K个得分最高的特征
# 选择K个最好的特征,返回选择特征后的数据
# 参数k为选择的特征个数
# 输出二元组(相关系数,P值),数组第i项为第i个特征的相关系数和P值。
m=SelectKBest(lambda X, Y: np.array(list(map(lambda x:pearsonr(x, Y), X.T))).T[0], k=5).fit(train_x, train_y)
print(m.scores_)
m.fit_transform(train_x, train_y)

feature_selection.SelectKBest     根据给定的得分函数选出K个得分最高的特征

feature_selection.SelectPercentile      根据给定的得分函数选出前p%个得分最高的特征(p需指定)

f_classif : ANOVA F-value between label/feature for classification tasks.
mutual_info_classif : Mutual information for a discrete target.
chi2 : Chi-squared stats of non-negative features for classification tasks.
f_regression : F-value between label/feature for regression tasks.
mutual_info_regression : Mutual information for a continuous target.
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2,f_classif,f_regression
sel_chi = SelectKBest(chi2,k=5).fit(X, y) # 选择与目标变量最相关的5个特征
print(sel_chi.scores_)  # 输出各个特征变量与目标变量的相关程度
print(pd.Series(sel_chi.get_support(), index=X.columns)) # 输出筛选结果
from sklearn.feature_selection import SelectPercentile
from sklearn.feature_selection import chi2
sel_chi=SelectPercentile(chi2,percentile=50).fit(data,data_y)  #选择50%
print(sel_chi.scores_)
print(pd.Series(sel_chi.get_support(),index=data.columns).sort_values())

互信息-Mutual information

经典的互信息也是评价类别型变量类别型变量的相关性的,互信息公式如下: 

想把互信息直接用于特征选择不是太方便:

  • 它不属于度量方式,也没有办法归一化,在不同数据及上的结果无法做比较
  • 对于连续变量的计算不是很方便( X 和 Y 都是集合, xi, y 都是离散的取值),通常变量需要先离散化,而互信息的结果对离散化的方式很敏感

最大信息系数 maximal information coefficient (MIC)

最大信息系数克服了互信息的问题。它首先寻找一种最优的离散化方式,然后把互信息取值转换成一种度量方式,取值区间在 [0,1] 。minepy提供了MIC功能。

from minepy import MINE
m = MINE()
x = np.random.uniform(-1, 1, 10000)
m.compute_score(x, x**2)
print(m.mic())
from sklearn.feature_selection import SelectKBest
#由于MINE的设计不是函数式的,定义mic方法将其为函数式的,返回一个二元组,二元组的第2项设置成P值
def mic(x, y,p):
    m = MINE()
    m.compute_score(x, y)
    return (m.mic(), p)
# 选择K个最好的特征,返回特征选择后的数据
SelectKBest(lambda X, Y: np.array(list(map(lambda x:mic(x, Y,0.5), X.T))).T[0], k=2).fit_transform(iris.data, iris.target)

距离相关系数

距离相关系数是为了克服Pearson相关系数的弱点而生的。在 x 和 x^2 这个例子中,即便Pearson相关系数是 0 ,我们也不能断定这两个变量是独立的(有可能是非线性相关);但如果距离相关系数是 0 ,那么我们就可以说这两个变量是独立的。

 Pearson相关系数计算速度快,这在处理大规模数据的时候很有效,Pearson相关系数的取值区间是[-1,1],而MIC和距离相关系数都是[0,1]。这个特点使得Pearson相关系数能够表征更丰富的关系,符号表示关系的正负,绝对值能够表示强度。当然,Pearson相关性有效的前提是两个变量的变化关系是单调的。 

包装法

基本思想:基于hold-out方法,对于每一个待选的特征子集,都在训练集上训练一遍模型,然后在测试集上根据误差大小选择出特征子集。需要先选定特定算法,通常选用普遍效果较好的算法, 例如Random Forest, SVM, kNN等等。

前向搜索

每次增量地从剩余未选中的特征选出一个加入特征集中,待达到阈值或者 n 时,从所有的 F 中选出错误率最小的。过程如下:

  1. 初始化特征集 F 为空。
  2. 扫描 i 从 1 到 n 如果第 i 个特征不在 F 中,那么特征 i 和F 放在一起作为 F_i (即 F_i=F\cup{i} )。 在只使用 F_i 中特征的情况下,利用交叉验证来得到 F_i 的错误率。
  3. 从上步中得到的 n 个 F_i 中选出错误率最小的 F_i ,更新 F 为 F_i 。
  4. 如果 F 中的特征数达到了 n 或者预定的阈值(如果有的话), 那么输出整个搜索过程中最好的 ;若没达到,则转到 2,继续扫描。

后向搜索

先将 F 设置为 {1,2,...,n} ,然后每次删除一个特征,并评价,直到达到阈值或者为空,然后选择最佳的 F 。

这两种算法都可以工作,但是计算复杂度比较大。

递归特征消除法

递归消除特征法使用一个基模型来进行多轮训练,每轮训练后通过学习器返回的 coef_ 或者feature_importances_ 消除若干权重较低的特征,再基于新的特征集进行下一轮训练。

利用可以学习到特征权重或重要性的模型,通过递归的方式减少特征个数来进行特征选择

步骤

  • 基于所有特征训练模型,得到每个特征的权重或重要性
  • 剔除权重或重要性最小的特征,基于新的特征集合训练模型
  • 最后,重复上述步骤,进行递归消除,直到剩下的特征个数满足条件为止

执行RFE的过程中,可以通过交叉验证的方式来评价模型在某个特征集合上的表现,以此来选择最佳的特征集合

feature_selection.RFE   递归特征消除法

from sklearn.feature_selection import RFE
from sklearn.tree import DecisionTreeClassifier
rfe = RFE(DecisionTreeClassifier(random_state=10), n_features_to_select=7)
rfe.fit_transform(train_X,train_y)
# 先对test_X进行转换后,再用设定好的学习器进行预测
y_pred = rfe.predict(test_X)
# 将test_X进行特征选择后,再用设定好的学习器评分
rfe.score(test_X, test_y)
# 特征排名
rfe.ranking_

feature_selection.RFECV      包含交叉验证的递归特征消除法

from sklearn.feature_selection import RFECV
rfeCV = RFECV(DecisionTreeClassifier(random_state=10), 
              cv=5,
              scoring='roc_auc')
rfeCV.fit(train_X,train_y)
## 查看特征排名
print(pd.Series(rfeCV.ranking_, index=X.columns))

嵌入法

模型训练和特征选择结合,在优化过程中自动选择特征

方法:

L1正则化项:优化过程中可得到稀疏解,等同于特征选择,如LASSO

特征权重或重要性:设定阈值,若某特征的权重或重要性低于阈值,则将该特征剔除,

   如:决策树、SVM

feature_selection.SelectFromModel   嵌入式特征消除法 

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
# 使用随机森林作为监督学习器
select = SelectFromModel(RandomForestClassifier(n_estimators=200, random_state=10), 
                         threshold='median')
select.fit(train_X, train_y)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ITLiu_JH

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值