已有训练集和测试集的情况下构建决策树模型 scala代码
时间: 2023-09-05 20:07:08 浏览: 169
假设我们已经有一个训练集和一个测试集,每个样本有多个特征和一个标签。下面是使用Scala和Spark MLlib构建决策树模型的代码示例:
```scala
import org.apache.spark.ml.Pipeline
import org.apache.spark.ml.classification.DecisionTreeClassifier
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorAssembler}
import org.apache.spark.sql.SparkSession
// 创建SparkSession
val spark = SparkSession.builder()
.appName("DecisionTreeExample")
.getOrCreate()
// 读取训练集和测试集
val trainData = spark.read.format("csv")
.option("header", "true")
.option("inferSchema", "true")
.load("path/to/train/data.csv")
val testData = spark.read.format("csv")
.option("header", "true")
.option("inferSchema", "true")
.load("path/to/test/data.csv")
// 将特征列组合成一个向量列
val featureCols = trainData.columns.filter(_ != "label")
val assembler = new VectorAssembler()
.setInputCols(featureCols)
.setOutputCol("features")
// 将标签列转换成数值列
val labelIndexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
// 创建决策树分类器
val dt = new DecisionTreeClassifier()
.setLabelCol("indexedLabel")
.setFeaturesCol("features")
// 将预测结果转换成标签
val labelConverter = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
.setLabels(labelIndexer.fit(trainData).labels)
// 创建Pipeline并训练模型
val pipeline = new Pipeline()
.setStages(Array(assembler, labelIndexer, dt, labelConverter))
val model = pipeline.fit(trainData)
// 在测试集上进行预测并评估模型
val predictions = model.transform(testData)
val evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("indexedLabel")
.setPredictionCol("prediction")
.setMetricName("accuracy")
val accuracy = evaluator.evaluate(predictions)
println(s"Test Error = ${1 - accuracy}")
// 销毁SparkSession
spark.stop()
```
这段代码首先创建了SparkSession,然后使用`read`方法从CSV文件中读取训练集和测试集数据。接着,将特征列组合成一个向量列,并将标签列转换成数值列。然后,创建一个决策树分类器,并将它与前面的特征向量组合在一起构成一个Pipeline。最后,使用训练集训练模型,并在测试集上进行预测和评估。
阅读全文