还是按照以前交代的,通过接口配置sc,忘记的可查看
通过sqlcontext直接创建dataframe,数据格式的为libsvm,
label: double, features: vector
label即为分类标签,features是特征,以vector的方式进行保存
// 加载数据,并且进行格式化,数据格式为label: double, features: vector
val data: DataFrame = sqlContext.read.format("libsvm").load("data/sample_libsvm_data.txt")
数据下载链接:https://pan.baidu.com/s/1dFOy9zj 密码:l96r
对加载文件的相关列进行映射,映射为ml column
// 将输入列映射为ml列
// 将所有数据进行映射
val labelIndexer = new StringIndexer()
.setInputCol("label")
.setOutputCol("indexedLabel")
.fit(data)
看一下StringIndexer的解释
A label indexer that maps a string column of labels to an ML column of label indices. If the input column is numeric, we cast it to string and index the string values. The indices are in [0, numLabels), ordered by label frequencies. So the most frequent label gets index 0.
对特征也进行相关的转化
// Automatically identify categorical features, and index them.
// 自动识别分类特征,并且对其建立索引
// Set maxCategories so features with > 4 distinct values are treated as continuous.
//通过setMaxCategories自动识别哪些特征是类别型的,并将原始值转化为类别索引。其他特征认为是连续型的不做为分类特征
//不要把所有特征都作为分类特征来使用
val featureIndexer = new VectorIndexer()
.setInputCol("features")
.setOutputCol("indexedFeatures")
.setMaxCategories(4)
.fit(data)
训练模型
// 训练随机森林模型,labal列为上文的labelIndexer,特征列为indexedFeatures
val rf = new RandomForestClassifier()
.setLabelCol("indexedLabel")
.setFeaturesCol("indexedFeatures")
.setNumTrees(10)
转换label
// 转换索引化之后的label回原始label
val labelConverter = new IndexToString()
.setInputCol("prediction")
.setOutputCol("predictedLabel")
.setLabels(labelIndexer.labels)
因为我们是通过pipline进行的计算,将准备好的数据放入管道
// Chain indexers and forest in a Pipeline
//将特征、label和随机森林模型放入管道
val pipeline = new Pipeline()
.setStages(Array(labelIndexer, featureIndexer, rf, labelConverter))
训练模型,输出预测
// 训练模型
val model = pipeline.fit(trainingData)
// 得到预测
val predictions = model.transform(testData)
// 选择预测之后的列进行展示
predictions.select("predictedLabel", "label", "features").show(5)
predictions.show(5)
计算错误率,并且输出模型
// 选取预测label和实际label来计算错误率
val evaluator = new MulticlassClassificationEvaluator()
.setLabelCol("indexedLabel")
.setPredictionCol("prediction")
.setMetricName("precision")
val accuracy = evaluator.evaluate(predictions)
println("Test Error = " + (1.0 - accuracy))
val rfModel = model.stages(2).asInstanceOf[RandomForestClassificationModel]
println("Learned classification forest model:\n" + rfModel.toDebugString)