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

首先我們看sklearn和TensorFlow的區別。 這個問題其實等價於:現在深度學習那麼火,那麼是否還有必要學習傳統的機器學習方法。

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

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

1.1 Sklearn和TensorFlow的區別

  Scikit-learn(Sklearn)的定位是通過機器學習庫,而TensorFlow(tf)的定位主要是深度學習庫。一個顯而易見的不同:tf並未提供sklearn那種強大的特徵工程,如維度壓縮,特徵選擇等。

  傳統機器學習:利用特徵工程(feature enginerring),人為對數據進行提煉清洗

  深度學習:利用表示學習(representation learning),機器學習模型自身對數據進行提煉

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

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

  上面這幅圖直觀的對比了我們提到的兩種對於數據的學習方法,傳統的機器學習方法主要依賴人工特徵處理與提取,而深度學習依賴模型自身去學習數據的表示。

1.2 模型封裝的抽象化程度不同,給予使用者自由度不同

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

  比如svm分類器:

clf = svm.SVC() # 初始化一個分類器

clf.fit(X_train, y_train) # 訓練分類器

y_predict = clf.predict(X_test) # 使用訓練好的分類器進行預測

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

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

1.3 深度的群體,項目不同

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

  tf主要適合已經明確瞭解需要用深度學習,且數據處理需求不高的項目。這類項目往往數據量較大,且最終需要的精度更高,一般都需要GPU加速運算。對於深度學習做“小樣”可以在採樣的小數據集上用Keras做快速的實驗。

  下面我們看一個使用Keras搭建的網絡,代碼如下:

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的。

1.4 sklearn和TensorFlow結合使用

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

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

  因此,以sklearn為代表的傳統機器學習庫和以tf為代表的自由靈活更具有針對性的深度學習庫都是機器學習者必須要了解的工具。

  那麼如何結合sklearn庫和Keras模型做機器學習任務呢?

  Keras是Python中比較流行的深度學習庫,但是Keras本身關注的是深度學習。而Python中的scikit-learn庫是建立在Scipy上的,有著比較有效的數值計算能力。Sklearn是一個具有全特徵的通用性機器學習庫,它提供了很多在深度學習中可以用到的工具,舉個例子:

  • 1,可以用sklearn中的 K-fold 交叉驗證方法來對模型進行評估
  • 2,模型參數的評估和尋找

 Keras提供了深度學習模型的簡便包裝,可以在Sklearn中被用來做分類和迴歸,在本文中我們舉這麼一個例子:使用Keras建立神經網絡分類器——KerasClassifier,並在scikit-learn庫中使用這個分類器對UCI的Pima Indians數據集進行分類。

  利用Keras進行分類或者回歸,主要利用Keras中兩個類,一個是KerasClassifier,另一個是KerasRegressor。這兩個類有參數build_fn。build_fn是你創建的Keras名稱,在創建一個Keras模型時,務必要把完成模型的定義,編譯和返回。在這裡我們假設建立的模型叫做create_model(),則:


def create_model():

# create model

model = Sequential()

model.add(Dense(12, input_dim=8, init='uniform', activation='relu'))

model.add(Dense(8, init='uniform', activation='relu'))

model.add(Dense(1, init='uniform', activation='sigmoid'))

# Compile model

model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])

return model

  將建立好的模型通過參數build_fn傳遞到KerasClassifier中,並且定義其他的參數選項nb_epoch = 150,batch_size = 10 。KerasClassifier會自動調用fit方法。

  在Sklearn中,我們使用它cross_validation的包中的StratifiedKFold來進行10折交叉驗證,使用cross_val_score來對模型進行評價。


kfold = StratifiedKFold(y=Y, n_folds=10, shuffle=True, random_state=seed)

results = cross_val_score(model, X, Y, cv=kfold)

  總結來說,機器學習和深度學習均需要學習,只會調用工具包的程序員不是好的機器學習者。

  扯了這麼多,我們明白sklearn和keras結合使用,相得益彰。


分享到:


相關文章: