weixin_51570133 2023-03-11 16:40 采纳率: 58.3%
浏览 35

一个关于spark机器学习的问题

以下是我在Linux虚拟机的机器学习代码(参考自林子雨《spark编程基础》官方网站第八章PPT)

import org.apache.spark.sql.Row
import org.apache.spark.sql.SparkSession
import org.apache.spark.ml.linalg.{Vector,Vectors}
import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator
import org.apache.spark.ml.{Pipeline,PipelineModel}
import org.apache.spark.ml.feature.{IndexToString, StringIndexer, VectorIndexer,HashingTF, Tokenizer}
import org.apache.spark.ml.classification.LogisticRegression
import org.apache.spark.ml.classification.LogisticRegressionModel
import org.apache.spark.ml.classification.{BinaryLogisticRegressionSummary, LogisticRegression}
import org.apache.spark.sql.functions;
 import spark.implicits._
case class cars(features: org.apache.spark.ml.linalg.Vector, label:String)
val data = spark.sparkContext.textFile("file:///usr/local/bigdatacase/dataset/jq1.txt").map(_.split("\t")).map(p => cars(Vectors.dense(p(1).toDouble,p(2).toDouble,p(3).toDouble),p(0).toString())).toDF()
data.createOrReplaceTempView("cars")
val df = spark.sql("select * from cars where label ='宝马' or label ='奔驰' or label ='斯柯达'")
df.map(t => t(1)+":"+t(0)).collect().foreach(println)
val labelIndexer = new StringIndexer().setInputCol("label").setOutputCol("indexedLabel").fit(df)
val featureIndexer = new VectorIndexer().setInputCol("features").setOutputCol("indexedFeatures").fit(df)
val Array(trainingData, testData) = df.randomSplit(Array(0.3, 0.7))
val cr = new LogisticRegression().setLabelCol("indexedLabel").setFeaturesCol("indexedFeatures").setMaxIter(100).setRegParam(0.3).setElasticNetParam(0.8)
val labelConverter = new IndexToString().setInputCol("prediction").setOutputCol("predictedLabel").setLabels(labelIndexer.labels)
val crPipeline = new Pipeline().setStages(Array(labelIndexer, featureIndexer, cr, labelConverter))
val crPipelineModel = crPipeline.fit(trainingData)
val crPredictions = crPipelineModel.transform(testData)
crPredictions.select("predictedLabel", "label", "features", "probability").collect().foreach { case Row(predictedLabel: String, label: String,features: Vector, prob: Vector) => println(s"($label, $features) --> prob=$prob, predicted Label=$predictedLabel")}
val evaluator = new MulticlassClassificationEvaluator().setLabelCol("indexedLabel").setPredictionCol("prediction")
val crAccuracy = evaluator.evaluate(crPredictions)


准确率是0.59多,我想提高模型的预测准确率,应该怎么做呢?
当我把val df = spark.sql("select * from cars where label ='宝马' or label ='奔驰' or label ='斯柯达'")换成val df = spark.sql("select * from cars where label ='别克' or label ='宝马' or label ='奔驰' or label ='斯柯达'")时,也就是增多一个标签,准确率只有0.41多,有没有什么办法在增加标签的同时,提高模型的预测准确率呢?

  • 写回答

3条回答 默认 最新

  • CSDN专家-sinJack 2023-03-11 16:44
    关注

    多增加了一个满足条件 label ='别克',准确率更低了?
    检查看看是否存在 label ='别克' 的数据。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 3月11日

悬赏问题

  • ¥15 java幂等控制问题
  • ¥15 海湾GST-DJ-N500
  • ¥15 氧化掩蔽层与注入条件关系
  • ¥15 Django DRF 如何反序列化得到Python对象类型数据
  • ¥15 多数据源与Hystrix的冲突
  • ¥15 如何在线硕士了解,广告太多,希望有真实接触过的人回答下?(标签-学习|关键词-在线硕士)
  • ¥15 zabbix6.4与frp如何进行联动
  • ¥15 如何使用Echarts制作途中时间序列表
  • ¥15 图论相关的数学问题,共10个
  • ¥15 EtherCAT的问题,创建一个XML文件