前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >5种数据科学家必须知道的特征选择方法

5种数据科学家必须知道的特征选择方法

作者头像
Python数据科学
发布2019-10-10 11:28:38
1.6K0
发布2019-10-10 11:28:38
举报
文章被收录于专栏:Python数据科学

编译 | 艾奇

作者 | Rahul Agarwal

来源 | towardsdatascience

数据决定了模型的上限,算法只能无线逼近这个上限。模型好坏很大程度上还是取决于数据的质量、特征的选择。

面对海量数据我们无法手动挨个EDA挑选,那么如何科学地使用方法筛选特征显得尤为重要,今天个大家介绍数据科学家必须掌握的5种常用特征选择方法。

1、特征选择的原因

我们可能会想为什么不适用所有特征呢?特征选择的意义到底是什么?

有这么简单的三个原因:

1. 维度灾难 - 过度拟合

图片来源:https://chrisalbon.com/?source=post_page

一般经验是当数据中的列数多于行数,可能会对模型产生不好的影响,即模型会过度地拟合数据,导致模少泛化能力。此外,大量特征使得模型体积庞大,耗时,并且难以在生产中实施。

2. 可解释性

我们希望模型简单并可解释。当有非常多的特征时,将会失去可解释性。

3. garbage in - garbage out

很多数时候,我们会有许多非信息化特征。例如,名称或ID变量这些无意义的特征,如果不进行特征选择,那么这些质量比较差的输入特征也就会产生质量差的输出。

2、如何进行特征选择?

核心就是只选择有用的特征,可以通过很多方式来做,通常可以分为三种。

  • 基于过滤器:指定一些指标并基于此过滤特征,例如:相关性/卡方检验。
  • 基于包装器:包装器方法将选择一组特征视为搜索问题,例如:递归特征消除方法。
  • 嵌入式:嵌入式方法使用具有内置特征选择方法的算法,例如:Lasso和RF有自己的特征选择方法。

下面介绍上面提及的也是常用的5种特种选择方法,这些方法在Scikit-learn中已经有了封装好的方法可以直接使用。

使用特征kaggle的一个数据集作为示例。

https://www.kaggle.com/mlwhiz/feature-selection-using-football-data?source=post_page

3、五种特征选择方法

进行选择之前完成了一些基本的预处理,例如删除空值和独热编码。并使用以下方法将问题转换为分类问题:

代码语言:javascript
复制
y = traindf ['Overall']> = 87

这里使用High Overall代表优秀球员,数据集(X)如下所示,有223列。

训练数据X

1. 皮尔逊相关(pearson)

这是一种基于过滤器的方法。

在数据集中目标变量和数值特征之间Pearson相关的绝对值。根据此标准保留前n个特征。

代码语言:javascript
复制
def cor_selector(X, y,num_feats):
    cor_list = []
    feature_name = X.columns.tolist()
    # calculate the correlation with y for each feature
    for i in X.columns.tolist():
        cor = np.corrcoef(X[i], y)[0, 1]
        cor_list.append(cor)
    # replace NaN with 0
    cor_list = [0 if np.isnan(i) else i for i in cor_list]
    # feature name
    cor_feature = X.iloc[:,np.argsort(np.abs(cor_list))[-num_feats:]].columns.tolist()
    # feature selection? 0 for not select, 1 for select
    cor_support = [True if i in cor_feature else False for i in feature_name]
    return cor_support, cor_feature
cor_support, cor_feature = cor_selector(X, y,num_feats)
print(str(len(cor_feature)), 'selected features')

2. 卡方(chi-squared)

这是另一种基于过滤器的方法。

在这种方法中,计算目标和数值变量之间的卡方度量,只选择具有最大卡方值的变量。

图片来源:https://chrisalbon.com/?source=post_page

创建一个小例子说明如何计算样本的卡方统计量。

假设数据集中有75个右前锋和25个非右前锋,观察到40个右前锋表现较好,35个表现不太好。这是否意味着右前锋球员会影响整体表现?

观测值和预期计数

计算卡方值:

要做到这一点,如果两个分类变量之间确实存在独立性,首先要找出期望落入每个桶(bucket)中的值。

这很简单,将每个单元格的行总和和列总和相乘,并将其除以总观察值。

所以好/不好右前锋的Bucket预期值= 25(行总和)* 60(列总和)/ 100(总观察值)

由于数据中有25%是不好的右前锋,表中观察值为60个优秀选手,因此有15名球员。

接着可以使用下面的公式来对4个单元格求和:

卡方统计量具有非负数值和分类特征,可以从数据集中获得卡方特征:

代码语言:javascript
复制
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.preprocessing import MinMaxScaler
X_norm = MinMaxScaler().fit_transform(X)
chi_selector = SelectKBest(chi2, k=num_feats)
chi_selector.fit(X_norm, y)
chi_support = chi_selector.get_support()
chi_feature = X.loc[:,chi_support].columns.tolist()
print(str(len(chi_feature)), 'selected features')

3. 递归特征消除

这是一种基于包装器的方法。正如之前所说,包装器方法将特征选择视为搜索问题。

来自sklearn文档:递归特征消除(RFE)的目标是通过递归地考虑越来越小的特征集来选择特征。首先,在初始特征集上训练估计器,并且通过 coef_ 属性或通过 feature_importances_ 属性获得每个特征的重要性。然后,从当前的一组特征中删除最不重要的特征。在修剪的集合上递归地重复该过程,直到最终到达所需数量的要选择的特征。

我们可以在该方法上使用任何估算器。在这种情况下,我们使用 LogisticRegression 和 RFE 观察 coef_ 属性的 LogisticRegression 对象。

代码语言:javascript
复制
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
rfe_selector = RFE(estimator=LogisticRegression(), n_features_to_select=num_feats, step=10, verbose=5)
rfe_selector.fit(X_norm, y)
rfe_support = rfe_selector.get_support()
rfe_feature = X.loc[:,rfe_support].columns.tolist()
print(str(len(rfe_feature)), 'selected features')

4. Lasso:从模型中选择

资源:https://chrisalbon.com/?source=post_page

这是一种嵌入式方法。如前所述,嵌入式方法使用具有内置特征选择方法的算法。

例如,Lasso和RF有自己的特征选择方法。Lasso Regularizer强制将许多特征权重归零。这里使用Lasso来选择变量。

代码语言:javascript
复制
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
 
embeded_lr_selector = SelectFromModel(LogisticRegression(penalty="l1"), max_features=num_feats)
embeded_lr_selector.fit(X_norm, y)
 
embeded_lr_support = embeded_lr_selector.get_support()
embeded_lr_feature = X.loc[:,embeded_lr_support].columns.tolist()
print(str(len(embeded_lr_feature)), 'selected features')

5. 基于树:SelectFromModel

我们还可以使用随机森林,根据特征的重要性选择特征。

我们使用每个决策树中的节点杂质计算特征的重要性。在随机森林中,最终的特征重要性是所有决策树特征重要性的平均值。

代码语言:javascript
复制
from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import RandomForestClassifier
 
embeded_rf_selector = SelectFromModel(RandomForestClassifier(n_estimators=100), max_features=num_feats)
embeded_rf_selector.fit(X, y)
 
embeded_rf_support = embeded_rf_selector.get_support()
embeded_rf_feature = X.loc[:,embeded_rf_support].columns.tolist()
print(str(len(embeded_rf_feature)), 'selected features')

我们也可以使用LightGBM,或者XGBoost对象,只要它有一个feature_importances_属性。

代码语言:javascript
复制
from sklearn.feature_selection import SelectFromModel
from lightgbm import LGBMClassifier
 
lgbc=LGBMClassifier(n_estimators=500, learning_rate=0.05, num_leaves=32, colsample_bytree=0.2,
            reg_alpha=3, reg_lambda=1, min_split_gain=0.01, min_child_weight=40)
 
embeded_lgb_selector = SelectFromModel(lgbc, max_features=num_feats)
embeded_lgb_selector.fit(X, y)
 
embeded_lgb_support = embeded_lgb_selector.get_support()
embeded_lgb_feature = X.loc[:,embeded_lgb_support].columns.tolist()
print(str(len(embeded_lgb_feature)), 'selected features')

将多种选择器组合使用

也可以尝试组合多种选择方法进行特征筛选,计算各种特征出现的频次,并按照频次对特征排序。

代码语言:javascript
复制
# put all selection together
feature_selection_df = pd.DataFrame({'Feature':feature_name, 'Pearson':cor_support, 'Chi-2':chi_support, 'RFE':rfe_support, 'Logistics':embeded_lr_support,
                                    'Random Forest':embeded_rf_support, 'LightGBM':embeded_lgb_support})
# count the selected times for each feature
feature_selection_df['Total'] = np.sum(feature_selection_df, axis=1)
# display the top 100
feature_selection_df = feature_selection_df.sort_values(['Total','Feature'] , ascending=False)
feature_selection_df.index = range(1, len(feature_selection_df)+1)
feature_selection_df.head(num_feats)

上面结果的意思是:检查特征是否获得了基于所有方法的筛选。我们可以看到Reactions和LongPassing在高评级选手中具有出色的属性。正如预期的那样,Ballcontrol和Finishing名列前茅。

参考链接:

https://towardsdatascience.com/the-5-feature-selection-algorithms-every-data-scientist-need-to-know-3a6b566efd2


本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-05,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Python数据科学 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 维度灾难 - 过度拟合
  • 2. 可解释性
  • 3. garbage in - garbage out
  • 1. 皮尔逊相关(pearson)
  • 2. 卡方(chi-squared)
  • 3. 递归特征消除
  • 4. Lasso:从模型中选择
  • 5. 基于树:SelectFromModel
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档