Spark MLlib线性回归代码实现及结果展示

  线性回归(Linear Regression)是利用称为线性回归方程的最小平方函数对一个或多个自变量因变量之间关系进行建模的一种回归分析

这种函数是一个或多个称为回归系数的模型参数的线性组合。只有一个自变量的情况称为一元线性回归,大于一个自变量情况的叫做多元线性回归。

代码实现:
import org.apache.spark.sql.SparkSession
import org.apache.spark.sql.DataFrame
import org.apache.spark.ml.feature.VectorAssembler
import org.apache.spark.ml.regression.LinearRegression

object LinearRegression {
  def main(args: Array[String]) {
    //设置环境
  val spark = SparkSession.builder ().appName ("LinearRegressionTest").master ("local[2]").getOrCreate()
    val sc = spark.sparkContext
    val sqlContext = spark.sqlContext
    //准备训练集合
    val raw_data = sc.textFile("src/sparkMLlib/man.txt")
    val map_data = raw_data.map{x=>
      val mid = x.replaceAll(","," ,")
      val split_list = mid.substring(0,mid.length-1).split(",")
      for(x <- 0 until split_list.length){
        if(split_list(x).trim.equals("")) split_list(x) = "0.0" else split_list(x) = split_list(x).trim
      }
      ( split_list(1).toDouble,split_list(2).toDouble,split_list(3).toDouble,split_list(4).toDouble,
        split_list(5).toDouble,split_list(6).toDouble,split_list(7).toDouble,split_list(8).toDouble,
        split_list(9).toDouble,split_list(10).toDouble,split_list(11).toDouble)
    }
    val mid = map_data.sample(false,0.6,0)//随机取样,训练模型
    val df = sqlContext.createDataFrame(mid)
    val colArray = Array("c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11")
    val data = df.toDF("c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11")
    val assembler = new VectorAssembler().setInputCols(colArray).setOutputCol("features")
    val vecDF = assembler.transform(data)
    //准备预测集合
    val map_data_for_predict = map_data
    val df_for_predict = sqlContext.createDataFrame(map_data_for_predict)
    val data_for_predict = df_for_predict.toDF("c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11")
    val colArray_for_predict = Array("c1", "c2", "c3", "c4", "c5", "c6", "c7", "c8", "c9", "c10", "c11")
    val assembler_for_predict = new VectorAssembler().setInputCols(colArray_for_predict).setOutputCol("features")
    val vecDF_for_predict: DataFrame = assembler_for_predict.transform(data_for_predict)
    // 建立模型,进行预测
    // 设置线性回归参数
    val lr1 = new LinearRegression()
    val lr2 = lr1.setFeaturesCol("features").setLabelCol("c5").setFitIntercept(true)
    // RegParam:正则化
    val lr3 = lr2.setMaxIter(10).setRegParam(0.3).setElasticNetParam(0.8)
    // 将训练集合代入模型进行训练
    val lrModel = lr3.fit(vecDF)
    // 输出模型全部参数
    lrModel.extractParamMap()
    //coefficients 系数 intercept 截距
    println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}")
    // 模型进行评价
    val trainingSummary = lrModel.summary
    trainingSummary.residuals.show()
    println(s"均方根差: ${trainingSummary.rootMeanSquaredError}")//RMSE:均方根差
    println(s"判定系数: ${trainingSummary.r2}")//r2:判定系数,也称为拟合优度,越接近1越好
    val predictions = lrModel.transform(vecDF_for_predict)
    val predict_result = predictions.selectExpr("features","c5", "round(prediction,1) as prediction")
    predict_result.rdd.saveAsTextFile("src/sparkMLlib/manResult")
    sc.stop()
  }
}

性能评估:

结果:

### 使用Java语言在Spark MLlib实现线性回归 要在Java语言中使用Spark MLlib实现线性回归,可以遵循以下逻辑结构。以下是详细的说明以及代码示例。 #### 数据准备 首先需要加载并处理数据集。假设数据已经存储在一个文件中,每行包含特征向量及其对应的目标值。通过`VectorAssembler`或其他工具将原始数据转化为适合线性回归模型的格式[^1]。 ```java import org.apache.spark.ml.feature.VectorAssembler; import org.apache.spark.sql.Dataset; import org.apache.spark.sql.Row; import org.apache.spark.sql.SparkSession; // 初始化 SparkSession SparkSession spark = SparkSession.builder() .appName("LinearRegressionExample") .master("local[*]") .getOrCreate(); // 加载数据集 Dataset<Row> data = spark.read().format("csv").option("header", "true").load("data.csv"); // 将特征列组合成一个向量列 String[] featureColumns = {"feature1", "feature2", "feature3"}; VectorAssembler assembler = new VectorAssembler() .setInputCols(featureColumns) .setOutputCol("features"); Dataset<Row> assembledData = assembler.transform(data); ``` #### 创建线性回归模型 创建线性回归实例,并设置参数如正则化项(如果需要)、迭代次数等。这里可以选择是否启用L1或L2正则化[^2]。 ```java import org.apache.spark.ml.regression.LinearRegression; // 定义线性回归模型 LinearRegression lr = new LinearRegression() .setLabelCol("label") // 设置目标变量名 .setFeaturesCol("features") // 设置特征变量名 .setMaxIter(10) // 迭代次数 .setRegParam(0.3); // 正则化强度 (可选) // 训练模型 org.apache.spark.ml.regression.LinearRegressionModel model = lr.fit(assembledData); // 输出模型系数和截距 System.out.println("Coefficients: " + Arrays.toString(model.coefficients().toArray())); System.out.println("Intercept: " + model.intercept()); ``` #### 预测与评估 利用训练好的模型对测试数据进行预测,并计算误差指标以评估性能[^3]。 ```java import org.apache.spark.ml.evaluation.RegressionEvaluator; // 对测试集进行预测 Dataset<Row> predictions = model.transform(testData); // 评估模型表现 RegressionEvaluator evaluator = new RegressionEvaluator() .setLabelCol("label") .setPredictionCol("prediction") .setMetricName("rmse"); // 可替换为其他评价标准,例如 mse 或 r2 double rmse = evaluator.evaluate(predictions); System.out.println("Root Mean Squared Error (RMSE): " + rmse); ``` 以上展示了完整的流程,从数据预处理到最终的模型评估。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值