- 特征的选择
- 一、Filter过滤法
- 数据的选择
- 1.方差选择法
- 2.相关系数法
- 3.卡方检验
- 二、Wrapper包装法
- 三、Embedded嵌入法
- 1.基于惩罚项的模型的嵌入法
- 2.基于树模型的嵌入法
# -*- coding:utf-8 -*-
# 时间:2022.1.2
# 路径:
# 作者:M_xuhuaigu@163.com
# 项目说明:特征选择
特征选择( Feature Selection )也称特征子集选择( Feature Subset Selection , FSS ),或属性选择( Attribute Selection )。是指从已有的M个特征(Feature)中选择N个特征使得系统的特定指标最优化,是从原始特征中选择出一些最有效特征以降低数据集维度的过程,是提高学习算法性能的一个重要手段,也是模式识别中关键的数据预处理步骤。对于一个学习算法来说,好的学习样本是训练模型的关键。此外,需要区分特征选择与特征提取。特征提取 ( Feature extraction )是指利用已有的特征计算出
一个抽象程度更高的特征集,也指计算得到某个特征的算法。特征选择过程一般包括产生过程,评价函数,停止准则,验证过程,这4个部分。
Filter过滤法是按照特征和标签的相关性,对各个特征进行评分,再设定相关阈值来选择特征。对各个特征进行评分的方法有多种,主要有方差选择法、相关系数法和卡方检验。
数据的选择# 采用Iris数据集进行特征选择:
from numpy.core.fromnumeric import mean, var
from sklearn.datasets import load_iris
iris = load_iris()
import pandas as pd
print(pd.DataFrame(iris.data[:5], columns=iris['feature_names']))
1.方差选择法
使用方法选择法,先要计算数据集中的每一个列特征数据的方差,然后根据阈值大小,选择方差大于阈值的特征。如果某一列的特征数据的方差很小,就说明样本在这个特征上基本没有差异。因为所有标签的特征大多数都是相同的,所有这个特征对于样本区分没有什么作用。VarianceThreshold有重要参数threshold,表示方差的阈值,不填默认为0,即删除所有标签都相同的特征数据。下面通过from sklearn.feature_seleftion import VarianceThreshold导入VarianceThreshold,实现对iris数据集进行特征选择,具体代码如下:
from sklearn import datasets
iris = datasets.load_iris()
# print(iris)
# 方差选择法,返回值为特征选择后的数据
from sklearn.feature_selection import VarianceThreshold
# 参数threshold为方差的阈值,这里指定3
vardata = VarianceThreshold(threshold=3).fit_transform(iris.data)
print(vardata[:5])
print(vardata.shape)
# 结论:从输出结果来看,通过方差选择法选择的是peatl length(花瓣长度)
2.相关系数法
使用相关系数法,先要计算各个特征对目标值得相关系数,相关系数的计算公式为使用sklearn的feature_selection模块中的SelectKBest,计算每一个列特征数据的相关系数,再结合相关系数来选择特征。相关系数越大,说明两个变量之间的关系就越强。在SelectKBest中需要指定参数k,也就是选择的特征个数,即从所有的特征中选择k个最好的特征。下面通过相关系数法实现对Iris数据集进行特征选择,具体代码如下:
import numpy as np
from sklearn.feature_selection import SelectKBest
from scipy.stats import pearsonr
# 第一个参数为计算评估特征是否好的函数,该函数输入特征矩阵和目标向量
# 输出二元组(评分,P值)的数组,数组第i项为第i个特征的评分和P值
# 在此定义为计算相关系数
f = lambda X, Y: np.array(list(map(lambda x: pearsonr(x, Y)[0], X.T))).T
# 参数k为选择的特征个数
print(SelectKBest(f, k=2).fit_transform(iris.data, iris.target)[:5])
3.卡方检验
卡方检验是一种判断样本是否符合特定分布的非参数检验方法,用于检验观察值与期望值是否吻合。统计学家皮尔逊认为,
实际观察次数与伦理次数之差的平方再除以理论次数所得的统计量,近似服从卡方分布。
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
# 选择k个最好的特征,返回选择特征后的数据
print(SelectKBest(chi2, k=2).fit_transform(iris.data, iris.target)[:5])
二、Wrapper包装法
装法也是一个特征选择和算法训练同时进行的方法,与嵌入法十分相似,它也还一个依赖于算法自身的选择,比如coef_和feature_importances_属性来完成特征选择,不同的是,我们往往使用一个目标函数作为黑盒来帮助我们选取特征,而不是自己输入某个评估指标或统计量的阈值。包装法在初始特征集上训练评估器,并且通过coef_和feature_importances_属性获得每个特征的重要性,然后,从当前的一组特征中修剪最不重要的特征,接着在修剪过的集合上递归地重复该过程,直到最终得到所需数量的特征。区别于过滤法和嵌入法的易车训练解决所有问题,包装法需要使用特征子集进行多次训练,因此他所需要的计算成本最高。
from sklearn.feature_selection import RFE
from sklearn.linear_model import LogisticRegression
# 递归特征消除法,返回特征选择后的数据
# 参数estimator为基模型,这里选择逻辑回归
# 参数n_features_to_select为选择的特征个数
print(RFE(estimator=LogisticRegression(), n_features_to_select=3).fit_transform(
iris.data, iris.target)[:5])
# 从输出结果来看,通过Wrapper包装法选择的是sepal length(花萼长度)、petal length(花瓣长度)和petal
# width(花瓣宽度)。
三、Embedded嵌入法
Embedded嵌入法利用机器学习模型进行训练,得到各个特征的权值系数,然后根据权值系数从大到小来选择特征。类似于过滤法,但它是通过机器学习训练来确定特征,而不是直接通过统计学指标来确定特征。常用的Embedded嵌入法主要有基于惩罚项的模型的嵌入法和基于树模型的嵌入法。
1.基于惩罚项的模型的嵌入法对于基于惩罚项的模型的嵌入法来说,正则化惩罚项越大,特征在模型中对应的系数就会越小。正则化主要有L1正则化和L2正则化,因此也有L1惩罚项和L2惩罚项。下面使用sklearn的feature_selection模块中的SelectFromModel,并结合带L1惩罚项和L2惩罚项的逻辑回归模型,实现对Iris数据进行特征选择,具体代码如下:
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
# 基于L1惩罚项的逻辑回归作为基模型的特征选择
print('基于L1惩罚项的逻辑回归:\n' + str(SelectFromModel(LogisticRegression(penalty="l2", C=0.1))
.fit_transform(iris.data, iris.target)[:5]) + '\n')
# 默认是L2惩罚项,penalty=’l2‘
print('基于L2惩罚项的逻辑回归:\n' + str(SelectFromModel(LogisticRegression(C=0.1)).fit_transform
from sklearn.feature_selection import SelectFromModel
from sklearn.linear_model import LogisticRegression
# 基于L1惩罚项的逻辑回归作为基模型的特征选择
print('基于L1惩罚项的逻辑回归:\n' + str(SelectFromModel(LogisticRegression(penalty="l2", C=0.1))
.fit_transform(iris.data, iris.target)[:5]) + '\n')
# 默认是L2惩罚项,penalty=’l2‘
print('基于L2惩罚项的逻辑回归:\n'+str(SelectFromModel(LogisticRegression(C=0.1)).fit_transform(iris.data, iris.target)[:5]))
2.基于树模型的嵌入法
from sklearn.feature_selection import SelectFromModel
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
# 基于决策树作为基模型的特征选择
print('基于决策树作为基模型的特征选择:\n'+str(SelectFromModel(DecisionTreeClassifier()).
fit_transform(iris.data, iris.target)[:5])+'\n')
# 基于随机森林作为基模型的特征选择
print('基于随机森林作为基模型的特征选择:\n'+str(SelectFromModel(RandomForestClassifier()).
fit_transform(iris.data, iris.target)[:5]) + '\n')
r(SelectFromModel(RandomForestClassifier()).
fit_transform(iris.data, iris.target)[:5]) + '\n')
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)