コンテキスト: StringIndexer を使用してすべてのカテゴリ値にインデックスが付けられたデータ フレームがあります。
val categoricalColumns = df.schema.collect { case StructField(name, StringType, nullable, meta) => name }
val categoryIndexers = categoricalColumns.map {
col => new StringIndexer().setInputCol(col).setOutputCol(s"${col}Indexed")
}
次に、VectorAssembler を使用して、すべての特徴列 (インデックス付きのカテゴリ列を含む) をベクトル化しました。
val assembler = new VectorAssembler()
.setInputCols(dfIndexed.columns.diff(List("label") ++ categoricalColumns))
.setOutputCol("features")
分類器といくつかの追加手順を適用すると、ラベル、特徴、および予測を含むデータ フレームが完成します。インデックス付きの値を元の文字列形式に変換するために、特徴ベクトルを個別の列に拡張したいと考えています。
val categoryConverters = categoricalColumns.zip(categoryIndexers).map {
colAndIndexer => new IndexToString().setInputCol(s"${colAndIndexer._1}Indexed").setOutputCol(colAndIndexer._1).setLabels(colAndIndexer._2.fit(df).labels)
}
質問:これを行う簡単な方法はありますか、または何らかの方法で予測列をテスト データ フレームにアタッチする最善の方法はありますか?
私が試したこと:
val featureSlicers = categoricalColumns.map {
col => new VectorSlicer().setInputCol("features").setOutputCol(s"${col}Indexed").setNames(Array(s"${col}Indexed"))
}
これを適用すると、必要な列が得られますが、それらは Vector 形式 (意図されているとおり) であり、Double 型ではありません。
編集: 目的の出力は、元のデータフレーム(つまり、インデックスではなく文字列としてのカテゴリ機能)であり、予測されたラベル(私の場合は0または1)を示す追加の列があります。
たとえば、分類子の出力が次のようになったとします。
+-----+---------+----------+
|label| features|prediction|
+-----+---------+----------+
| 1.0|[0.0,3.0]| 1.0|
+-----+---------+----------+
各機能に VectorSlicer を適用すると、次のようになります。
+-----+---------+----------+-------------+-------------+
|label| features|prediction|statusIndexed|artistIndexed|
+-----+---------+----------+-------------+-------------+
| 1.0|[0.0,3.0]| 1.0| [0.0]| [3.0]|
+-----+---------+----------+-------------+-------------+
これは素晴らしいことですが、次のものが必要です。
+-----+---------+----------+-------------+-------------+
|label| features|prediction|statusIndexed|artistIndexed|
+-----+---------+----------+-------------+-------------+
| 1.0|[0.0,3.0]| 1.0| 0.0 | 3.0 |
+-----+---------+----------+-------------+-------------+
次に、IndexToString を使用して次のように変換できるようにします。
+-----+---------+----------+-------------+-------------+
|label| features|prediction| status | artist |
+-----+---------+----------+-------------+-------------+
| 1.0|[0.0,3.0]| 1.0| good | Pink Floyd |
+-----+---------+----------+-------------+-------------+
あるいは:
+-----+----------+-------------+-------------+
|label|prediction| status | artist |
+-----+----------+-------------+-------------+
| 1.0| 1.0| good | Pink Floyd |
+-----+----------+-------------+-------------+