数据挖掘——特征选择
基于统计值的方法(VarianceThreshold):摘要
基于统计值的方法(VarianceThreshold)是一种用于去除无关或冗余特性的特征选择方法。通过计算每个特标的方差σ:
σ表示特标在所有实例中的取值差异程度。
方差σ较小意味着该特标的取值变化不大。
当σ小于给定阈值时,则认为该特标具有较低的区分能力。
通过设置适当的阈值(如1),可以过滤掉方差过低的特标。
编程步骤:
导入库:包括numpy用于科学计算、scipy.stats用于卡方检验、以及sklearn中的VarianceThreshold用于实现该方法。
生成数据集:创建一个包含4个样本、每个样本有4个特标的矩阵。
初始化模型:创建一个VarianceThreshold实例,并设置方差阈值为1。
训练模型并筛选特征:调用模型的fit()方法计算各特标的方差,并使用transform()方法筛选出符合要求的特标。
输出结果:打印原始数据集和筛选后的数据形状。
示例代码运行结果:
Lower noise: 0.9978 Higher noise: -0.0367 Linear correlation: 1.0 Non-Linear correlation: -0.0367 chisq-statistic=655.978, p-value=0, df=1 expected_frep=... [[100 1 2 3] [100 4 5 6] [100 7 8 9] [101 ...]] [[101 ...]]
最终输出展示了原始数据集及其经过筛选后的形状变化。
第1关:基于统计值的方法(VarianceThreshold)
本次任务要求通过掌握常见的一类特征选择过滤方法,在实际操作中学会对数据进行去除无关冗余属性的具体处理步骤。
为完成当前任务目标,需掌握若干种利用统计值方法进行特征选择的技术.
基于统计量的方法,
采用泊松相关性的手段,
采用卡方检验方法,
利用方差分析法,
几种常见函数的应用场景包括:
特征在训练数据中的取值标准差 σ:
σ 小,意味着特征在所有实例的取值差别不大,特征的区分能力不强。
σ 小于给定阈值,该特征被过滤。
import numpy as np # 导入numpy科学计算库
from scipy.stats import pearsonr # 调用计算相关性系数库
size= 30 # 数据集规模
np.random.seed(20) # 随机数种子
x = np.random.normal(0,1,size) # 随机生成数据服从正态分布
print("Lower noise", pearsonr(x,x+np.random.normal(0,1,size)))
print("Higher noise",pearsonr(x,x+np.random.normal(0,10,size)))
print("Linear correlation",pearsonr(x,2*x)) # 计算y=2x相关性系数
print("Non-Linear correlation",pearsonr(x,x*x))
from scipy.stats import chi2_contingency # 做卡方检验
import numpy as np # 计算
X_data = np.array([[32, 27], [39, 21]]) # 生成数据集
# ********** Begin ********** #
# 进行卡方检验
kf = chi2_contingency(X_data)
# ********** End ********** #
print('chisq-statistic=%.4f, p-value=%.4f, df=%i expected_frep=%s'%kf) # 打印输出值
from sklearn.feature_selection import VarianceThreshold
X=[[100,1,2,3],
[100,4,5,6],
[100,7,8,9],
[101,11,12,13]]
# ********** Begin ********** #
# 调用VarianceThreshold实例化对象selector
selector=VarianceThreshold(1)
# ********** End ********** #
selector.fit(X)
Y = selector.transform(X)
print(Y)
from sklearn.feature_selection import SelectKBest # 导入SelectKBest
from sklearn.feature_selection import chi2 # 过滤统计函数基于卡方检验
X = [[100,1,2,3],
[100,4,5,6],
[100,7,8,9],
[101,11,12,13]]
y=[0,1,1,0]
# ********** Begin ********** #
# 训练模型进行特征选择
X = SelectKBest(chi2,k=2).fit_transform(X,y)
# ********** End ********** #
print(X)
第二环节:以该模型为基础的(递归特征选择)策略(Recursive Feature Elimination)
任务描述
本关任务:学习并了解使用基于 RFE 模型进行特征选择。
相关知识
为了完成本关任务,你需要掌握:
掌握 RFE 模型的核心理论,
基于 REF 模型对手写字体识别数据集进行初步属性筛选。
递归特征消除法(Recursive Feature Elimination, RFE)是一种用于选择重要特征的技术。
基于学习器提供的 coef_\ast 以及 feature\_importances\_\ast 两个属性值来评估各个特性的相对重要性。
随后从当前特征求异集中剔除重要性最低的特性。
在特征求异集中不断重复上述过程直至剩余所需数量的关键特性。
基于线性模型的特征选择:
基于本节所学知识框架,在支持向量机(SVM)结合特征选择(RFE)的方法下,在右侧指定的编译器环境中指定的代码块范围进行代码编写,请通过单击评测按钮即可执行测试。
测试说明
平台会对你编写的代码进行测试:
预期输出:
数据集X的形状:(1797, 64)
[[64 50 31 23 10 17 34 51]
[57 37 30 43 14 32 44 52]
[54 41 19 15 28 8 39 53]
[55 45 9 18 20 38 1 59]
[63 42 25 35 29 16 2 62]
[61 40 5 11 13 6 4 58]
[56 47 26 36 24 3 22 48]
[60 49 7 27 33 21 12 46]]
开始你的任务吧,祝你成功!
from sklearn.svm import SVC # 导入支持向量机svc库
# 手写识别字体集
from sklearn.datasets import load_digits
from sklearn.feature_selection import RFE # RFE函数
# 导入数据集
digits = load_digits()
# 改变数据集形状
X = digits.images.reshape((len(digits.images), -1))
# 目标值
Y = digits.target
print(f'数据集X的形状:{X.shape}')
# 创建RFE模型基于线性SVC
svc = SVC(kernel="linear", C=1)
# ********** Begin ********** #
# 训练模型
rfe = RFE(estimator=svc,n_features_to_select=1,step=1)
rfe.fit(X,Y)
# 挑选出被选出的特征
ranking = rfe.ranking_.reshape(digits.images[0].shape)
# ********** End ********** #
print(ranking)
第3关:手写字体识别中的特征选择
任务描述
本关任务:学会如何对手写字体数据集进行特征选择
相关知识
为了完成本关任务,你需要掌握:
了解SelectFromModel函数,并对数字图像数据集执行特征筛选。
参数:
- name表示输入特征向量的维度数
- thresholds设定选择的重要度阈值
- strategy指定采用的选择策略
- normalize决定是否对重要性指标进行归一化处理
核心估计量用于构建基础模型;该阈值是关键指标;该属性指示预训练状态;属性
estimator_:估算器。
threshold_:用于特征选择的阈值。
方法:
fit(X,[,y]):基于输入数据X拟合模型参数; transform(X):对输入数据X进行标准化处理,并对...
import numpy as np # 计算
from sklearn.datasets import load_digits # 手写识别字体数据集
from sklearn.feature_selection import SelectFromModel # 特征选择
from sklearn.linear_model import LassoCV # 基模型
# 加载数据集
diabetes = load_digits()
# 训练集和目标集
X = diabetes.data
y = diabetes.target
# 找到特征
feature_names = ['pixel_0_0', 'pixel_0_1', 'pixel_0_2', 'pixel_0_3', 'pixel_0_4', 'pixel_0_5', 'pixel_0_6', 'pixel_0_7', 'pixel_1_0', 'pixel_1_1', 'pixel_1_2', 'pixel_1_3', 'pixel_1_4', 'pixel_1_5', 'pixel_1_6', 'pixel_1_7', 'pixel_2_0', 'pixel_2_1', 'pixel_2_2', 'pixel_2_3', 'pixel_2_4', 'pixel_2_5', 'pixel_2_6', 'pixel_2_7', 'pixel_3_0', 'pixel_3_1', 'pixel_3_2', 'pixel_3_3', 'pixel_3_4', 'pixel_3_5', 'pixel_3_6', 'pixel_3_7', 'pixel_4_0', 'pixel_4_1', 'pixel_4_2', 'pixel_4_3', 'pixel_4_4', 'pixel_4_5', 'pixel_4_6', 'pixel_4_7', 'pixel_5_0', 'pixel_5_1', 'pixel_5_2', 'pixel_5_3', 'pixel_5_4', 'pixel_5_5', 'pixel_5_6', 'pixel_5_7', 'pixel_6_0', 'pixel_6_1', 'pixel_6_2', 'pixel_6_3', 'pixel_6_4', 'pixel_6_5', 'pixel_6_6', 'pixel_6_7', 'pixel_7_0', 'pixel_7_1', 'pixel_7_2', 'pixel_7_3', 'pixel_7_4', 'pixel_7_5', 'pixel_7_6', 'pixel_7_7']
print(f'X的数据形状:{X.shape}')
# ********** Begin ********** #
# LassoCV实例化对象并训练数据
clf = LassoCV().fit(X, y)
# 计算特征importance
importance = np.abs(clf.coef_)
# ********** End ********** #
# 找到并根据大小排序,输出最重要的两个特征
idx_third = importance.argsort()[-3]
threshold = importance[idx_third] + 0.01
idx_features = (-importance).argsort()[:2]
name_features = np.array(feature_names)[idx_features]
print('选择的特征为: {}'.format(name_features))
# ********** Begin ********** #
# 基于SelectFromModel函数最终的特征选择
sfm = SelectFromModel(clf, threshold=threshold)
sfm.fit(X, y)
X_transform = sfm.transform(X)
# ********** End ********** #
print(f'选择后的数据形状为:{X_transform.shape}')
