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个人的身高体重),但是不能用全部人的身高体重来拟合,会降低预测性能,好比考试题是课后题一样不能检测出真实水平

浙公网安备 33010602011771号