1. 程式人生 > >我的spark學習之路(三):利用spark做迴歸分析

我的spark學習之路(三):利用spark做迴歸分析

spark的機器學習庫(MLlib)下有簡單的迴歸分析方法,今天只說最簡單的線性迴歸,spark提供有兩個迴歸分析庫(mllib和ml),我學習的時候在網上也查了不少資料,有一個奇怪的現象是網上關於spark迴歸分析的資料基本全是mllib,關於ml的基本沒見到,根據官方文件我自己對兩個庫的方法都做了測試,發現mllib做出的結果不是很正確

6,15,7,8,1,21,16,45,45,33,22

11,31,12,15,1,44,34,88,90,67,54

上面是我用來測試的一組資料,用mllib計算得到的係數a=-6.977555728270526E260,而有ml得到的係數為0.44543491975396066,不知道是不是我資料量少的原因,很明顯mllib的結果是有問題的。此外,spark官網對於我們的學習給出這樣的建議

This page documents sections of the MLlib guide for the RDD-based API (the spark.mllib package). Please see the MLlib Main Guide for the DataFrame-based API (the spark.ml package), which is now the primary API for MLlib.

下面進入正題,說說ml庫的迴歸分析,下面是完整程式碼

import org.apache.log4j.PropertyConfigurator
import org.apache.spark.{SparkConf, SparkContext} import org.apache.spark.ml.regression.LinearRegression import org.apache.spark.rdd.RDD import org.apache.spark.sql.types.{DoubleType, StructField, StructType} import org.apache.spark.sql.{DataFrame, Row, SQLContext, types} import org.apache.spark.mllib
.linalg.{VectorUDT, Vectors} import org.apache.spark.mllib.regression.LabeledPoint import scala.io.Source object Regression extends App{ val conf=new SparkConf().setAppName("regression") val sc=new SparkContext(conf) val sqc=new SQLContext(sc) val date=Source.fromFile("data/data1.txt").getLines().map{line=> val parts=line.split(",") val a=Vectors.dense(parts(1).split(" ").map(_.toDouble)) val b=parts(0).toDouble LabeledPoint(b,a) //LabeledPoint(parts(0).toDouble,Vectors.dense(parts(1).split(" ").map(_.toDouble))) } //val df=sqc.createDataFrame(d,schema) val df=sqc.createDataFrame(sc.parallelize(date.toSeq)) //val training=Source.fromFile("data/data.txt").getLines() val lr=new LinearRegression() .setMaxIter(10)//set maximum number of iterations .setRegParam(0.3)//Set the regularization parameter. .setElasticNetParam(0.8)//Set the ElasticNet mixing parameter. // Fit the model val lrModel = lr.fit(df) // Print the coefficients and intercept for linear regression println(s"Coefficients: ${lrModel.coefficients} Intercept: ${lrModel.intercept}") // Summarize the model over the training set and print out some metrics val trainingSummary = lrModel.summary println(s"numIterations: ${trainingSummary.totalIterations}") println(s"objectiveHistory: ${trainingSummary.objectiveHistory.toList}") trainingSummary.residuals.show() println(s"RMSE: ${trainingSummary.rootMeanSquaredError}") println(s"r2: ${trainingSummary.r2}") }

其實程式碼很少,整個過程都很簡單,管方文件已經寫的很清楚了,唯一的難點就是

val lrModel = lr.fit(df)

這是的df是DataFrame格式,官方文件是利用

val df=spark.read.format("libsvm")
    .load("data/mllib/sample_linear_regression_data.txt")

從檔案中直接讀取資料,讀取後df就是DataFrame格式,但是實際使用時,我們的資料可能是其它函式計算的結果,因此,如何把格式的資料(比如陣列,其它任何結果轉陣列都是很容易的)轉為DataFrame就是問題的難點了(對於我這樣的初學都來說,對於熟悉scala的人來說可能都不是個事),翻啟遍了scala的文件,終於找到一個函式sqc.createDataFrame(rdd: RDD[A]),SQLContext有一個方法createDataFrame可以把RDD 轉為DataFrame,那麼接下來的問題就是如何把陣列轉為我們需要的RDD格式了,那麼我們需要的RDD到底是什麼格式呢,除錯跟蹤發現是LabeledPoint,它的定義如下:

case class LabeledPoint @Since("1.0.0") (
    @Since("0.8.0") label: Double,
    @Since("1.0.0") features: Vector) {
  override def toString: String = {
    s"($label,$features)"
  }
}

其中label是因變數,它是一個Double資料,而features則是自變數,它是一個Vector,知道了格式構造起來就簡單了,比如上面的程式碼,它是這樣構造的:

val date=Source.fromFile("data/data1.txt").getLines().map{line=>
    val parts=line.split(",")
    val a=Vectors.dense(parts(1).split(" ").map(_.toDouble))
    val b=parts(0).toDouble
    LabeledPoint(b,a)
  }

這裡雖然還是從檔案中讀的資料,但和官方文件的本質區別在於它是把讀得的資料分割成陣列然後構造RDD,筆者這裡要說的是如何把一個數據組造成DataFrame,如果我們要用到的資料都存在檔案中當然不用這麼麻煩,直接讀就可以了,但是筆者遇到的問題是,我的資料是其它函式計算得到 ,它是放在一個數組中的,所以才有了這篇部落格。如果大家有更好的方法,歡迎探討

相關推薦

spark學習利用spark迴歸分析

spark的機器學習庫(MLlib)下有簡單的迴歸分析方法,今天只說最簡單的線性迴歸,spark提供有兩個迴歸分析庫(mllib和ml),我學習的時候在網上也查了不少資料,有一個奇怪的現象是網上關於spark迴歸分析的資料基本全是mllib,關於ml的基本沒見到

初識vue.js,學習

學習 定義 我想 red spa pos console gpo con vue之自定義指令 像v-if、v-show、等這些都是系統指令,比如說我想寫一個v-color的指令,但是系統是沒有這個指令的,如果我們直接這樣寫肯定會報錯,所以我們下面就需要自定義指令

Linux 學習 使用者管理命令詳解

使用者管理命令詳解 useradd [options] USERNAME ​ -u UID(>=500,並且與其他使用者無重複) ​ -g GID(基本組,組必須事先存在) ​ -G GID,… (附加組,組必須事先存在) useradd -G mygroup us

菜鳥的 PHP 學習一個簡單的連線資料庫並查詢的小程式1

上一篇文章已經寫了一個簡單的 Hello World 程式了,好吧,其實那不是我的第一個 PHP 程式,我的第一個程式是簡單地連線資料庫的(我不會介紹 PHP 語法的,至少不會專門去介紹,免得誤人子弟,要看語法介紹的自行上 W3CSchool 這個網站),話不多說,直接開始

webService學習springMVC整合CXF後呼叫已知的wsdl介面

本篇文章將講解SpringMVC+CXF環境下,怎麼呼叫其他系統通過webService方式暴露出來的介面 ① 為避免懷疑同一個專案中呼叫本專案的介面,這裡我新開啟一個eclipse通過最原始的方式釋出了一個webservice並啟動保證可以被訪問 開啟瀏覽器確認可以被訪問 ②進入CXF/bin

的python什麽是代碼與python的基本類型

函數 計算機 8進制 16進制 python 數字 type div 3.2 tro 3.1 什麽是代碼? 1、什麽是代碼 代碼是現實世界事物在計算機世界中的映射2019-05-01 2、什麽是寫代碼 寫代碼是將現實世界中中的事物用計算機語言來描述 3.2 py

python學習使用socketserver進行ftp斷點續傳

def += __init__ con 不存在 不為 local 接收 class 最近學習python到socketserver,本著想試一下水的深淺,采用Python3.6. 目錄結構如下: receive_file和file為下載或上傳文件存放目錄,ftp_clie

學習SQL盲註學習

網絡安全 dvwa sql盲註 我的學習之路,現在零基礎,是一個小白,請各位大牛批評指正!寫下這篇,是對自己的一個思路的整理,僅供參考。 Dvwa中登錄進入,首先在DVWA Security中設置等級為low,然後進入SQL Injection(blind),隨意輸入一個數字進行抓包,然後找

Spring學習bean註解管理AOP操作

spec resource 自定義屬性 開始 java framework XML 方法名 jar包 在類上面、方法上面、屬性上面添加註解;並用bean來管理; 書寫方法:@註解名稱(屬性名稱=值) 第一步:導入jar包   導入spring-aop.jar(spri

初識vue.js,學習

自動打開 下一步 鏡像 分享圖片 bpa demo 中間 前端技術 width 在以前做項目時經常是新建一些html、css、等一些文件,但在接觸了vue.js之後我發現我已經有點看不懂前端了,這對於我這麽一個菜鳥來說實在是很苦逼的事情。現在的前端技術都離不開

Python學習 爬蟲

版權 特殊 機器人 zhang col 取出 log arch robots 通用爬蟲和聚焦爬蟲 根據使用場景,網絡爬蟲可分為 通用爬蟲 和 聚焦爬蟲 兩種. 通用爬蟲 通用網絡爬蟲 是 捜索引擎抓取系統(Baidu、Google、Yahoo等)的重要組成部分。主要目

Hive學習 Hive元數據信息對應MySQL數據庫表

需要 pri from metastore node rom lazy 測試 安裝 概述 Hive 的元數據信息通常存儲在關系型數據庫中,常用MySQL數據庫作為元數據庫管理。上一篇hive的安裝也是將元數據信息存放在MySQL數據庫中。 Hive的元數據信息在MySQ

Spark學習 Spark2.3 HA集群的分布式安裝

serve html 元數據 不安裝 rec ive cut 再次 apps 一、下載Spark安裝包 1、從官網下載 http://spark.apache.org/downloads.html 2、從微軟的鏡像站下載 http://mirrors.hust.

Spark學習 Spark的廣播變量和累加器

img 還原 變量定義 如果 style 調優 學習之路 park 系統 一、概述 在spark程序中,當一個傳遞給Spark操作(例如map和reduce)的函數在遠程節點上面運行時,Spark操作實際上操作的是這個函數所用變量的一個獨立副本。這些變量會被復制到每臺機器

學習淺談輸出重定向,grep及正則表達式,egrep

grep 地址總線:內存尋址 數據總線:傳輸數據 控制總線:控制指令 > :輸出重定向(會覆蓋原有內容) >>: 追加重定向(不會覆蓋,追加輸出) 2>: 重定向錯誤輸出 2

Ceph學習Ceph luminous版本部署

禁用 spl ted span none deploy ets work ble 1、配置ceph.repo並安裝批量管理工具ceph-deploy [root@ceph-node1 ~]# vim /etc/yum.repos.d/ceph.repo [

webpack學習

輸出管理: 目前為止我們都是手動地在index.html中引入所有資源,但是一應用開始漸漸變大,在檔名中使用哈西並輸出為多個bundle的時候,專案也會變得難以管理了。因此一些外掛就誕生了。 準備: 調整一下專案結構: project webpack-demo |- package.json

Tecnomatix Plant Simulation 14 學習

本篇部落格主要介紹模型建模過程,以及相應的程式碼和邏輯解釋 從執行模型的角度來說,首先是初始化 HandlingCost := 0 PartsNo :=0 InitPartsTable --初始化表格 GASequence.delete --刪除GA序列 for var

Flume學習 Flume的配置方式

dfs- 來源 rep RoCE list 數據 日誌 appserver 路徑 一、單一代理流配置 1.1 官網介紹 http://flume.apache.org/FlumeUserGuide.html#avro-source 通過一個通道將來源和接收器鏈接。需要列出源

Kafka學習 Kafka的高可用

中一 不同 ive topic 停止工作 查找 同時 llb fail 一、高可用的由來 1.1 為何需要Replication 在Kafka在0.8以前的版本中,是沒有Replication的,一旦某一個Broker宕機,則其上所有的Partition數據都不可被消費,這