> 簡單了解傳統機器學習庫SKLearn和深度學習庫TensorFlow。
> 本課學習時長評估:1小時。
> [原文鏈接](https://www.cnblogs.com/lixuejian/p/10562092.html)
## 功能不同
Scikit-learn(sklearn)的定位是通用機器學習庫,而TensorFlow(tf)的定位主要是深度學習庫。
一個顯而易見的不同:tf并未提供sklearn那種強大的特征工程,如維度壓縮、特征選擇等。
究其根本,是因為機器學習模型的兩種不同的處理數據的方式:
* 傳統機器學習:利用特征工程(feature engineering),人為對數據進行提煉清洗
* 深度學習:利用表示學習(representation learning),機器學習模型自身對數據進行提煉
sklearn更傾向于使用者可以自行對數據進行處理,比如選擇特征、壓縮維度、轉換格式,是傳統機器學習庫。
而以tf為代表的深度學習庫會自動從數據中抽取有效特征,而不需要人為的來做這件事情,因此并未提供類似的功能。
## 使用自由度不同
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才更像深度學習界的sklearn。
從自由度角度來看,tf更高;
從抽象化、封裝程度來看,sklearn更高;
從易用性角度來看,sklearn更高。
## 針對的群體、項目不同
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也可以用于做傳統的機器學習、包括清理數據,但往往事倍功半。
## scikit-learn&tensorflow結合使用
更常見的情況下,可以把**sklearn和tf,甚至keras結合起來使用**。
sklearn肩負基本的數據清理任務,keras用于對問題進行小規模實驗驗證想法,而tf用于在完整的的數據上進行嚴肅的調參(煉丹)任務。
而單獨把sklearn拿出來看的話,它的文檔做的特別好,初學者跟著看一遍sklearn支持的功能大概就對機器學習包括的很多內容有了基本的了解。
舉個簡單的例子,sklearn很多時候對單獨的知識點有概述,比如簡單的異常檢測。因此,sklearn不僅僅是簡單的工具庫,它的文檔更像是一份簡單的新手入門指南。
因此,以sklearn為代表的傳統機器學習庫(如瑞士軍刀般的萬能但高度抽象),和以tf為代表的自由靈活更具有針對性的深度學習庫(如樂高般高度自由但使用繁瑣)都是機器學習者必須要了解的工具。
## 不過sklearn 還是很有 必要學習的
理論上來說,**深度學習技術也是機器學習的一個組成部分**,學習其他傳統機器學習方法對深入理解深度學習技術有很大幫助,知道模型凸的條件,才能更好的理解神 經網絡的非凸。知道傳統模型的優點,才能更好的理解深度學習并不是萬能的,也有很多問題和場景直接使用深度學習方法會遇到瓶頸和問題,需要傳統方法來解 決。
從實踐上來說,深度學習方法一般需要大量GPU機器,工業界哪怕大公司的GPU資源也是有限的,一般只有深度學習方法效果遠好于傳統方法并且 對業務提升很大的情況下,才會考慮使用深度學習方法,例如語音識別,圖像識別等任務現在深度學習方法用的比較多,而NLP領域除了機器翻譯以外,其他大部 分任務仍然更常使用傳統方法。傳統方法一般有著更好的可解釋性,這對檢查調試模型也是非常有幫助的。工業上一般喜歡招能解決問題的人,而不是掌握最火技術 的人,因此在了解深度學習技術的同時,學習一下傳統方法是很有好處的。
## 結尾
說實話,即使現在深度學習大行其道,很多時候你還是要用傳統機器學習方法解決問題的。首先不是每個人都有一個彪悍的電腦/服務器,其次,大多數問題真的不需要深度網絡。最后,只會調用工具包的程序員不是好的機器學習者。