iT邦幫忙

2023 iThome 鐵人賽

DAY 21
0
AI & Data

跟我一起在AI的世界裡打怪獸系列 第 21

Day21 K最近鄰(KNN)

  • 分享至 

  • xImage
  •  

繼上次的羅吉斯迴歸,今天要講的KNN也是一個「監督式學習」,但兩者之間還是有著不同的。

羅吉斯回歸通常用來解決「二元分類」的問題,比如是不是垃圾信件、有沒有疾病等等;KNN則是一種「分類算法」
,透過找到與新樣本最近的K個訓練樣本來進行預測,也就是所謂的「物以類聚」,但缺點就是如果數據資料太大可能會比較耗時。


今天的學習目錄

完整的程式我放在GitHub裡面,可以自己拿來練習

  1. 介紹KNN
  2. 機器學習三步驟:初始模型、機器學習、模型預測
  3. 評估預測結果

介紹KNN

KNN的想法是,相同類別的資料,他們的特徵應該很相近,因此如果要看一個東西是哪個類別的,就把他跟訓練時分類的各群放在一起看看,跟誰比較接近,就預測它屬於哪個類別。

跟前面介紹的羅吉斯迴歸比起來還是有點不太一樣的,羅吉斯回歸主要是用特徵的權重去預測新的物體,KNN則是把物體歸類。(這邊要講一下,前面羅吉斯回歸在模型預測部分的假設有點問題,有修改過了,之前有看過的可以回去看一下。)

羅吉斯回歸 KNN最近鄰
概念 用「特徵權重」做分類 誰跟誰比較像就分在一起
分類類型 線性分類 實例分類
模型訓練 將每個X經過訓練計算出權重(比如頭髮長度的權重是0.34,表示頭髮長度有34%的機率決定這個人是男女生) 把特徵類似的Y分到一個個小圈圈
預測過程 把新的物體的特徵(X)乘上權重,得出是某個Y的概率,並以此歸類。 把新的物體跟每個小圈圈比,跟誰比較近就是哪一類。
實際應用 垃圾信件、有沒有感冒 手寫數字、預測一個人的收入水平

機器學習三步驟:初始模型、機器學習、模型預測

from sklearn.neighbors import KNeighborsClassifier

# 初始 KNN 模型
mod = KNeighborsClassifier()

# 訓練模型
mod.fit(X_train, Y_train)

# 模型預測
pred = mod.predict(X_test)

如果有看之前羅吉斯回歸的人,可能會發現,欸?這幾行程式碼看著怎麼有點眼熟?

沒錯,其實除了導入函式庫和初始模型的部分之外,另外兩行都是一樣的過程。有沒有瞬間覺得機器學習好像不難XD

因為主要的模型,載函式庫裡都已經有設定好了,所以只要引進來就好了,不用做太多的另外的操作。

評估預測結果

昨天我們上過的評估預測結果要派上用場啦!

其實程式碼也都跟昨天一模一樣,但還是寫出來吧~

混淆矩陣

from sklearn.metrics import confusion_matrix

# 混淆矩陣
cf = confusion_matrix(Y_test, pred)

# 把矩陣結果加上行列的標題後,打印出來
print(pd.DataFrame(cf, columns=['預測1', '預測2', '預測3'], index=['實際1','實際2', '預測3']))

混淆矩陣
從圖片可以看出來,在第一種和第二種花種的分類上是沒有問題的,在第三種的分類上也不錯,唯獨有一朵花被分類到第二種去了,可能是那朵花的特徵跟第三種比較類似。

綜合報告

from sklearn.metrics import classification_report

# 印出綜合報告
print(classification_report(Y_test, pred))

綜合報告
可以看到第二種(序列1)、第三種(序列2),分別是精準度、召回率低了一點。

因為第二種雖然全對,但有別的花被分過來了,也就是「把別人認成你」,因此精準度會較差。

第三種雖然有一個被分到別種了,「有一個需要識別的沒被識別到」,所以召回率會偏低。但因為沒有資料被誤認成他,所以精準度還是1(100%)。

如果不懂精準度、召回率是什麼和要怎麼分的人,建議可以回去看昨天的這篇Day20 評估機器學習預測結果哦!

結語

今天再舉了KNN的例子,不知道各位對於預測模型結果的部分有沒有比較瞭解了呢?

而且大家有沒有發現,基本的機器學習模型其實真的不會太複雜,因為複雜的部分都已經有人幫我們整理好了。

所以不用太害怕嘛~

當然,今天的教學還是算比較簡單一點的,如果真的要在實際的大數據中運用,會有很多參數需要微調,但我們畢竟只是初入門,學到這裡就已經很厲害啦~

給自己拍拍手吧!


上一篇
Day20 評估機器學習預測結果
下一篇
Day22 決策樹
系列文
跟我一起在AI的世界裡打怪獸30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言