【版权声明】博客内容由厦门大学数据库实验室拥有版权,未经允许,请勿转载!
[返回Spark教程首页]
特征选择(Feature Selection)指的是在特征向量中选择出那些“优秀”的特征,组成新的、更“精简”的特征向量的过程。它在高维数据分析中十分常用,可以剔除掉“冗余”和“无关”的特征,提升学习器的性能。
特征选择方法和分类方法一样,也主要分为有监督(Supervised)和无监督(Unsupervised)两种,卡方选择则是统计学上常用的一种有监督特征选择方法,它通过对特征和真实标签之间进行卡方检验,来判断该特征和真实标签的关联程度,进而确定是否对其进行选择。
和ML库中的大多数学习方法一样,ML中的卡方选择也是以estimator
+transformer
的形式出现的,其主要由ChiSqSelector
和ChiSqSelectorModel
两个类来实现。
在进行实验前,首先进行环境的设置。引入卡方选择器所需要使用的类:
import org.apache.spark.ml.feature.{ChiSqSelector, ChiSqSelectorModel}
import org.apache.spark.ml.linalg.Vectors
默认名为spark
的SparkSession
已经创建。
随后,创造实验数据,这是一个具有三个样本,四个特征维度的数据集,标签有1,0两种,我们将在此数据集上进行卡方选择:
scala> val df = spark.createDataFrame(Seq(
| (1, Vectors.dense(0.0, 0.0, 18.0, 1.0), 1),
| (2, Vectors.dense(0.0, 1.0, 12.0, 0.0), 0),
| (3, Vectors.dense(1.0, 0.0, 15.0, 0.1), 0)
| )).toDF("id", "features", "label")
df: org.apache.spark.sql.DataFrame = [id: int, features: vector ... 1 more field]
scala> df.show()
+---+------------------+-----+
| id| features|label|
+---+------------------+-----+
| 1|[0.0,0.0,18.0,1.0]| 1|
| 2|[0.0,1.0,12.0,0.0]| 0|
| 3|[1.0,0.0,15.0,0.1]| 0|
+---+------------------+-----+
现在,用卡方选择进行特征选择器的训练,为了观察地更明显,我们设置只选择和标签关联性最强的一个特征(可以通过setNumTopFeatures(..)
方法进行设置):
scala> val selector = new ChiSqSelector().
| setNumTopFeatures(1).
| setFeaturesCol("features").
| setLabelCol("label").
| setOutputCol("selected-feature")
selector: org.apache.spark.ml.feature.ChiSqSelector = chiSqSelector_688a180ccb71
scala> val selector_model = selector.fit(df)
selector_model: org.apache.spark.ml.feature.ChiSqSelectorModel = chiSqSelector_688a180ccb71
用训练出的模型对原数据集进行处理,可以看见,第三列特征被选出作为最有用的特征列:
scala> val selector_model = selector.fit(df)
selector_model: org.apache.spark.ml.feature.ChiSqSelectorModel = chiSqSelector_688a180ccb71
scala> val result = selector_model.transform(df)
result: org.apache.spark.sql.DataFrame = [id: int, features: vector ... 2 more fields]
scala> result.show(false)
+---+------------------+-----+----------------+
|id |features |label|selected-feature|
+---+------------------+-----+----------------+
|1 |[0.0,0.0,18.0,1.0]|1.0 |[18.0] |
|2 |[0.0,1.0,12.0,0.0]|0.0 |[12.0] |
|3 |[1.0,0.0,15.0,0.1]|0.0 |[15.0] |
+---+------------------+-----+----------------+