2016-04-12 9 views
2

私はScalaを使用しており、StringIndexerを使用してトレーニングセットの各カテゴリにインデックスを割り当てています。各カテゴリの頻度に基づいてインデックスを割り当てます。Spark ML StringIndexer異なるラベルトレーニング/テスト

私のテストデータでは、カテゴリの頻度が異なるため、StringIndexerによってカテゴリに異なるインデックスが割り当てられているため、モデル(Random Forest)が正しく評価されません。

トレーニング/テストデータをまったく同じ方法で処理しており、モデルを保存しません。

私は私がStringIndexerを使用しなければならないようですので、どのように私は私が使用している将来のデータセットを確保します(カテゴリのインデックスを取得することにより)、手動でラベルを作成しようとしたが、

java.lang.IllegalArgumentException: RandomForestClassifier was given input with invalid label column label, without the number of classes specified. See StringIndexer. 

このエラーを取得していますトレーニングセットと同じ方法でカテゴリをテストするためにテストしますか?私試みた回避策のコードを追加

EDITは

これは、データフレームは、MYDATAが

+--------+-----+---------+---------+ 
|category|label|  x|  y| 
+--------+-----+---------+---------+ 
| a|  0.0| -0.166992|-0.256348| 
| b|  1.0| -0.179199| -0.22998| 
| c|  2.0| -0.172119|-0.105713| 
| d|  3.0| -0.064209| 0.050293| 

は私が

val assembler = new VectorAssembler().setInputCols(Array("x, y")).setOutputCol("features") 

変換機能を準備するために、ベクトルアセンブラを使用し、それを呼び出す、次のようになります上記のアセンブラを使用したmydata、features列は

val predValues = assembler.transform(mydata) 

したがって、モデルには2つの列、機能、ラベルが必要です。だから私は自分のラベルをこれに使用したい。 私はpredvalues

val features = sqlContext.sql("SELECT features from predValues") 

から機能を選択して、私のDFから

val labelDF = sqlContext.sql("SELECT label FROM filterFeaturesOnly") 

をラベルを選択して、私は

val featuresAndLabels = features.join(labelDF) 
をモデルに渡す機能やラベルを持っていますので、2つに参加

これは私がモデルに渡しているもので、上記のエラーが発生します。

val label = predValues.join(labelDF) 
+1

あなたのコードで質問を更新できますか? – Vishnu667

+0

@ Vishnu667質問を更新しました。 – other15

答えて

7

あなたは一貫して物事にラベルを付けたい場合は、取り付けstringIndexerを保存する必要があります。

がドキュメントからthis sample codeを考えてみましょう:

val indexer = new StringIndexer() 
    .setInputCol("category") 
    .setOutputCol("categoryIndex") 

val indexed = indexer.fit(df).transform(df) 

indexer.fit(df)作品は、その後transform機能を実行することができStringIndexerModelを返します。ので、代わりに:後で同じ入力に対して同じラベルを取得するためにindexerModel.transform(testDF)を使用できるようになります

val indexerModel = indexer.fit(trainDF) 
val indexed = indexerModel.transform(trainDF) 

+1

これはうまくいった!正確に私が探していたもの、Matthew(あなたの答えをアップアップするのに十分なポイントがない) – other15

関連する問題