Scikit-Lern数据挖掘 (中篇)

S 4.特征选择(方差阈值特征选择 & 单变量的特征选择 & 循环特征选择 & 基于线性模型的特征选择 & 基于决策树的特征选择)

  • 特征选择的三大方法:
    Filter(过滤式):VarianceThreshold
    Embedded(嵌入式):正则化、决策树
    Wrapper(包裹式):基本不使用

sklearn特征选择API : sklearn.feature_selection ,(即sklearn.feature_selection的作用是特征选择)

sklearn特征选择过滤式API(方差阈值法):sklearn.feature_selection.VarianceThreshold

VarianceThreshold(threshold = 0.0)
训练集方差低于指定threshold的特征将被删除,threshold可取0~10之间的数,根据实际情况设定。默认值保留所有非零方差特征,即删除值相同的特征。

主要记录如何利用处理好的数据进行学习和预测,变量衍生后可能会有数百甚至数千个。为降低模型学习难度,提升训练效率,进行学习之前一般会对变量进行特征工程操作。首先介绍 如何进行特征选择和特征抽取,再是模型学习和预测

Scikit - Learn库中 sklearn.feature_selection 和 sklearn.feature_extraction 的作用是特征选择和特征抽取

S 4.1 方差阈值特征选择(Variance Thresholding)

Scikit-Learn 提供了方差的阈值估计器

先计算各个特征的方差,然后设定阈值,选择方差大于阈值的特征

#使用feature_selection库中的VarianceThreshold类来选择特征的代码
from sklearn.feature_selection import VarianceThreshold

实例:设想我们要删除超过80%的样本数都是0或都是1的所有特征,(由于布尔特征是bernoulli随机变量,所以方差为Var[X] = p*(p-1)),我们可以使用阈值0.8*(1-0.8),代码如下

from sklearn.feature_selection import VarianceThreshold
X = [[0,0,1],
     [0,1,0],
     [1,0,0],
     [0,1,1],
     [0,1,0],
     [0,1,1]]
print('X:')
print(X)
sel = VarianceThreshold(threshold = (.8*(1-.8)))
print("变量筛选后的X:")
X = sel.fit_transform(X)
print(X)

#运行结果:
X:
[[0, 0, 1], [0, 1, 0], [1, 0, 0], [0, 1, 1], [0, 1, 0], [0, 1, 1]]
变量筛选后的X:
[[0 1]
 [1 0]
 [0 0]
 [1 1]
 [1 0]
 [1 1]]
#第一列0超过80%,删除

 

S4.2 单变量的特征选择

原理:单独计算每个变量的某个统计指标,根据该指标进行判断,剔除不重要的指标

sklearn.feature_selection模块中主要有以下两个方法

#feature_selection.SelectKBest:选择指标排名在前n个的变量
#feature_selection.SelectPercentile:选择指标排名在前n%的变量

eg .

可以对样本集使用卡方检测(chi2),进而选择最好的两个特征,如下示例

经典的卡方检验是检验定性自变量对定性因变量的相关性。比如,我们可以对样本进行一次chi2 测试来选择最佳的两项特征:

#对数据集iris的四个变量进行以下操作
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectKBest
from sklearn.feature_selection import chi2
iris = load_iris()
X,y = iris.data,iris.target
print(X.shape)
#结果(150, 4),iris共有150个观测,4个变量

#调用SelectKBest函数进行变量选择
X_new = SelectKBest(chi2,k = 2).fit_transform(X,y)
print(X_new.shape)
#结果(150,2)

S4.3循环特征选择

不单独地检验某个变量的值,而是将其聚集在一起检验。

基本思想:一个集合feature,数量为d, 子集:(2^d )-1,包含空集。通过某一外部学习算法(例:SVM)计算所有子集的validation error,选择error最小的那个子集作为所挑选的特征,此算法由以下两个算法实现:

#sklearn.feature_selection.RFE:递归特征消除法
#sklearn.feature_selection.RFECV:基于交叉验证的递归特征消除法

S4.4基于线性模型的特征选择(L1-based feature selection方法)

原理:在linear regression模型中,有时会得到稀疏解,即很多变量前面的系数都等于0或接近于0,说明这些变量不重要,可以去除,剩下的变量即是多选择的变量

#如下线性回归模型中使用了L1-based feature selection方法选择特征
from sklearn.svm import LinearSVC
from sklearn.datasets import load_iris
from sklearn.feature_selection import SelectFromModel
iris = load_iris()
X,y = iris.data,iris.target
print(X.shape)
# (150,4)
#然后调用线性回归模型进行变量筛选
lsvc = LinearSVC(C=0.01,penalty="l1",dual = False).fit(X,y)
model = SelectFromModel(lsvc,prefit = True)
X_new = model.transform(X)
print(X_new.shape)
#(150,3)筛选了3个变量,删除1个变量

S4.5 基于决策树的特征选择

该方法下,特征选择主要功能是减少特征数量、降维,使模型泛化能力更强,减少过拟合,增强特征和特征值之间的理解,此方法与4类似

 

注:1.数据预处理函数 fit()函数    transform()函数   fit_transform()函数

fit() : 求得训练集X的均值、方差、最大值等固有属性,可理解为一个训练过程

transform() :在fit基础上进行标准化、降维、归一化等操作

fit_transform():fit_transform是fit和transform的组合,既包括了训练又包含了转换

详细移步:https://blog.csdn.net/qq_43201403/article/details/109569373

2.训练集和测试集

训练集用来估计模型中的参数,使模型能够反映现实,进而预测未来或其他未知信息

测试集用来评估模型的预测性能

比如:现有1000个人的身高体重数据,想建立身高体重的线性回归模型,那么可以用900个人的身高体重数据作为测试模型中的参数,来预测剩下的100个人的体重(已知身高)预测值和实际值之间的差就可以衡量模型的预测性能(其中测试集是这100个人的身高体重),但是不能用全部人的身高体重来拟合,会降低预测性能,好比考试题是课后题一样不能检测出真实水平

 

posted @ 2022-04-23 19:15  TY_uni  阅读(146)  评论(0)    收藏  举报