在spark中进行特征选择后使测试数据的特征与训练数据相同

Making the features of test data same as train data after featureselection in spark

我正在研究 Scala。我有一个很大的问题,ChiSqSelector 似乎成功地降低了维度,但我无法确定减少了哪些特征,哪些特征被保留了下来。我怎么知道减少了哪些功能?

[WrappedArray(a, b, c),(5,[1,2,3],[1,1,1]),(2,[0],[1])]
[WrappedArray(b, d, e),(5,[0,2,4],[1,1,2]),(2,[1],[2])]
[WrappedArray(a, c, d),(5,[0,1,3],[1,1,1]),(2,[0],[1])]

PS: 当我想使测试数据与特征选择的训练数据相同时,我发现我不知道如何在 scala 中做到这一点。

如果你使用 MLlib 版本的 ChiSqSelector 你可以 selectedFeatures:

mllibModel: org.apache.spark.mllib.feature.ChiSqSelectorModel = ???
val features: Array[Int] = mllib.selectedFeatures

然而,当您使用测试数据时,最好使用在训练数据集上训练的选择器,不要为手动选择而烦恼。

val testData: RDD[org.apache.spark.mllib.linalg.Vector] = ???
mllibModel.transform(testData)

同样的规则适用于 ML 版本。您可以使用 selectedFeatures 来提取索引数组:

val mlModel: org.apache.spark.ml.feature.ChiSqSelectorModel = ???
val features: Array[Int] = mlModel.selectedFeatures

但最好保留模型并在新数据上重用:

val testData: RDD[org.apache.spark.sql.DataFrame] = ???
mlModel.transform(testData)

如果您想要一个人类可读的特征列表,您可以在转换后分析列元数据,如

所示