案例一 预测商品需求量

说明

某种商品的需求量(y,顿),价格(x1,元/千克)和消费收入(x2,元)观测值如下表所示
数据集:
    y,x1,x2
    100|5 1000
    75|7 600
    80|6 1200
    70|6 500
    50|8 30
    65|7 400
    90|5 1300
    100|4 1100
    110|3 1300
    60|9 300

预测代码实现:

package SparkLearning.MLDay01

import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.regression.LinearRegression
import org.apache.spark.sql.SparkSession
import org.apache.spark.{SparkConf, SparkContext}

object MLDemo01 {
  def main(args: Array[String]): Unit = {
    val ss = SparkSession.builder().master("local")
      .appName("lr").getOrCreate()
    val oriData = ss.read.textFile("D://ml/ML.txt")
    //--把数据转成Tuple格式,是为了后期转成SparkSQl的DataFrame
    val parseData = oriData.rdd.map { x =>
      val parts = x.split("\\|")
      val features = parts(1).split(" ")
      (parts(0).toDouble, features(0).toDouble, features(1).toDouble)
    }
    //--转成DF
    val df = ss.createDataFrame(parseData)
    //--定义各列字段名字
    val dfData = df.toDF("y", "x1", "x2")
    //--定义features 字段名
    val featureColum = Array("x1", "x2")
    //--定义VectorAssembler格式,这是MLlib线性回归模型要求的数据形式
    //--此外,要制定特征向量是那几列,以及定义特征向量对应的别称,一般用:features"
    val assembler = new VectorAssembler().setInputCols(featureColum).setOutputCol("features")
    //--将DF转成VectorAssembler格式,后面建模会用到
    val vecDF = assembler.transform(dfData)
    //--建模, 设定自变量(features)和因变量(y)
    //--setFitIntercept(true)表示是否需要计算截距项
    //--fit(数据)是训练生成模型
    val model = new LinearRegression().setFeaturesCol("features").setLabelCol("y").setFitIntercept(true).fit(vecDF)
    //--获取截距项系数
    val intercept = model.intercept
    //--获取模型(目标函数)的系数
    val coef = model.coefficients
    //预测商品需求量
    //--y = -6.* *x1+0.016(x2) +106.36
    //-- 下面表示将样本集带入模型,做预测
    val predict =model.transform(vecDF)
    //--关于模型的检验:可以用多远R方值来检验
    //--R方值越大(最大值是1)越好,说明这个模型对于数据的拟合越好
    //--说明数据模型对于数据的拟合越好,生产环境下,0.55以上,都是可以接受的
     val r2 = model.summary.r2
    println("该模型的R方值: "+r2)
    //--transform(数据)预测数据,测试的数据的格式必须为:VectorAssembler
    val predictionTable = model.transform(vecDF)
    //--查询结果

    val result = predictionTable.selectExpr("features","y","round(prediction,1)as prediction")
    result.foreach(x=>println(x))
    //dfData.createOrReplaceTempView("t1")
    //ss.sql("select * from t1").show()

  }

}

你可能感兴趣的:(案例一 预测商品需求量)