1. 程式人生 > 其它 >現在 tensorflow 和 mxnet 很火,是否還有必要學習 scikit-learn 等框架?

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

原題如下: 現在 tensorflow 和 mxnet 很火,那麼對於深度學習(機器學習)準備入門的學生還有必要學習 scikit-learning,caffe 之類的框架麼,以及是否有其他需要注意的地方?比如可以通過一些具體的場景描述一下這些框架的使用。

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

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

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

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

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

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

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,http://t.cn/RxwY7Pr )。因此,sklearn 不僅僅是簡單的工具庫,它的文件更像是一份簡單的新手入門指南。

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

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

[1] Log Analytics With Deep Learning and Machine Learning - XenonStack,http://t.cn/R9MLg63

[2] Keras Documentation,https://keras.io/