特征工程-特征选择实战

特征选择

1.特征选择介绍

以鸢尾花为例,如何从以下特征中选择出合适的特征。
在这里插入图片描述

可能很多人都知道和前四个特征有关,Color和Time这两个特征是被舍弃的

在这里插入图片描述

但是如何判断前四个特征就是我们最需要的,这就是特征选择

特征选择:对坏属性说不

选择特征是为了提高预测能力,降低时间成本

特征选择的方法:

基于统计的特征选择

基于模型的特征选择

基于统计的特征选择(都是单变量方法)

皮尔逊相关系数(Pearson correlations)

假设检验

2 .数据导入及探索

判断信用卡逾期
选择特征是为了提高预测能力,降低时间成本。首先以一个案例作为例子链接:数据
提取码:nh3f

import pandas as pd
df=pd.read_csv('credit_card_default.csv')
df.head(3)

在这里插入图片描述

查看数据类型(下图只展示了一部分)

df.dtypes

在这里插入图片描述

划分X,y

X=df.iloc[:,:-1]
y=df.iloc[:,-1]
y.value_counts()

在这里插入图片描述

可以看出样本正例和反例比列差距较大y.value_counts(normalize=True)显示比例

在这里插入图片描述

也可以看出模型的空准确率为0.7788(训练的模型准确率要高于这个)

3.基于皮尔逊相关系数的特征选择

皮尔逊相关系数(Pearson correlations)

1.取值范围[-1,1],和响应变量相关系数越大,则特征越有用。

2.相关系数绝对值小,则说明作用低,且容易在训练时产生过拟合。

3.发现并删除冗余变量是降低过拟合的一个关键方法

计算皮尔逊相关系数

pearson=df.corr()
pearson

在这里插入图片描述

只需要取最后一列

pearson['default payment next month']

在这里插入图片描述

最后一个是它本身,去掉

pearson['default payment next month'][:-1].abs()
index = pearson['default payment next month'][:-1].abs() > 0.1
df.columns[:-1][index]

在这里插入图片描述

这样就求出了主要特征

X_subset = X.loc[:, index]

4.特征选择前后模型性能比较

from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score

未做特征选择时

cross_val_score(LogisticRegression(),X,y,cv=5).mean()

在这里插入图片描述

cross_val_score(KNeighborsClassifier(),X,y,cv=5).mean()

在这里插入图片描述

做特征选择后

cross_val_score(LogisticRegression(),X_subset,y,cv=5).mean()

在这里插入图片描述

cross_val_score(KNeighborsClassifier(),X_subset,y,cv=5).mean()

在这里插入图片描述

可以看出特征选择后KNN的性能有不错的提升

5.基于假设检验的特征选择

假设检验

假设:“特征与响应变量没有关系”(零假设)。
假设为真还是假?
P检验:p值介于0、1之间,p值越小则拒绝假设的概率就越大。

from sklearn.feature_selection import SelectKBest,chi2,f_classif   # chi2 卡方检验,f_classif分布
select_model=SelectKBest(score_func=f_classif,k=5)           # chi2只能输入非负值 k:要选择出的特征个数
select_model.fit_transform(X,y)
select_model.get_support()

在这里插入图片描述

select_model.pvalues_       # 查看p值

在这里插入图片描述接下来了看看基于假设检验选择出的特征和基于皮尔逊相关系数的有什么区别

pd.DataFrame({'feature':X.columns,'p':select_model.pvalues_ }).sort_values(by='p')

在这里插入图片描述
可以看出前七个和基于皮尔逊相关系数选出的特征类似,当然不是所有的情况下的相同,只是在这个数据上类似


之前说过特征选择有两种,一直是基于统计一种是基于模型,下面我们就看一下基于模型的特征选择

6.基于树的特征选择

基于模型的特征选择

基于树的模型
基于线性模型

在机器学习算法中有一些模型具备特殊的性能,比如说决策树和线性模型,它们可以在训练的时候把样本各个属性的重要程度量化出来,这个量化过程其实就是属性重要程度的体现,也就是可以用于特征的选择。
决策树进行属性拆分做分支的时候到底是依据什么选择拆分节点,在不同的树中选择的标准不同,ID3中是选择信息增益,C4.5中是信息增益率,在CART分类树算法使用基尼系数

from sklearn.tree import DecisionTreeClassifier
Dct=DecisionTreeClassifier()
Dct.fit(X,y)

主要这里并不是要用决策树构建模型,而是通过决策树把样本特征的重要性体现出来
查看每个特征的重要程度

Dct.feature_importances_

在这里插入图片描述

feature_importances=pd.DataFrame({'feature':X.columns,'important':Dct.feature_importances_}).sort_values('important',ascending=False)
feature_importances[:7]

在这里插入图片描述
这时获得的特征和基于统计选出的不一样,因为它们的计算方式不同,下面看一下基于树模型选择出的特征会不会比基于统计的好

7特征选择后模型性能探索

feature_tree = feature_importances['feature'][:7]  
feature_tree

在这里插入图片描述

X_subset_tree = X[feature_tree]
cross_val_score(LogisticRegression(), X_subset_tree, y, cv=20).mean()           
cross_val_score(DecisionTreeClassifier(), X_subset_tree, y, cv=20).mean()       
cross_val_score(RandomForestClassifier(), X_subset_tree, y, cv=20).mean()      
cross_val_score(KNeighborsClassifier(), X_subset_tree, y, cv=20).mean()   

在这里插入图片描述

8 基于线性模型的特征选择

基于线性模型:逻辑回归、SVC
基于线性模型与上面树的类似,下面看SVC的

from sklearn.feature_selection import SelectFromModel   # 特征选择
from sklearn.linear_model import LinearRegression
from sklearn.svm import LinearSVC   # 选择的依据

select_model = SelectFromModel(estimator=LinearSVC(penalty="l2"), threshold='mean')
select_model.fit(X, y)
index = select_model.get_support()
X_subset_linear = X[X.columns[index]]

接下来构建一个机器学习流水线,使用集成学习随机森林作为模型

from sklearn.pipeline import Pipeline
clf = Pipeline([
    ('feature_selection', SelectFromModel(LinearSVC(penalty="l2"))),
    ('classification', RandomForestClassifier())
])
cross_val_score(clf, X_subset_linear, y, cv=10).mean()

在这里插入图片描述
特征工程就是删除一些冗余属性,隔离噪声,防止过拟合

9.小结

特征选择方法
1.基于统计学(Pearson相关系数,P检验)
2.基于机器学习模型(决策树、逻辑回归、SVC)

前人经验,可以在判断特征选择方法的优劣时参考
1.如果特征是分类的,那么从SelectKBest开始,用卡方或基于树的选择器。
2.如果特征基本是定量的,用线性模型和基于相关性的选择器一般效果更好。
3.如果是二元分类问题,考虑使用SelectFromModel和SVC.
4.在手动选择前,探索性数据分析会很有益处。
5.不能低估领域知识的重要性。

特征选择的局限性
上面所介绍的都是单变量的特征选择,计算每个特征的重要程度,从而依据重要性进行选择,这种方式在数据量比较小特征比较少的情况下比较适用。而特征一旦超过100,通过这种方式就会很麻烦

单变量特征选择方法在大量特征上表现不佳。
如果从很多特征(超过100种)中选择,那么会很麻烦。

不过还有其他的办法可以处理,就是降维与特征转换

  • 2
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

开始King

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

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

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

打赏作者

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

抵扣说明:

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

余额充值