以下は、RandomForest マルチクラス分類モデルのコードです。コードに見られるように、CSV ファイルから読み取り、さまざまな変換を行っています。
カテゴリの最大数を計算し、それをパラメーターとして RF に渡します。これにはかなりの時間がかかります。設定するパラメーターや、モデルが最大カテゴリを自動的に推測する簡単な方法はありますか?1000 を超える可能性があるため、それらを省略することはできません。
その場合、StringIndexer は機能しないため、予測のために新しいデータの見えないラベルを処理するにはどうすればよいですか。以下のコードは単なるデータの分割ですが、将来的には新しいデータも導入する予定です
// Need to predict 2 classes val cols_to_predict=Array("Label1","Label2") // ID col val omit_cols=Array("Key") // reading the csv file val data = sqlContext.read .format("com.databricks.spark.csv") .option("header", "true") // Use first line of all files as header .option("inferSchema", "true") // Automatically infer data types .load("abc.csv") .cache() // creating a features DF by droppping the labels so that I can run all // the cols through String Indexer val features=data.drop("Label1").drop("Label2").drop("Key") // Since I do not know my max categories possible, I find it out // and use it for maxBins parameter in RF val distinct_col_counts=features.columns.map(x => data.select(x).distinct().count ).max val transformers: Array[org.apache.spark.ml.PipelineStage] = features.columns.map( cname => new StringIndexer().setInputCol(cname).setOutputCol(s"${cname}_index").fit(features) ) val assembler = new VectorAssembler() .setInputCols(features.columns.map(cname => s"${cname}_index")) .setOutputCol("features") val labelIndexer2 = new StringIndexer() .setInputCol("prog_label2") .setOutputCol("Label2") .fit(data) val labelIndexer1 = new StringIndexer() .setInputCol("orig_label1") .setOutputCol("Label1") .fit(data) val rf = new RandomForestClassifier() .setLabelCol("Label1") .setFeaturesCol("features") .setNumTrees(100) .setMaxBins(distinct_col_counts.toInt) val labelConverter = new IndexToString() .setInputCol("prediction") .setOutputCol("predictedLabel") .setLabels(labelIndexer1.labels) // Split into train and test val Array(trainingData, testData) = data.randomSplit(Array(0.7, 0.3)) trainingData.cache() testData.cache() // Running only for one label for now Label1 val stages: Array[org.apache.spark.ml.PipelineStage] =transformers :+ labelIndexer1 :+ assembler :+ rf :+ labelConverter //:+ labelIndexer2 val pipeline=new Pipeline().setStages(stages) val model=pipeline.fit(trainingData) val predictions = model.transform(testData)