说明
某种商品的需求量(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()
}
}