選自kdnuggets作者:Michael Li 、Paul Paczuski機器之心編譯參與:王宇欣、杜夏德
The Data Incubator 中,有著最新的數據科學(data science)課程。其中大部分的課程都是基於企業和政府合作夥伴的需求而設立的。現在他們希望開發一更偏向數據為驅動的方式,以了解應該為數據科學企業的培訓(data science corporate training,以及享受其提供的免費助學金的有意願進入業界數據科學領域的碩博士生們教授什麼樣的內容。結果如下。
排名
什麼是最流行的機器學習包(ML packages)?讓我們來看一下基於包下載量(package downloads)和社交網站活躍度的排名。
註:OneR: 1 (SO); mlr: 2 (Github); ranger: 4 (Github); SuperLearner: 5 (Github)
該排名基於 CRAN ( The Comprehensive R Archive Network (https://cran.r-project.org/) ) 下載量和 Stack Overflow 活躍性的平均排名(完整排名 [CSV] (https://github.com/thedataincubator/data-science-blogs/blob/master/ranking.csv)))。
其中 CRAN 的下載量是過去一年的數據。Stack Overflow 則是根據基於問題正文中下載包的名稱並以 『R』進行標記的結果數進行排名。
GitHub 的排名則是由存儲庫中的星星數而來。有關方法的詳細信息,請參閱下文
CARET 排名第一,多個神經網絡排名靠前
caret 排名第一也許並不奇怪。它是一個用於創建機器學習工作流的通用軟體包,能很好地與一些算法特定的軟體包(排名靠後)整合在一起。
這些包括了 e1071 ( 用於支持向量機,SVMs), rpart (trees), glmnet ( 正則化回歸,regularized regressions), 也許還有 R,神經網絡 (nnet)。有關軟體包的詳細信息如下
排名說明了 R 軟體包社區的碎片化程度。一些頂級的軟體包,比如 rpart 和 tree,部署了相同的算法,這與 Python 的 scikit-learn 的一致性和寬度形成對比。
但是,如果你喜歡 R 的數據操作能力(就像在 tidyverse 中),那麼你就可以使用這些軟體包做一些功能強大的模型,而不用切換到 python。此外,隨著 modelr (https://github.com/hadley/modelr) 中添加了更多的功能,我們也許很快能在此列表中看到 tidy tool。
包的細節
caret 是一個用於創建機器學習工作流的一般包,並且它已經處於這個排名的首位置。接著的是實現特定機器學習算法的幾個包:隨機森林(Random Forests)(randomForest), 支撐向量機(Support Vector Machines)(e1071), 分類和回歸樹(Classification and Regression Trees)(rpart), 和 正則化回歸模型(regularized regression models)(glmnet).
nnet 實現了神經網絡,而 tree 包同樣實現了樹的功能。party 用於二叉樹的遞歸分割和可視化,arules 則用於關聯挖掘。支持向量機(SVMs)和其他的內核方法則部署在 kernlab 中。h2o 包用於可擴展的機器學習,而且是更大的 H2O 項目的一部分。ROCR 用於模型評估,包括 ROC 曲線(接收者操作特徵曲線,receiver operating characteristic curve),gbm 實現梯度推進。更多的分割算法(partitioning algorithms)可以使用 RWeka 進行訪問,而 rattle 是數據挖掘中的 R 的一個圖形用戶界面(GUI)。
一些包則只在 Github 中發揮強大功能: mlr 和 SuperLearner 是另外兩個元包(meta-package),為 caret 提供類似的符號插入的功能,ranger 提供了隨機森林(random forests)的 C++ 實現。
最後,OneR 在 Stack Overflow 中排名第一,但是 SO API 經常將其自動修正為「one」,所以結果並不可信。
方法
接下來,我們描述一下這種排名所使用的方法。
步驟 1: 獲得 機器學習包的詳盡列表
一開始,我們設想我們的排名綜合考慮了包下載量、Stack Overflow 和 Github 活躍度。我們知道能為我們提供這些指標的 API 已經存在了
然而,獲得機器學習的所有 R 包的初始列表是一件更加艱巨的任務。我們需要一份詳盡客觀的並且是最新的一份列表。一份不好的初始化列表將會嚴重影響我們的排名。
尋求幫助。一個朋友把一篇文章「CRAN 任務視圖:機器學習和統計學習 (CRAN Task View: Machine Learning & Statistical Learning)」介紹給我,該文章底部有一份非常不錯的列表,並且很容易入手。
這樣做的好處是包列表的來源非常具有權威性(CRAN 是官方 R 包存儲庫)並且它會經常更新(最近的更新:2017 年 1 月 6 日)。感謝作者,Torsten Hothorn 通過郵件提供的幫助。
以前的想法是使用 Google 來尋找「頂級 R 機器學習包」的列表,然後試著從列表上抓取所有包的名稱,將它們結合起來,並使用該列表作為起點。但是拋開工程任務來說,當前可用的列表質量相對較差,不能滿足我們的需求。它們過時了,沒有明確的說明方法,並且往往是極其主觀的。
確定客觀指標
一個好的排名需要一個對於「最佳(best)」的定義,這需要用良好的指標來搭建。我們將「最佳」定義為「最流行」。這並不一定意味著這個包是廣受歡迎的(由於糟糕的 API,用戶可能經常會搜索 Stack Overflow)
我們為我們的排名選取了 3 個因素:
下載:來自於 CRAN 鏡像的下載量Github:包的主存儲庫頁面上星星數量。Stack Overflow: 包含程序包的名稱並以 'R' 標記的問題的數量。
CRAN 下載
有一些 CRAN 的鏡像,而我們使用的是 R-Studio 鏡像,因為它有一個便捷的 API。RStudio 一定是 R 中使用最廣泛的 IDE,但卻並非是唯一的。如果我們從其他 CRAN 的鏡像統計下載量,我們的排名可能會更好(但並不會有顯著變化)。
GitHub
最初,我們通過在 Github 的 search API 上查詢包的名字來尋找包的 Github 頁面,可能會使用「language:R」,但這麼做是不可靠的。有時候很難選擇正確的 Github 庫,而且不是所有的 R 包都是用 R 語言來實現的(在該搜索 API 中,「language:R」參數似乎指的是該存儲庫寫入所使用的最流行的語言)
相反,我們返回 CRAN 來尋找這些 URL。每個包都有一個官方的 CRAN 頁面,其中包括了一些有用的信息,比如原始碼連結。這就是我們得到的包的 Github 存儲庫的位置。
在這之後,使用 API 就可以容易地得到 Github 的星星數。
Stack Overflow
從 Stack Overflow 獲取有用的結果需要技巧。一些 R 包的名稱,比如 tree 和 earth,存在著明顯的困難:Stack Overflow 的結果可能不會被篩選到 R 包的結果當中,所以我們首先在查詢中添加一個 「r」 字符串,這非常有幫助。
一個好的(最優的?)策略是在問題主題中查詢包的名字,然後添加一個 『r』標籤(這與添加 『r』 字符串不同)
建立排名
我們簡單地將包按照 3 個指標中的每一個來排名,並取其平均值。該方法沒什麼特別的地方。
雜注
所有的數據都是在 2017 年 1 月 19 日下載的。CRAN 的下載量則是統計了過去 365 天的數據:從 2016 年 1 月 19 日 到 2017 年 1 月 19 日。
數據科學領域最頂級的 R 包?
一開始,這個項目是要將「數據科學」領域中所有頂級的包進行排名,但我們很快發現這個範圍太大。
數據科學家做了很多不同的事情。要幫助一個數據科學家,你要將幾乎所有的 R 包進行分類。那麼,我們應該包含字符串操作包嗎?包是如何從資料庫中讀取數據的呢?
也許有一天,會有一個更長的項目,它會更多地使用 「Data Science」 來為「數據科學」工作得出一個頂級 R 包的排名。
資源:
原始碼請查看 The Data Incubator (https://www.thedataincubator.com/) 的 Github (地址:https://github.com/thedataincubator/data-science-blogs/)。如果有興趣學習更多,請參考:
1.Data science corporate training
(地址:https://www.thedataincubator.com/training.html)
2. Free eight-week fellowship for masters and PhDs looking to enter industry
(地址:https://www.thedataincubator.com/fellowship.html)
3. Hiring Data Scientists
(地址:https://www.thedataincubator.com/hiring.html)