現在tensorflow和mxnet很火,是否還有必要學習scikit-learn等框架?


Scikit-learn和TensorFlow之間有很多顯著差異,非常有必要同時了解它們。

區別1:對於數據的處理哲學不同導致了功能不同

Scikit-learn(sklearn)的定位是通用機器學習庫,而TensorFlow(tf)的定位主要是深度學習庫。一個顯而易見的不同:tf並未提供sklearn那種強大的特徵工程,如維度壓縮、特徵選擇等。究其根本,我認為是因為機器學習模型的兩種不同的處理數據的方式:

  • 傳統機器學習:利用特徵工程(feature engineering),人為對數據進行提煉清洗
  • 深度學習:利用表示學習(representation learning),機器學習模型自身對數據進行提煉

機器學習與深度學習對於特徵抽取的不同之處,原圖[1]

上圖直觀的對比了我們提到的兩種對於數據的學習方式,傳統的機器學習方法主要依賴人工特徵處理與提取,而深度學習依賴模型自身去學習數據的表示。這兩種思路都是現行並存的處理數據的方法,更加詳細的對比可以參考: 人工智慧(AI)是如何處理數據的?

sklearn更傾向於使用者可以自行對數據進行處理,比如選擇特徵、壓縮維度、轉換格式,是傳統機器學習庫。而以tf為代表的深度學習庫會自動從數據中抽取有效特徵,而不需要人為的來做這件事情,因此並未提供類似的功能

區別2:模型封裝的抽象化程度不同,給與使用者自由度不同

sklearn中的模塊都是高度抽象化的,所有的分類器基本都可以在3-5行內完成,所有的轉換器(如scaler和transformer)也都有固定的格式。這種抽象化限制了使用者的自由度,但增加了模型的效率,降低了批量化、標準化的的難度(通過使用pipeline)。

clf = svm.SVC() # 初始化一個分類器
clf.fit(X_train, y_train) # 訓練分類器
y_predict = clf.predict(X_test) # 使用訓練好的分類器進行預測

而tf不同,雖然是深度學習庫,但它有很高的自由度。你依然可以用它做傳統機器學習所做的事情,代價是你需要自己實現演算法。因此用tf類比sklearn不適合,封裝在tf等工具庫上的keras[2]才更像深度學習界的sklearn。

從自由度角度來看,tf更高;從抽象化、封裝程度來看,sklearn更高;從易用性角度來看,sklearn更高。

區別3:針對的群體、項目不同

sklearn主要適合中小型的、實用機器學習項目,尤其是那種數據量不大且需要使用者手動對數據進行處理,並選擇合適模型的項目。這類項目往往在CPU上就可以完成,對硬體要求低。

tf主要適合已經明確了解需要用深度學習,且數據處理需求不高的項目。這類項目往往數據量較大,且最終需要的精度更高,一般都需要GPU加速運算。對於深度學習做「小樣」可以在採樣的小數據集上用keras做快速的實驗,沒了解的過朋友看一下keras的示例代碼,就可以了解為什麼keras堪比深度學習上的sklearn了。

model = Sequential() # 定義模型
model.add(Dense(units=64, activation="relu", input_dim=100)) # 定義網路結構
model.add(Dense(units=10, activation="softmax")) # 定義網路結構
model.compile(loss="categorical_crossentropy", # 定義loss函數、優化方法、評估標準
optimizer="sgd",
metrics=["accuracy"])
model.fit(x_train, y_train, epochs=5, batch_size=32) # 訓練模型
loss_and_metrics = model.evaluate(x_test, y_test, batch_size=128) # 評估模型
classes = model.predict(x_test, batch_size=128) # 使用訓練好的數據進行預測

總結

不難看出,sklearn和tf有很大區別。雖然sklearn中也有神經網路模塊,但做嚴肅的、大型的深度學習是不可能依靠sklearn的。雖然tf也可以用於做傳統的機器學習、包括清理數據,但往往事倍功半。

更常見的情況下,可以把sklearn和tf,甚至keras結合起來使用。sklearn肩負基本的數據清理任務,keras用於對問題進行小規模實驗驗證想法,而tf用於在完整的的數據上進行嚴肅的調參(煉丹)任務。

而單獨把sklearn拿出來看的話,它的文檔做的特別好,初學者跟著看一遍sklearn支持的功能大概就對機器學習包括的很多內容有了基本的了解。舉個簡單的例子,sklearn很多時候對單獨的知識點有概述,比如簡單的異常檢測(2.7. Novelty and Outlier Detection)。因此,sklearn不僅僅是簡單的工具庫,它的文檔更像是一份簡單的新手入門指南。

因此,以sklearn為代表的傳統機器學習庫(如瑞士軍刀般的萬能但高度抽象),和以tf為代表的自由靈活更具有針對性的深度學習庫(如樂高般高度自由但使用繁瑣)都是機器學習者必須要了解的工具。

工具是死的,人是活的。雖然做技術的一大樂趣就是造輪子,但不要把自己綁在一個輪子上,這樣容易被碾死在滾滾向前的科技巨輪之下。


[1] Log Analytics With Deep Learning and Machine Learning - XenonStack

[2] Keras Documentation


這個問題其實等價於:現在深度學習那麼火,那麼是否還有必要學習傳統機器學習方法。我的答案是有必要。

從理論上來說,深度學習技術也是機器學習的一個組成部分,學習其他傳統機器學習方法對深入理解深度學習技術有很大幫助,知道模型凸的條件,才能更好的理解神經網路的非凸。知道傳統模型的優點,才能更好的理解深度學習並不是萬能的,也有很多問題和場景直接使用深度學習方法會遇到瓶頸和問題,需要傳統方法來解決。

從實踐上來說,深度學習方法一般需要大量GPU機器,工業界哪怕大公司的GPU資源也是有限的,一般只有深度學習方法效果遠好於傳統方法並且對業務提升很大的情況下,才會考慮使用深度學習方法,例如語音識別,圖像識別等任務現在深度學習方法用的比較多,而NLP領域除了機器翻譯以外,其他大部分任務仍然更常使用傳統方法。傳統方法一般有著更好的可解釋性,這對檢查調試模型也是非常有幫助的。工業上一般喜歡招能解決問題的人,而不是掌握最火技術的人,因此在了解深度學習技術的同時,學習一下傳統方法是很有好處的。


不是一回事吧,sklearn更多的是傳統模型和pipeline,特點是演算法齊全,很多經典論文都有實現,並配以完整的文檔,運行在CPU上;而tensorflow是深度學習的庫,當然也可以用來寫svm,更多時候配合gpu使用。


當然有必要。Tensorflow和Caffe、MXNet等是針對深度學習特製的工具包,而Scikit-learn是對傳統的機器學習,包括預處理,特徵工程,模型構建,驗證等的完整實現。這兩類工具壓根不是做同一件事的。你要說Tf和mxnet想只學習一個,那還說得過去。問這個問題,說明你對這些框架連最根本的了解都沒有,應該回去多看看文檔再來提問。

說實話,即使現在深度學習大行其道,很多時候你還是要用傳統機器學習方法解決問題的。首先不是每個人都有一個彪悍的電腦/伺服器,其次,大多數問題真的不需要深度網路。最後,只會調用工具包的程序員不是好的機器學習者。


你不會sklearn就去學tensorflow,然後跟別人說你會機器學習,會用深度神經網路。有一種不會走但會跑的感覺。

具體來說,如果一個人不知道pca,不知道梯度的概念,但靠幾個tensorflow做出來的use case,就來我們公司應聘說自己會深度學習,我怎麼可能相信呀。

做預測性分析,把各種模型打比方成各種武器,深度只是其中一種,還不是特別普適的一種(相比之下xgb更普適)。一個好的工程師不能只會用一種工具吧。

sklearn裡面有六個主要的topic,回歸,聚類,分類,降維,model selection,數據預處理。

每個topic裡面有很多的method和function,它們的文檔寫的都非常清楚非常好,為什麼不想學呢?

還想吹一波sklearn,它大大降低了機器學習的入門門檻,讓很多人可以用比較少的時間就具備預測分析的能力。不失為入門ml,ds的一個極佳的training program。


我面試過一些想來Google做machine learning engineer的人,有的人號稱自己有很多machine learning experience,但是連MLE和MAP都不是很清楚。難道現在大家說machine learning經驗都是在調neural net的參數么?

------------

我不同意評論區有人認為「MLE和MAP沒什麼用」的看法,為此我專門寫了一篇專欄文章介紹二者:

聊一聊機器學習的MLE和MAP:最大似然估計和最大後驗估計


就是一個調用的庫有什麼可研究的,要用的時候看一下文檔怎麼用不就好了。


Hands-On Machine Learning with Scikit-Learn and TensorFlow 這本書的書名告訴了一切啊...我目前讀到的機器學習書籍中,最適合我這種碼農的一本書,看了就能知道scikit-learn與tf的不同適用場景了。最良心的是,某出版社出了這本書的影印版,我曾以為影印版在我大學以後就不再有這東西了。


題主是想問「deep learning這麼火,還有必要學傳統機器學習」呢,還是「想入坑 deep learning,以前的老框架是否有必要學習」?看到題主把 TensorFlow 和 MXNet 並列,然後 scikit-learn 和 caffe 並列,我就默認是後一個了。

就我個人經驗來看,答案是。MXNet 不溫不火不好評價,TensorFlow 現已經遍地開花。每年最新的論文一大部分都由 TensorFlow 實現。即便原作是用其他框架寫的,很快也有會 TensorFlow 上的復現。除了個別少數流派的冷門論文,TensorFlow 用戶不怎麼需要擔心復現問題。與其花過多時間學習其他框架,不如多掃一掃論文找些靈感。

再者,雖然 TensorFlow 以「深度學習框架」著稱,但其本質是 Tensor + Compute Graph。使用 TensorFlow 不代表你只能深度學習,相反 Google 非常推薦大家用 TensorFlow 來跑傳統機器學習演算法, example 里就推薦了 SVM Random Forest 等傳統機器學習方法。不要把自己局限在框架上,框架只是一個工具。作為一個合格的研究者,應當主動去學習相關知識而不是被動接受。

最後,推薦一下 PyTorch。作為新生代的動態圖框架,無論是 debug 還是 design model 都比靜態圖的 TensorFlow 要方便許多,同時運行速度也沒有明顯的損失。最近還有一個項目 SKTorch mattHawthorn/sk-torch 將 PyTorch 和 SKLearn 結合到了一起:既有 SKLearn 豐富的工具鏈,又有 PyTorch 強勁的 GPU 加速。對於兩者都想學的筒子是個很好的選擇(吃我安利啦


個人認為有必要,起碼pipeline用的很方便(逃


我來翻譯一下這個問題:我學會了拿一套鏟子做中餐,那麼我還需要學點日料外賣么?


都是機器學習,但是差別大了,sklearn首先是一個完整的機器學習流程框架,提供了完整的特徵工程工具,比如歸一化、one-hot編碼,實現了很多經典機器學習演算法,如線性回歸、決策樹、各種Boost、SVM、神經網路,並封裝成為類庫模塊,運行於CPU,最後還有交叉驗證等評估工具。

而現在的深度學習框架(tf,caffe,torch等)提供了具有擴展性的工具,就如同樂高積木一般 ,可以自己組裝張量運算圖以及自動求導,你完全可以用張量圖來做線性回歸、SVR等演算法,但是就不是import一個model來fit然後predict這麼簡單了,而是需要你從頭來把張量運算拼裝起來,然後規定優化目標,進行訓練。深度學習框架更突出的特點是提供大量神經網路張量和運算工具,可以高效實現卷積運算、批標準化、在不同範數實現正則化、自動求解梯度、梯度下降/截斷等功能,這些功能都是近年神經網路應用突飛猛進的必備。有了這些工具,同時又能自由組裝,還能自動把繁瑣的符號求導處理好,大大提供了學術到工程的效率。現在機器學習界新出的成果,很快就可以在深度學習框架中實現。

sklearn也提供了ANN模塊,但是並沒有上述流行的深度學習工具,大概只能實現較為簡單的網路,比如1-2層的線性層最後輸出sigmoid然後bp這樣子吧,具體並沒有用過但是肯定不會和深度學習框架的神經網路相提並論。

深度學習框架主要為深度神經網路設計,GPGPU也是必備特性。相比於CPU的較少核心數,GPU核心數一般高出2個數量級,對於各種矩陣運算張量求導簡直是用得恰到好處,尤其是對於現在很常用的2d或3d卷積運算,大大提高了運算速度。老黃也早早布局,主流框架對CUDA的支持度很好。這些是sklearn不能具備的。


深度學習框架里涉及到的知識會少很多,覆蓋範圍也會少很多。

深度學習的環境下,人們通常只是在一些toy datasets上討論如何收斂更快/達到acc 0.9+/調整模型的超參。GPU高度依賴,不研究數據集本身的結構(包括研究結構的策略等抽象)。

sklearn是什麼樣子的呢?你不妨看看受眾。一個框架自然和它的受眾是適配的。

如果你是sklearn的受眾,我想你首先在選取評估指標上就會有更嚴謹的考慮,比如說,公共的指標里,我就一般喜歡看precision和mcc,前者越高說明模型越不是隨機判斷(數據均衡的話),而mcc,就我的觀點,基本是大部分問題的最佳度量。能不能別acc了,原始到讓人不忍吐槽。

然後還是數據集本身,sklearn的受眾可能傾向於對其做一些分析和變換,傾向於做特徵工程,而根本不是preprocessing那麼簡單。用相關專業知識分析raw的東西,然後可能用各種方法重複做extraction, selection 。這裡面有些是手工的,有些是auto的,有些是混合的。

舉例子,從語料中提取n-gram的tf-idf特徵,使用人工語義語法規則提取特殊特徵,然後做相關性分析篩選特徵,然後做cluster,做outlier filter(我感覺數據挖掘比賽一般outlier處理好分就高),然後用embedding和流形學習做新的特徵的挖掘,然後可能重複上述步驟。有時候僅僅研究樣本還不行,還需要謹慎的引入targets的信息(避免self validate)。例如說entropy可以用來篩選特徵。

模型呢?真的不需要很複雜,特徵做的好,線性回歸不比你用深度網路差。更多地,傳統ml學習時間都是可期待的。

在一個問題上的特徵工程,往往涉及到大量的相關專業知識,相比之下深度學習那一套真的是非常野蠻暴力。說實話,就普通的深度學習而言,缺乏美感。

事實上,sklearn和很多深度學習框架沒什麼衝突。我很早就有吹過,任意複雜的網路都是模型集成時中的一個組件。這種集成如果是stacking形式的,你還可以發現mlp組件和整個模型結構相似,非常漂亮。

扯到最後,我認為學習sklearn是有必要的。不是所有人都有錢,sklearn讓你可以靠自己的專業知識去對抗有錢人。這個過程通常並不艱難。

我一直覺得深度網路是用來挖掘隱藏特徵的(儘管挖掘成功也並不能讓我們知道,但它自己可以使用)。人類認知畢竟有限,所以建模也都是抓主要矛盾。但通常解決問題可能不需要搞得規模很大,如果深度網路真的能去找優化自己的方法,真的能做一些meta的事情,我想它應該局部蘊含一些傳統ml的結構吧。


這問題類似於,學會了炒魚香肉絲火候的精髓了,還用學切菜切肉嗎?

你要是這輩子只用掌勺不用切墩,那你自然就不用學切菜,會炒菜就可以了。問題是,這個地球上絕大部分人,都是從切墩開始干起的。

同樣,絕大部分人難道不是從手寫SVM和用scikit learn的一個個小東西開始用,然後才學的各種neural network嗎?


看到這個問題,去諮詢了一下我們的研發工程師,得出的結論是:有必要,嚴格來說tensorflow、mxnet和scikit-learn的方向是不一樣的,scikit-learn是傳統的機器學習方法,因為傳統,所以較其他方法更為完善,應用面也相對比較廣,我們工程師寫過一篇文章:Python機器學習工具:Scikit-Learn介紹與實踐,裡面詳細介紹了scikit-learn並舉出了實例,以下為原文:

Scikit-learn 簡介

官方的解釋很簡單: Machine Learning in Python, 用python來玩機器學習。

什麼是機器學習

機器學習關注的是:計算機程序如何隨著經驗積累自動提高性能。而最大的吸引力在於,不需要寫任何與問題相關的特定代碼,泛型演算法就能告訴你一些關於數據的秘密。

Scikit-learn的優點

  • 構建於現有的NumPy(基礎n維數組包),SciPy(科學計算基礎包), matplotlib(全面的2D/3D畫圖),IPython(加強的交互解釋器),Sympy(Symbolic mathematics), Pandas(數據結構和分析)之上,做了易用性的封裝。
  • 簡單且高效的數據挖掘、數據分析的工具。
  • 對所有人開放,且在很多場景易於復用。
  • BSD證書下開源。

Scikit-learn的生態

Python

python是一門簡單易學的語言,語法要素不多,對於只關心機器學習本身非軟體開發的人員,python語言層面的東西基本是不需要關心的。

Jupyter

http://http://nbviewer.jupyter.org/ 提供了一種便利的方式去共享自己或是別人的計算成果,以一種之前單單共享代碼不同的交互的方式。scikit-learn官網上面大量的例子也是以這種方式展示,使用者不僅看到了代碼的使用方式,還看到了代碼的結果,如果自己搭建了jupyter server的話,導入notebook還可以直接在瀏覽器中在其中上下文任意處修改,大大增加了學習效率。

Scikit-learn 的主要內容

Scikit-learn的演算法地圖

按照上圖 scikit-learn提供的主要功能主要關注與數據建模,而非載入、操作、總結數據, 這些任務可能NumPy、Pandas就已經足夠了。為此scikit-learn 主要提供了以下功能:

  • 測試數據集,sklearn.datasets模塊提供了乳腺癌、kddcup 99、iris、加州房價等諸多開源的數據集
  • 降維(Dimensionality Reduction):為了特徵篩選、統計可視化來減少屬性的數量。
  • 特徵提取(Feature extraction): 定義文件或者圖片中的屬性。
  • 特徵篩選(Feature selection): 為了建立監督學習模型而識別出有真實關係的屬性。
  • 按演算法功能分類,分為監督學習:分類(classification)和回歸(regression),以及非監督學習:聚類(clustering)。sklearn提供了很全面的演算法實現,詳細演算法清單http://http://scikit-learn.org/stable/modules/classes.html。
  • 聚類(Clustring): 使用KMeans之類的演算法去給未標記的數據分類。
  • 交叉驗證(Cross Validation):去評估監督學習模型的性能。
  • 參數調優(Parameter Tuning):去調整監督學習模型的參數以獲得最大效果。
  • 流型計算(Manifold Learning):去統計和描繪多維度的數據

常用演算法的大致介紹

分類 Classification

  • 適用範圍: 用作訓練預測已經標記的數據集的類別. 監督學習的代表。
  • [常用演算法對比](http://http://scikit-learn.org/stable/auto_examples/classification/plot_classifier_comparison.html#sphx-glr-auto-examples-classification-plot-classifier-comparison-py):

  • [Do we Need Hundreds of Classifiers to Solve Real World Classification Problems?](http://http://jmlr.org/papers/v15/delgado14a.html),文章測試了179種分類模型在UCI所有的121個數據上的性能,發現Random Forests 和 SVM 性能最好。

回歸 Regression

  • 適用範圍:

回歸是用於估計兩種變數之間關係的統計過程,回歸分析可以幫助我們理解當任意一個自變數變化,另一個自變數不變時,因變數變化的典型值。

最常見的是,回歸分析能在給定自變數的條件下估計出因變數的條件期望。 (舉個例子,在二維的坐標系中,根據已有的坐標點去推導x、y軸的函數關係,既一元n次方程。)

  • 常用演算法對比:

優點

直接、快速

知名度高

缺點

要求嚴格的假設

需要處理異常值

集成演算法 Ensemble Algorithms

上圖是單獨用決策樹來做回歸任務去預測數據,但是反映了決策樹雖然易於解釋理解之外會有一些預測上的缺點,總結而言是趨向過擬合,可能或陷於局部最小值中、沒有在線學習,所以下圖引入了AdaBoost 集成演算法來增加預測的可靠性,由此引出了集成演算法的優點:

  • 集成方法是由多個較弱的模型集成模型組,其中的模型可以單獨進行訓練,並且它們的預測能以某種方式結合起來去做出一個總體預測。
  • 當先最先進的預測幾乎都使用了演算法集成。它比使用單個模型預測出來的結果要精確的多。

但是如何找出可結合的弱模型、以及結合的方式又稱為了繁重的維護工作。

聚類 Clustering

  • 適用範圍:

是在沒有標記的情況下去分類數據,使數據變得有意義, 如果已知分類分類的個數,Kmeans演算法會更容易得出效果。

  • 常用演算法對比:

該圖中顏色是聚類的結果,而非標記, 各演算法的分類結果都可以根據輸入參數調優,只是為了展示聚類的適用範圍適合有特徵的數據類型,對於最下一行的幾乎均勻的數據幾乎沒有任何意義。

Scikit-learn進行計算的主要步驟

  • 數據獲取、預處理。
  • 可選的降維過程.因為原始數據的維度比較大, 所以需要先找出真正跟預測目標相關的屬性。
  • 學習以及預測的過程。
  • 反覆學習的過程。增加樣本、調優參數、換演算法各種方式去提供預測的準確率。

Scikit-learn 的簡單使用示例

決策樹示例:

from sklearn import datasets

from sklearn import metrics

from sklearn.tree import DecisionTreeClassifier

# 讀取 iris 數據集

dataset = datasets.load_iris()

# 採用CART模型

model = DecisionTreeClassifier()

model.fit(dataset.data, dataset.target)

print(model)

# 預測

expected = dataset.target

predicted = model.predict(dataset.data)

# 統計

print(metrics.classification_report(expected, predicted))

print(metrics.confusion_matrix(expected, predicted))

輸出:

precision recall f1-score support

0 1.00 1.00 1.00 50

1 1.00 1.00 1.00 50

2 1.00 1.00 1.00 50

avg / total 1.00 1.00 1.00 150

[[50 0 0]

[ 0 50 0]

[ 0 0 50]]

引用

  • Quick Start Tutorial http://http://scikit-learn.org/stable/tutorial/basic/tutorial.html
  • User Guide http://http://scikit-learn.org/stable/user_guide.html
  • API Reference http://http://scikit-learn.org/stable/modules/classes.html
  • Example Gallery http://http://scikit-learn.org/stable/auto_examples/index.html
  • [Scikit-learn: Machine Learning in Python ](http://http://jmlr.org/papers/v12/pedregosa11a.html)
  • [API design for machine learning software: experiences from the scikit-learn project](http://http://arxiv.org/abs/1309.0238)

更多乾貨文章請關注微信公眾號:bigsec豈安科技


scikit-learn主要是傳統機器學習方法的庫,還有很多pipeline的介面,有必要學習一個。

tensorflow,mxnet,caffe等主要為深度學習而生,選一個入門就行。

大兄弟要是沒gpu,還是先玩玩scikit-learn吧。


等等,scikit-learn 和 tensorflow不一樣把,一個是機器學習的框架,一個是深度學習的框架。我覺得scikit-learn, tensorflow + pytorch 三個就差不多了。如果有餘力,keras也是不錯的,和sklearn類似, 糙模型快的不要不要的。


TensorFlow 是圖計算(或者說符號計算)庫,能搞煉丹是它的附加功能。你拿 TF 裡面的張量其實是可以寫任何東西的,包括傳統機器學習,包括科學計算,只不過大部分人拿它來煉丹罷了。這就好比說 NumPy 是數值計算庫,而不是機器學習庫一樣,TF 的 API 層次跟 NumPy 也差不多,寫起來也差不多。

與之類似的還有 Theano(不過這貨停止維護了)。


為啥不學啊?

(1)還有很多現實情況下需要傳統機器學習的。比如那種結構化的數據(這種情況恐怕我覺得反而是多數)

(2)sklearn是基礎,沒見過只會深度學習不會用sklearn的。

(3)學sklearn,你想調包的話也容易學,不難的;至於其中的演算法原理也是很多深度學習的基礎啊。


我的機子是32位的…


推薦閱讀:

為什麼在數據量較小的時候CPU計算會快於GPU?
PyTorch 有哪些坑/bug?
PyTorch提取中間層特徵?
如何評價 2017 年 12 月 5 日發布的 PyTorch 0.3.0?
如何評價MXNet發布的1.0版本?

TAG:機器學習 | 深度學習DeepLearning | TensorFlow | mxnet |