【特征工程】特征选择

数据和特征决定了机器学习的上限,而模型和算法只是逼近这个上限而已.由此可见,特征工程尤其是特征选择在机器学习中占有相当重要的地位。上一章节我们系统性的讲述了数据预处理,本章我们将讲解特征选择。通常而言,特征选择是指选择获得相应模型和算法最好性能的特征集。参看官网,效果更佳!

目录

2.2特征选择

2.2.1过滤法(Filter)

2.2.1.1方差选择法

2.2.1.2相关系数法

2.2.1.3卡方检验

2.2.1.4最大信息系数法

2.2.2包装法(wrapper)

2.2.2.1递归消除法

2.2.3嵌入法(Embedded)

2.2.3.1基于惩罚项的特征选择

2.2.3.2基于树模型的特征选择

参看文章:


2.2特征选择

当数据预处理完成之后,我们需要选择有意义的特征输入机器学习的算法和模型中进行训练。下面我们从两个方面考虑特征的选择:

  • 特征是否发散:如果特征不发散,例如方差接近于0,也就是说样本在这个特征上基本没有差异,这个特征对于样本的区分也就没那么大了。
  • 特征与目标的相关性:与目标相关性高,特征应该优先选择。

特征选择常用的方法:过滤法Filter、包装法Wrapper,嵌入法Embedded

2.2.1过滤法(Filter)

根据相关性和发散性对特征进行评分,根据设定的阈值或者待选择的阈值个数选择特征;

2.2.1.1方差选择法

首先计算各个特征的方差,根据方差选择阈值,选择方差大于阈值的特征。使用feature_selection库的VarianceThreshold类来选择特征.方差越大,表示该特征的代表性(发散性)就越强.

from sklearn.feature_selection import VarianceThreshold
from sklearn.datasets import load_iris
data=load_iris().data
target=load_iris().target
std=data.std(axis=0)  # 计算每个特征的方差
std.sort()
print(std)
vt=VarianceThreshold(threshold=0.6)
vt.fit_transform(data)[0:5]

这种方法主要是通过特征变量之间的方差或者发散性来决定的,发散性越强,代表性越大.

2.2.1.2相关系数法

先计算各个特征对目标值的相关系数的P值,用feature_selection库中的SelectKBest类结合相关系数来选择特征.

from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
from sklearn.datasets import load_iris
iris=load_iris()
data=iris.data
target=iris.target
f1=lambda x:pearsonr(x,target)  # 用来计算皮尔逊相关系数的函数
f2=lambda data,target:list(map(f,data.T))  # 用来计算数组每个向量的皮尔逊相关系数
skb=SelectKBest(score_func=f2,k=2)
skb.fit_transform(data,target)

这个方法的关键是皮尔逊相关系数的计算,这时候我们需要引入一个常用的科学计算库scipy,该库中提供了非常实用的科学计算相关的方法,eg:皮尔逊相关系数的计算.

from scipy.stats import pearsonr
from sklearn.datasets import load_iris
X,y=load_iris(True)
f1=lambda x,y:pearsonr(x,y)
for x in X.T:
    c,p=f1(x,y)
    print(c,p)

scipy提供的方法pearsonr(x,y)中x表示特征值,y表示目标值.

该方法主要是用自变量与因变量的相关性来判断的.

2.2.1.3卡方检验

该方法是通过检验定性自变量对定性因变量的相关性.假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量:

卡方检验的基本思想就是在于比较理论频数与实际频数的吻合程度或者拟合优度问题.卡方检验是以χ2分布为基础的一种常用假设检验方法,它的无效假设H0是:观察频数与期望频数没有差别。

该检验的基本思想是:假设H0成立,基于此前提计算X^2,表示观察值和理论值的偏离程度.根据χ2分布及自由度可以确定在H0假设成立的情况下获得当前统计量及更极端情况的概率P。如果P值很小,说明观察值与理论值偏离程度太大,应当拒绝无效假设,表示比较资料之间有显著差异;否则就不能拒绝无效假设,尚不能认为样本所代表的实际情况和理论假设有差别。

简而言之,这个统计量就是自变量对因变量的相关性.

from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
from sklearn.datasets import load_iris
data,target=load_iris(True)
skb=SelectKBest(
    score_func=chi2,
    k=2
)
skb.fit_transform(data,target)

2.2.1.4最大信息系数法

评价定性自变量对定性因变量的相关性,基本公式为:

为了解决定量数据,最大信息系数法被提出,使用feature_selection库中的SelectKBest类结合最大信息系数法,代码如下

from sklearn.feature_selection import SelectKBest
from minepy import MINE
from sklearn.datasets import load_iris
import numpy as np
data,target=load_iris(True)
def mic(x, y):
    m = MINE()
    m.mcompute_score(x, y)
    return (m.mic(), 0.5)
skb=SelectKBest(lambda X, Y: np.array(map(lambda x:mic(x, Y), X.T)).T, k=2)
skb.fit_transform(data,target)

2.2.2包装法(wrapper)

根据目标函数(预测效果的评分),每次选择若干特征或者排除若干特征。

2.2.2.1递归消除法

使用一个基模型进行多轮训练,每轮训练后,消除若干权值系数的特征,再基于新的特征集进行下一轮的训练,使用feature_selection库的RFE类拉选择特征.代码如下:

from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
data,target=load_iris(True)
rfe=RFE(
    estimator=LogisticRegression(),
    n_features_to_select=2
)
rfe.fit_transform(data,target)

2.2.3嵌入法(Embedded)

先使用机器学习算法模型进行训练,得到各个特征的权值系数,根据系数从大到小选择特征,类似于Filter,但是是通过训练来确定特征的优略的。

2.2.3.1基于惩罚项的特征选择

使用惩罚项的基模型除了筛选特征之外同时还进行了降维操作.我们使用feature_selection中的SelectFromModel类结合L1惩罚项的逻辑回归模型.特征选择代码如下:

from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris
data,target=load_iris(True)
sfm=SelectFromModel(
    estimator=LogisticRegression(penalty='l1',C=0.1),  # 模型分类
    threshold=1  # 阈值
)
sfm.fit_transform(data,target)

实际上,L1惩罚项降维的原理在于保留多个对目标值具有同等相关性的特征中的一个。所以没选到的特征不代表不重要。因此可结合L2正则化进行优化。具体操作为:若一个特征在L1中的权值为1,选择为L2中的权值差别不大且在L1中的权值为0的特征构成同类集合,将这一集合中的特征平分L1中的权值,故需要构建一个性的逻辑回归模型。

2.2.3.2基于树模型的特征选择

树模型中GBDT也可用来作为基模型进行特征选择,使用feature_selection库的SelectFromModel类结合GBDT模型。

from sklearn.feature_selection import SelectFromModel
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.datasets import load_iris
data,target=load_iris(True)
sfm=SelectFromModel(
    estimator=GradientBoostingClassifier(),  # 模型分类
    threshold=0.2  # 阈值
)
sfm.fit_transform(data,target)

参看文章:

  1. 机器学习中,有哪些特征选择的工程方法?
  2. 特征工程
  3. 卡方分布
  4. 正太分布1,正太分布2
  5. T分布和F分布
  6. 机器学习中,有哪些特征选择的工程方法?

最后,感谢各位的参考文章!

发布了133 篇原创文章 · 获赞 67 · 访问量 9898

猜你喜欢

转载自blog.csdn.net/weixin_43797885/article/details/105336047