[python] 機器學習 sklearn和tensorflow

Sklearn庫

        Sklearn是Python中的一個非常重要的機器學習庫,在Sklearn庫中不僅封裝了大量的機器學習算法,它還內置了數據集,節省了獲取和整理數據的時間。下面將簡單介紹一下Sklearn庫中常用的算法。

1、無監督學習算法

 

2、監督學習算法

 

3、數據變換

 注意:以上的每個模型中都包含着多個算法,使用某算法時,直接導入需要的包即可。例如:

from sklearn.linear_model import logistic

 

TensorFlow框架的基本使用

          TensorFlow是一個編程系統,使用圖來表示計算任務。圖中的節點被稱之爲op(operation的縮寫)。一個op獲得0個或多個tensor,執行計算併產生0個或多個tensor。每個 tensor是一個類型化的多維數組。在Python語言中,返回的tensor是NumPy中的ndarray對象。下面我們就對TensorFlow如何使用進行簡單的介紹。

1、常量變量的定義

# 導入需要的包
import tensorflow as tf
 
#常量的定義
cl = tf.constant(9)
 
# 變量的定義
bl = tf.Variable(tf.zeros(2, 2))
 
# 變量要想使用,需要執行以下代碼
init = tf.initialize_all_variables()

       如上例所示,調用TensorFlow中的constant()方法可以定義一個常量,調用Variable()方法可以定義一個變量。這裏需要注意的是,變量定義完之後如果想要使用的話還要執行上例中的最後一條代碼。

2、佔位符的使用

       佔位符常用於變量定義時,定義變量需要初始化,但是有些變量在定義的時候是不知道他們的值的,這個時候就可以使用佔位符來代替,定義方法如下。

  # 佔位符
    zwf = tf.placeholder(tf.int16, [None, 88])

        placeholder()方法可以定義一個佔位符。上例中定義的佔位符指定了zwf這個變量的類型和大小。

3、圖的使用

       就像上面所說的那樣,在TensorFlow中,要實現具體的運算,如最基本的加減乘除,我們不能直接定義幾個變量進行運算,要使用圖來表示計算任務。一個TensorFlow圖描述了計算的過程。爲了進行計算, 圖必須在session裏被啓動,session運行整個計算過程。

a = tf.Variable(5)
b = tf.Variable(5)
c = a * b
 
init = tf.initialize_all_variables()
with tf.Session() as sess:
    sess.run(init)
    print(sess.run(c))

        輸出結果:

25

       上例中的sess.run()是執行操作,session創建使用完之後要釋放。如果使用佔位符的話,需要使用run()方法中的feed_dict參數爲其賦值。
        注意:要先執行初始化變量操作再執行相應的運算。
 

區別

 

1、功能不同

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

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

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也可以用於做傳統的機器學習、包括清理數據,但往往事倍功半。

4、scikit-learn&tensorflow結合使用

更常見的情況下,可以把sklearn和tf,甚至keras結合起來使用。sklearn肩負基本的數據清理任務,keras用於對問題進行小規模實驗驗證想法,而tf用於在完整的的數據上進行嚴肅的調參(煉丹)任務。
而單獨把sklearn拿出來看的話,它的文檔做的特別好,初學者跟着看一遍sklearn支持的功能大概就對機器學習包括的很多內容有了基本的瞭解。舉個簡單的例子,sklearn很多時候對單獨的知識點有概述,比如簡單的異常檢測。因此,sklearn不僅僅是簡單的工具庫,它的文檔更像是一份簡單的新手入門指南。
因此,以sklearn爲代表的傳統機器學習庫(如瑞士軍刀般的萬能但高度抽象),和以tf爲代表的自由靈活更具有針對性的深度學習庫(如樂高般高度自由但使用繁瑣)都是機器學習者必須要瞭解的工具。

不過sklearn 還是很有 必要學習的

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

結尾

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章