[ML, Python] scikit-learn (revision 1)

其實雖然常常自虐自己寫 Machine Learning 的 algorithm

但實際上 ML 演算法太多, 而且加上一個實驗的整個步驟很多事情要做

所以沒事就會去網路上查查一些 off-the-shelf 的軟體來用

那以前在學校比較常用的是 Weka, 程式碼是以 Java 建構的

在學期間有個 project 是用 Weka 去修改 code 完成的

不過因為 Weka 算是滿交錯複雜, 很多 function 之間都互相有一定關係

所以到後來都只是使用上居多, 修改相對少

除了 Weka, 也有用過 Matlab 上的, 不過離開學校就沒機會了

那後來還是對 Python 比較有愛, Python 其實也有不少人寫 ML 來用

不過截至目前為止, 我找到比較完整而且方便使用的, 應該就是 Scikit - Learn 了
(念法 Sci - Kit - Learn)

官網: http://scikit-learn.org/stable/

這篇來簡單講一點內容, 跟稍微提一下怎麼使用他的演算法

此篇應該會一值更新, 因為還有很多功能沒放上

Install - sci-kit learn

首先, 安裝請看官網上的此篇 http://scikit-learn.org/stable/install.html

下列只是此篇重新在描述而已

其實用 Ubuntu 系列的可能會比較方便, 可以利用

sudo apt-get install build-essential python-dev python-numpy python-setuptools python-scipy libatlas-dev

那他還有建議因為一些範例可能會用到畫圖功能, 另外一個套件可以裝的話也盡量安裝
sudo apt-get install python-matplotlib

或者已經有裝 python 的 pip, 可以直接用 pip or easy_install 安裝

pip install -U scikit-learn

easy_install -U scikit-learn

阿想不開的可以從這裡 https://pypi.python.org/pypi/scikit-learn/ 下載 Source 自己安裝
python setup.py install

Windows的就看官網說明吧, 難得我覺得 Windows 比較麻煩安裝

Build-in Datasets - sci-kit learn

官網: http://scikit-learn.org/stable/tutorial/statistical_inference/settings.html

Scikit 內建了一點點的 dataset, 可以讓你簡易的操作使用

他內建了有 iris, digits, boston house price

那使用這內建的 dataset 也很簡單

from sklearn import datasets
iris = datasets.load_iris()
data = iris.data
m, n = data.shape
label = data.target

import 之後, 可以用 iris = datasets.load_iris() 將 iris dataset 呼叫出來給 iris 變數

然後可以用 iris.data 將 data 傳出來, 會是個矩陣, 也可以用 iris.shape 傳出兩個維度

而 isi.target 則是可以可以將 iris 這個 dataset 每個 input 的 class 給傳出來

不過實務上, data 都還是要自己處理的機會比較高, 所以給個使用範例

那我最常用的是 Decision Tree & Random Forest

這邊給個跟官網差不多的範例

Decision Tree - sci-kit learn

Official Site: http://scikit-learn.org/dev/modules/tree.html

使用相當簡單阿, 三歲小孩都會

from sklearn import tree
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = tree.DecisionTreeClassifier()
clf = clf.fit(X, Y)

一行 import, 一行準備好 input, 一行 class label, 一行 set decision tree instance, 一行 train, 打完收工!!

其實 scikit-learn 的演算法使用上都很接近

因為 decision tree 在 sklearn 底下的 tree, 所以要先 import

然後這邊 X 就是你的每個 instance 啦 (範例有兩個 instance)

Y  則是這兩個 instance 的 class label

接著我們要調用 clf = tree.DecisionTreeClassifier()

接著用 clf.fit 傳入 X 跟 Y, 就 training 完畢啦

要拿來 predict 也很簡單, 假設要判斷一個 instance 為 [2., 2.] 是甚麼 class ?
result = clf.predict([[2., 2.]])

print result[0] 就可以看到猜測的答案了

那使用 Random Forest 也差不多

Random Forest - sci-kit learn

Official Site: http://scikit-learn.org/dev/modules/generated/sklearn.ensemble.RandomForestClassifier.html

範例如下

from sklearn import ensemble
X = [[0, 0], [1, 1]]
Y = [0, 1]
clf = ensemble.RandomForestClassifier()
clf = clf.fit(X, Y)
result = clf.predict([[2., 2.]])

近乎一樣的範例, 差異只有 RandomForest 是被分類在 ensemble 底下而非 tree 底下

其餘使用基本上都一模一樣

但是 Random Forest 的可調參數就多了

class sklearn.ensemble.RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None, min_samples_split=2, min_samples_leaf=1, min_density=0.10000000000000001, max_features='auto', bootstrap=True, compute_importances=False, oob_score=False, n_jobs=1, random_state=None, verbose=0)

詳細要看官網說明, 簡單講就是可以調整 tree 的數量, information gain 的選擇, 深度, leaf 數, feature 取法...etc 眾多可調的參數

Model Save - sci-kit learn

那要如何將學習好的 model 儲存起來呢?

官方網站有提供兩個辦法: http://scikit-learn.org/0.10/tutorial.html#model-persistence

1. 這邊我用內建的 cPickle 來儲存

library
import cPickle

儲存

with open('classifier.pkl', 'wb') as fp:
    cPickle.dump(cls, fp) 

讀取

with open('classifier.pkl', 'rb') as fp:
    cls = cPickle.load(fp)

cls 就跟原本的 classifier 用法一樣

2. 用官方內建 library 來儲存

library
from sklearn.externals import joblib

儲存

joblib.dump(clf, 'classifier.pkl', compress=9)

讀取

cls = joblib.load(clf, 'classifier.pkl')
那個 compress 就是可以壓縮 model 的結果, 可以試試看不要加 compress, 檔案會超級超級大

留言

這個網誌中的熱門文章

[Linux] Linux下查詢硬體記憶體資訊 Memory Information

[Other] Chrome 重新整理所有開啟頁面

[Python] Simple Socket Server