2018年4月18日 星期三

mice::md.pattern() 缺值型態解讀

數據規模龐大時,對於缺值的認識就很重要。R有多個套件檢視缺值狀態,如VIM和mice。VIM將缺值型態視覺化,mice的函數 md.pattern()可以呈現一個比較清楚的表,md.pattern()也是GUI rattle 所採用,如下圖解釋如下:




1.      裡面的0=缺值,1=有值
2.      最右邊的直欄從0-4,則是缺值個數。例如,0就是8個變數同時都無缺值的型態,1就是8個變數只缺1個的例子。但是,缺哪一個則不詳。
3.      最左邊的直欄,代表上述型態有多少列。例如,1575代表有1575列的資料是圓滿的,88代表雙缺Occupation Employment這兩個,有88(Rows)。詳細見下面第4點括弧。
4.      內列(row) {0,1} 代表了缺值出現在哪個:例如,第1列無缺,故8個變數都是1。第2列代表單缺Age(承上,有39);第3列代表單缺Employment(承上,有40);第9列代表單缺Deduction(承上,有34) ;第11列代表雙缺Occupation Employment (承上,有88)
5.      末列代表行(Column)變數總缺值。例如,圈圈42=Age這個變數的紀錄中,有42個缺值。
6.      右下角560代表整體資料的區缺值個數。

VIM的視覺化,則可以呈現對比的比較
更多: http://rstudio-pubs-static.s3.amazonaws.com/4625_fa990d611f024ea69e7e2b10dd228fe7.html

2018年4月11日 星期三

使用 sparklyr 的經驗分享之一: 連接失敗多半是 Java_Home 沒指定

R處理大規模數據時,ETL往往需要克服一些問題。以讀取資料為例,需要一些技巧來提高讀資料的速度。原始資料讀取後,轉換存取用 feather 或 pigz 都是高效能的好方法,或以記憶體管理為方向的 bigmemory 都是好方法。本文主要解說啟動 sparklyr 連接失敗的問題如何克服,多半是Java_home沒有適當的指定,或版本須要更新。

以 1.5G 的範例檔 exampleFile.csv (1千萬列,10個行變數),硬體 64位元 PC Intel Core(TM) i7-4700 CPU 3.40 GHz,32 GB 記憶體。我們先看看三個原始資料的子載入速度:

read.csv 讀取需 8分鐘。
> system.time(csvData <- read.csv("exampleFile.csv"))
   user  system elapsed 
 473.68    4.11  494.14

data.table::fread 需 55秒:
> system.time(freadData <- fread("exampleFile.csv")) 
   user  system elapsed 
  53.96    0.41   55.31

版本2.2.1的 Spark,R 套件 sparklyr 則只20秒
> library(sparklyr)
> sc <- spark_connect(master="local")
> system.time(sparkDF <- spark_read_csv(sc, name= "spDF", path= "exampleFile.csv"))
   user  system elapsed 
   0.10    0.00   19.22

sparkDF 是 Spark data frame, sparklyr 無法存成正規的 Spark 資料庫,所以 sparklyr 只能以 data.frame 存在工作空間。但是, feather pigz 都可以有效管理Spark data frame的存取。只要是 spark data frame, Spark 的機器學習工具都可以有效使用,sparklyr 的環境也可以把 R data frame轉成 spark data frame.

  sparklyr 有一些優點,但是啟動 spark_connect(master="local")會遇到一些錯誤訊息,這些錯誤訊息,關鍵在於Java_Home路徑沒有清楚的在電腦中被指定。如果使用時出現錯誤,最主要的問題都是Java_Home不存在。檢查方法如下:在 cmd 環境執行 echo %Java_Home% 查一下Java_Home路徑是否存在。

  如果沒有裝好 Java,則請先安裝Java。
  如果你還沒裝置套件,則:
install.packages("sparklyr") #裝套件

sparklyr::spark_install(version = "2.2.1") #安裝Spark

  再由控制台->系統,如下圖 


  將正確的 Java_Home 路徑書寫進去,退出後,重新啟動R,目前為止,都可以成功執行 sc <- spark_connect(master="local")的連結。一旦連結成功,建立 Spark data frame的方法很簡單:
                 RDF_tbl <- copy_to(sc, R_data.frame)

  只要是Spark data frame,所有 Spark 的機器學習工具都可以使用。 15 GB 的資料(美國上市公司財報資料庫),很快就可以完成演算,不會當機。詳細的說明,下一則再來繼續。