Advertisement

数据挖掘——特征选择

阅读量:

基于统计值的方法(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}')

全部评论 (0)

还没有任何评论哟~