北科資工二多媒體技術與應用 第四周作業-測試 Adaboost、KNN 兩種分類器

筆記說明

此筆記用途在於台北科技大學資訊工程系大二下多媒體技術與應用作業紀錄
並非所有人都適用,部分對我而言稍加容易的內容並不會寫在此內。
這是學習後心得的筆記,可能不太適用會未來的學生

由於我沒有學習過裡面的理論,因此這是資工大二學生透過網路與自身理解的筆記,學習價值並不高、且可能擁有大量錯誤。

題目如下,用圖片

Adaboost

主要是透過 python sklearn.ensemble 函式使用,裡面其中最重要的三個參數如下:

  • n_estimators
    為公式 的可最大疊代次數,其中 W_(k+1)就是每次的疊代次數記錄,通常標準是 50,如果太大可能會導致 overfitting,太小則又不夠精確。
  • learning_rate
    為每個分類器的權重,如果每個分類器的權重越大,那建議 n_estimators 可以小點,如果每個分類器的權重越小,則建議n_estimators 要更大些。

透過鳶尾花資料集進行練習,我發現最主要的問題是 train_test_split 中的 test_size 比例越小時則其準確性越高,反之則越大。

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
from sklearn import svm
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt

iris = datasets.load_iris()

x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

#test_size 越小,準確率越高,越大則準確率越低
#在learning_rate 越大,感覺越好,n_estimators注意不要 overfitting
clf = AdaBoostClassifier(n_estimators=40, learning_rate=1, random_state=0)
clf.fit(x_train, y_train)
print("AdaBoost accuracy")
print(clf.score(x, y))
print()

輸出結果

心得

其中最酷的是 n_estimators在 40 的情況時,準確率會降低,但在 n_estimators 是 30 的情況下時,準確率卻又會上升至 n_estimators 等於 50。

參考連結

sklearn.ensemble.AdaBoostClassifier()函数解析(最清晰的解释)by 我是管小亮
sklearn.ensemble.AdaBoostClassifier by scikit learn
[Day26]機器學習:KNN分類演算法!by iT邦幫忙

KNN

主要是透過 python sklearn.neighbors函式使用,裡面其中最重要的三個參數如下:

  • n_neighbors
    預設是5,是 KKN 演算法中已離你最近的 K 的點為主,將自己也視為此類別。
  • weights
    以要被判斷的點為中心,有兩種方法 uniform 為只要在此範圍內的點權重都相同,而 distance 每個點權重都不同,取決於每個點到中心點的距離。
  • algorithm
    使用的演算法,預設是 auto,也就是函式自動使用適合的演算法,brute 是暴力搜尋,當訓練集大時非常耗時,而 kd_tree and ball_tree 則是用來改善 brute,而產生的演算法。

程式碼

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
from sklearn import svm
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn import datasets
import matplotlib.pyplot as plt

iris = datasets.load_iris()

x = iris.data
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=0)

#只有 weights 感受到差異
neigh = KNeighborsClassifier(n_neighbors=5, algorithm='kd_tree', weights='distance')
neigh.fit(x_train, y_train)
print("KNN accuracy")
print(neigh.predict(x_test))

xx = neigh.predict(x_test)
cnt = 0
for i in range(0, len(x_test)):
if(xx[i] == y_test[i]):
cnt+=1
print("Accuracy", cnt/len(x_test))

結果

心得

其中由於 KNN 會出來的是對於每個點的預測,於是我有在第 30行到第35行簡單的對每筆資料進行判斷。
其中得出我們的 weights 如果使用 distance 的準確率會比 uniform 來的更好。
而 n_neighbors 在這邊我們則不會感受到太大的差異,主要是因為資料量太小且 5 是標準函式預設的 n_neighbors,如果再小可能就會導致 overfitting。

注意:n_neighbors 不可以設定為 1,此函式出來的結果畢竟會是100%準確,沒辦法發揮此函式的功用。

參考連結

sklearn.neighbors.KNeighborsClassifier()函数解析(最清晰的解释)by 我是管小亮
sklearn.neighbors.KNeighborsClassifier by scikit learn
[Day26]機器學習:KNN分類演算法!by iT邦幫忙

心得

謝謝力瑋、梓琳兩位不願其煩的一直教我QQQ,這種東西沒有學過還不太熟悉RRR。

總之紀錄一下自己學習的過程不是一件壞事情八(?。

  • 版權聲明: 本部落格所有文章除有特別聲明外,均採用 Apache License 2.0 許可協議。轉載請註明出處!
  • © 2020-2024 John Doe
  • Powered by Hexo Theme Ayer
  • PV: UV: