複数のフィーチャ変換ステージからなるパイプライン(2.0.1)があります。スパーク:OneHotエンコーダとパイプライン(フィーチャ次元の問題)
これらのステージの一部は、OneHotエンコーダです。アイデア:整数ベースのカテゴリをn個の独立したフィーチャに分類する。
パイプラインモデルを訓練し、それを使ってすべての動作をうまく予測するとき。しかし、訓練されたパイプラインモデルを格納して再ロードすると、問題が発生します。
保存された '訓練された' OneHotエンコーダは、そこにいくつのカテゴリがあるかを追跡しません。ロードされたモデルを使用して予測すると、いくつのカテゴリがあるかが再判定され、トレーニングフィーチャスペースと予測フィーチャスペースのサイズ(ディメンション)が異なります。ツェッペリンのノートブックで実行すると、以下のコード例を参照してください。
import org.apache.spark.ml.feature.OneHotEncoder
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.PipelineModel
// Specifying two test samples, one with class 5 and one with class 3. This is OneHot encoded into 5 boolean features (sparse vector)
// Adding a 'filler' column because createDataFrame doesnt like single-column sequences and this is the easiest way to demo it ;)
val df = spark.createDataFrame(Seq((5, 1), (3, 1))).toDF("class", "filler")
val enc = new OneHotEncoder()
.setInputCol("class")
.setOutputCol("class_one_hot")
val pipeline = new Pipeline()
.setStages(Array(enc))
val model = pipeline.fit(df)
model.transform(df).show()
/*
+-----+------+-------------+
|class|filler|class_one_hot|
+-----+------+-------------+
| 5| 1|(5,[],[]) |
| 3| 1|(5,[3],[1.0])|
+-----+------+-------------+
Note: Vector of size 5
*/
model.write.overwrite().save("s3a://one-hot")
val loadedModel = PipelineModel.load("s3a://one-hot")
val df2 = spark.createDataFrame(Seq((3, 1))).toDF("class", "output") // When using the trained model our input consists of one row (prediction engine style). The provided category for the prediction feature set is category 3
loadedModel.transform(df2).show()
/*
+-----+------+-------------+
|class|output|class_one_hot|
+-----+------+-------------+
| 3| 1|(3,[],[]) |
+-----+------+-------------+
Note: Incompatible vector of size 3
*/
私がこの連載をサポートし、私自身OneHotエンコーダをしないことを好むだろう
、私は箱から出して使用することができます任意の選択肢があるのですか?