code

2017年8月31日 星期四

Applied Machine Learning in Python 1 - KNN

Libraries

scikit-learn : 本課程的主角。
SciPy: 數學與統計
NumPy: data structures
pandas:data analysis/manipulation
matplotlib:2d plotting library


從Dataframe開始

假設我們用pandas讀進以下的 59x7 dataframe:



可以看到已經有分類的fruit_label的column,所以這將會是一個supervised learning data。
怎麼build 一個classifier?


檢視data 是否需要前處理

這不必講了,就是一個必要過程。


檢視與挑選features

如果把以下幾個feature pair-wise劃出histogram以及scatterplot:


2d feature space 老實講我是看不出有形成clusters。
不過如果採用3d feature space好像稍微比較有明顯度:


不過反正這只是一個範例。


獲得Training set and test set

需要從原本dataframe分出training set以及 test set。

(1) 首先決定我們要那些features? 把這些columns抓出來變成我們的source dataframe:
# For this example, we use the mass, width, and height features of each fruit instance
X = fruits[['mass', 'width', 'height']]
y = fruits['fruit_label']

注意我們用大寫變數來表示一個2D data (2darray / dataframe)


 (2) 再來我們把label column特別拿出來變成一個series (1d array):
y = fruits['fruit_label']



(3) 再來就讓sklearn來幫我們製作出random 3:1比例的training set / test set:





from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)

這樣就有了training features + training labels, 以及test features + test labels。








train classifier (KNN k-nearest neighbors)

KNN是一種"memory based" supervised classifier,因為他的藉由記憶traning set中的label來分類未知的sample。 詳細知識已經寫在Columbia AI課程18。 下圖是1-NN的decision boundary結果(我們上面的fruit dataset):
所以我們需要知道

 1. distance function定義 (e.g. Euclidean)

 2. K值

 3. 有沒有weight給任何特定neighbors? 

4. K > 1的時候,如何決定新sample的class (e.g. 投票?)

 以下sklearn library幫我們製作一個KNN classifier:

from sklearn.neighbors import KNeighborsClassifier

knn = KNeighborsClassifier(n_neighbors = 5)
knn.fit(X_train, y_train)


KNeighborsClassifier 是一個sklearn estimator,所以都含有同樣的interface fit()
fit function會改變estimator internal state,當training完畢。

可以看到knn是以下設定的estimator instance:




評估estimator的好壞

我們的test set就派上用場了,利用estimator的score() funciton,我們ˊ可以評估test set的"accuracy",accuracy的定義可以看這篇筆記我怎麼找不到。


accuracy = #(true label) / #(predicted true)

如果不滿意accuracy或是specificity,就看要怎麼調整training過程。


使用estimator

classifier製作完成了,可以用以下的function來predict new sample:

fruit_prediction = knn.predict([[20, 4.3, 5.5]])

lookup_fruit_name = dict(zip(fruits.fruit_label.unique(), fruits.fruit_name.unique()))
print('prediction = {}'.format(lookup_fruit_name[fruit_prediction[0]]))



K值的影響

對decision boundary來說,這是一個tradeoff (bias - variance tradeoff):



對accuracy的影響 (只針對此次training與test,並非通例):


沒有留言:

張貼留言