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,並非通例):
沒有留言:
張貼留言