SparkR專欄[5]—機器學習

SparkR專欄[5]—機器學習

@qq交流群 : 440125673

測試環境:Centos7 + Rstudio Server + Hadoop2.7.4偽分散式 + Spark2.2.0

1. Spark MLlib簡介

MLlib是Spark的機器學習(ML)庫。其目標是使實用的機器學習具有可擴展性和容易性。在高水平上,它提供了以下工具:

    • ML演算法:常用的學習演算法,如分類,回歸,聚類和協同過濾等;
    • 特徵:特徵提取,變換,降維和選擇;
    • 管道:構建,評估和調整ML管道的工具;
    • 持久性:保存和載入演算法,模型和管道;
    • 實用程序:線性代數,統計,數據處理等;

MLlib分為兩個獨立的包:spark.mllib 和 spark.ml

    • spark.mllib:它是在RDD的基礎上構建的原始機器學習API。從spark2.0開始,這個基於RDD的API已經處於維護模式,預計在即將推出的Spark3.0版本中會被棄用和刪除。

更多信息參考官網:spark.apache.org/docs/l

    • spark.ml:它是在DataFrame基礎上構建的主要的機器學習API,用於構建機器學習流水線和優化。

2. SparkR機器學習

Spark2.0以後MLlib引入了Pipeline的概念。MLlib 將機器學習演算法的API標準化(spark.ml的基於DataFrame API),以便將多種演算法更容易地組合成單個 Pipeline (管道)或者工作流。本節介紹Pipelines API 的關鍵概念,其中 Pipeline(管道)的概念主要是受到 scikit-learn 項目(一個Python的機器學習庫)的啟發。

很遺憾的是,Apache spark為了迎合R語言的編程習慣,spark ml並沒有在R語言裡面使用Ppineline的概念。這意味著spark ml 的許多特點在R語言中都無法使用。並且,在R語言中,雖然功能很齊全,但是各個模塊的分類做的比較差(Python程序員一直詬病R語言的原因之一),包括sparkR包。當然,很多東西習慣就好。

註:spark機器學習建議使用PySpark。後面有時間的話整理Pyspark系列的資料。

在sparkR中,支持的機器學習演算法:

監督學習:

  • 邏輯回歸(spark.logit)
  • 隨機森林(spark.randomForest)
  • 線性svm(spark.svmLinear)
  • 樸素貝葉斯(spark.naiveBayes)
  • 廣義線性回歸(spark.glm)

非監督學習:

  • Kmeans(spark.kmeans)
  • 關聯規則(spark.fpGrowth)

基本上,這些函數的使用方法都符合R語言自身的編程習慣,例如 formula的使用等等。下面簡單用一個例子來看看。

#### 1.從hive中讀取數據 ####

iris_df <- sql("select Sepal_Length,Sepal_Width,Petal_Length,Petal_Width,label from czf_test.iris")

head(iris_df)

# Sepal_Length Sepal_Width Petal_Length Petal_Width label

# 1 5.1 3.5 1.4 0.2 setosa

# 2 4.9 3.0 1.4 0.2 setosa

# 3 4.7 3.2 1.3 0.2 setosa

# 4 4.6 3.1 1.5 0.2 setosa

# 5 5.0 3.6 1.4 0.2 setosa

# 6 5.4 3.9 1.7 0.4 setosa

#### 2.劃分數據集 ####

iris_list <- randomSplit(iris_df,c(0.7,0.3),20180126)

train <- iris_list[[1]]

test <- iris_list[[2]]

#### 3.建立logistic回歸 ####

library(dplyr)

iris_glm <- spark.logit(data = train,formula = label ~ Sepal_Length+Sepal_Width+Petal_Length+Petal_Width,family = multinomial)

summary(iris_glm)

$coefficients

versicolor virginica setosa

(Intercept) 16.77075 -18.49414 1.723393

Sepal_Length 7.341095 5.143021 -12.48412

Sepal_Width -20.28102 -26.23101 46.51202

Petal_Length 2.465449 10.79543 -13.26088

Petal_Width 7.878006 22.60734 -30.48535

#### 4.評估模型 ####

iris_fit_glm <- iris_glm %>% predict(test) %>% subset(select=(c("label","prediction")))

head(iris_fit_glm)

iris_predict <- as.data.frame(iris_fit_glm)

accracy <- sum(iris_predict$label==iris_predict$prediction)/dim(test)[1] # 準確度

print(accracy) # 準確率為1

可以看到,spark.logit建立的多分類邏輯回歸模型表現得很好

3. R4ML 包

3.1 什麼是R4ML?

R4ML is a scalable, hybrid approach to ML/Stats using R, Apache SystemML, and Apache Spark.

Github地址:github.com/SparkTC/r4ml

  • R4ML是由IBM公司在Git下開發的可下載的開源R包;
  • R4ML是建立在SparkR和Apache SystemML之上的,因此都支持他們二者的功能;
  • R4ML扮演者SparkR與Apache SystemML之間的橋樑;
  • R4ML提供了一系列封裝好的演算法;
  • R4ML提供創建自定義ML演算法的功能;
  • R4ML針對於R語言用戶十分友好

3.2 安裝R4ML

第一步:添加sparkR包的路徑

.libPaths(c(.libPaths(), " /usr/hdp/2.6.0.3-8/spark2/R/lib"))

第二步:安裝依賴包

install.packages(c("uuid", "R6"), repos = "cloud.r-project.org")

第三步:下載安裝R4ML

download.file("169.45.79.58/R4ML_0.8.1", "~/R4ML_0.8.1.tar.gz")

install.packages("~/R4ML_0.8.1.tar.gz", repos = NULL, type = "source") # 最新版本是 0.8.1

第四步:載入R4ML包

3.3 創建spark入口

r4ml.session(master = "local[1]", sparkHome = "/usr/hdp/2.6.0.3-8/spark2")

3.4 應用實例

# 創建 r4ml.frame

iris.df <- as.r4ml.frame(iris)

class(iris.df)

# [1] "r4ml.frame"

# attr(,"package")

# [1] "R4ML

# 數據預處理,並且創建Species啞變數

pp <- r4ml.ml.preprocess(iris.df, transformPath = "/tmp",

dummycodeAttrs = c("Species"))

# 將處理後的數據轉化為 r4ml.matrix

iris.mat <- as.r4ml.matrix(pp$data)

# 劃分數據集

ml.coltypes(iris.mat) <- c("scale", "scale", "scale", "scale",

"nominal", "nominal", "nominal")

s <- r4ml.sample(iris.mat, perc=c(0.2,0.8))

test <- s[[1]] # 訓練集

train <- s[[2]]# 測試集

# 擬合線性回歸模型

iris.model <- r4ml.lm(Sepal_Length ~ . , data = train, intercept = TRUE,tolerance = 0.0001,iter.max = 100,lambda = 1)

# 模型係數

# 預測

preds <- predict(iris.model, test)

# 模型的評估

# 關閉 r4ml 入口

r4ml.session.stop()

4. 結束語

相比sparkR中的機器學習模塊,R4ML包的功能更強大。SparkR+R4ML幾乎覆蓋了我們要用到的功能。多用多熟悉就好。


推薦閱讀:

Spark 2017歐洲技術峰會摘要(開發人員分類)
如何學好Scala?請給出一條科學的時間線
scala、spark學習資料整理
一般而言常見的Spark的性能瓶頸有哪些?

TAG:R編程語言 | Spark |