特征选择 Feature Selection - Ex 1: Pipeline Anova SVM

优质
小牛编辑
129浏览
2023-12-01

http://scikit-learn.org/stable/auto_examples/feature_selection/feature_selection_pipeline.html

此机器学习范例示范伫列的使用,依照顺序执行ANOVA挑选主要特征,并且使用C-SVM来计算特征的权重与预测。

  1. 使用 make_classification 建立模拟资料
  2. 使用 SelectKBest 设定要用哪种目标函式,以挑出可提供信息的特征
  3. 使用 SVC 设定支持向量机为分类计算以及其核函数
  4. make_pipeline 合併 SelectKBest物件 与 SVC物件
  5. fit 做训练,并且以 predict 来做预测

(一)建立模拟资料

在选择特征之前需要有整理好的特征与目标资料。在此范例中,将以make_classification功能建立特征与目标。该功能可以依照使用者想模拟的情况,建立含有不同特性的模拟资料,像是总特征数目,其中有几项特征含有目标资讯性、目标聚集的程度、目标分为几类等等的特性。

  1. # import some data to play with
  2. X, y = samples_generator.make_classification(
  3. n_features=20, n_informative=3, n_redundant=0, n_classes=4,
  4. n_clusters_per_class=2)

在本范例,我们将X建立为一个有20个特征的资料,其中有3种特征具有目标资讯性,0个特征是由目标资讯性特征所产生的线性组合,目标分为4类,而每个分类的目标分布为2个群集。

(二)选择最好的特征

在机器学习的训练之前,可以藉由统计或指定评分函数,算出特征与目标之间的关係,并挑选出最具有关係的特征作为训练的素材,而不直接使用所有特征做为训练的素材。

其中一种方法是统计特征与目标之间的F-score做为评估分数,再挑选F-score最高的几个特征作为训练素材。我们可以用 SelectKBest() 来建立该功能的运算物件。

  1. # ANOVA SVM-C
  2. # 1) anova filter, take 3 best ranked features
  3. anova_filter = SelectKBest(f_regression, k=3)

SelectKBest()的第一项参数须给定评分函数,在本范例是设定为f_regression 。第二项参数代表选择评估分数最高的3个特征做为训练的素材。建立完成后,即可用物件内的方法.fit_transform(X,y) 来提取被选出来的特征。

(三)以伫列方式来设定支持向量机分类法运算物件

Scikit-lenarn的支持向量机分类涵式库提供使用简单易懂的指令,只要用 SVC() 建立运算物件后,便可以用运算物件内的方法 .fit().predict() 来做训练与预测。

本范例在建立运算物件后,不直接用SelectKBest().fit_transform() 提出训练素材。而是以 make_pipeline()合併先前设定好的两个运算物件。再执行.fit().predict()来完成训练与预测的动作。

  1. # 2) svm
  2. clf = svm.SVC(kernel='linear')
  3. anova_svm = make_pipeline(anova_filter, clf)
  4. anova_svm.fit(X, y)
  5. anova_svm.predict(X)

当我们以伫列建立好的运算物件,就可以直接给定所有的特征资料与目标资料做训练与预测。在训练过程中,会依照给定的特征素材数目从特征资料中挑出特征素材。预测时,也会从预测资料中挑出对应特征素材的资料来做预测判断。

若是将SelectKBest()SVC()物件分开来执行,当 SVC()物件在做学习时给定的特征即为被选出来的特征素材数目。那预测的时候也必须从预测资料中,挑出被SelectKBest()选出来的特征来给SVC()做预测。


(四)原始码

Python source code: feature_selection_pipeline.py

  1. from sklearn import svm
  2. from sklearn.datasets import samples_generator
  3. from sklearn.feature_selection import SelectKBest, f_regression
  4. from sklearn.pipeline import make_pipeline
  5. # import some data to play with
  6. X, y = samples_generator.make_classification(
  7. n_features=20, n_informative=3, n_redundant=0, n_classes=4,
  8. n_clusters_per_class=2)
  9. # ANOVA SVM-C
  10. # 1) anova filter, take 3 best ranked features
  11. anova_filter = SelectKBest(f_regression, k=3)
  12. # 2) svm
  13. clf = svm.SVC(kernel='linear')
  14. anova_svm = make_pipeline(anova_filter, clf)
  15. anova_svm.fit(X, y)
  16. anova_svm.predict(X)

(五)函式用法

make_classification() 的参数

  1. sklearn.datasets.make_classification( n_samples=100,
  2. n_features=20,
  3. n_informative=2,
  4. n_redundant=2,
  5. n_repeated=0,
  6. n_classes=2,
  7. n_clusters_per_class=2,
  8. weights=None,
  9. flip_y=0.01,
  10. class_sep=1.0,
  11. hypercube=True,
  12. shift=0.0,
  13. scale=1.0,
  14. shuffle=True,
  15. random_state=None)

参数:

  • n_samples :
  • n_fratures : 总特征数目
  • n_informative: 有意义的特征数目
  • n_redundant : 产生有意义特征的随机线性组合
  • n_repeated
  • n_classes: 共分类为几类
  • n_clusters_per_class: 一个类群有几个群组分布
  • weights :
  • flip_y :
  • class_sep :
  • hypercube :
  • shift :
  • scale :
  • shuffle :
  • random_state :

输出:

  • X : 特征矩阵资料
  • Y : 对应目标资料

类似的功能:

make_blobs

make_gaussian_quantiles


SelectKBest() 的参数

SelectKBest 的使用:

  • 选择最好的特征(目标函式, 特征个数)
  • 目标函式: 测试X与Y之间关係,须提供F score与p-value
  • 特征个数: 最好的特征个数

f_regression 的使用:

  • f_regression(X,y)
  • 输入X与y
  • 输出F score与p-value