繼上次的羅吉斯迴歸,今天要講的KNN也是一個「監督式學習」,但兩者之間還是有著不同的。
羅吉斯回歸通常用來解決「二元分類」的問題,比如是不是垃圾信件、有沒有疾病等等;KNN則是一種「分類算法」
,透過找到與新樣本最近的K個訓練樣本來進行預測,也就是所謂的「物以類聚」,但缺點就是如果數據資料太大可能會比較耗時。
完整的程式我放在GitHub裡面,可以自己拿來練習
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的例子,不知道各位對於預測模型結果的部分有沒有比較瞭解了呢?
而且大家有沒有發現,基本的機器學習模型其實真的不會太複雜,因為複雜的部分都已經有人幫我們整理好了。
所以不用太害怕嘛~
當然,今天的教學還是算比較簡單一點的,如果真的要在實際的大數據中運用,會有很多參數需要微調,但我們畢竟只是初入門,學到這裡就已經很厲害啦~
給自己拍拍手吧!