說一下最簡單的機器學習模型KNN(k-近鄰),入門機器學習必備!!!

KNN(k-NearestNeighbor)-K最近鄰

KNN雖然是最簡單的算法,但是對剛剛開始機器學習的夥伴確是最好的入門算法,我就從算法本身實現開始,說一些基本概念。

先簡單說一下要用到的一些專業用語:
特徵(features):簡單理解就是物體共有的一些特性,就比如可樂都有甜味,碳酸含量啊;房子,有房屋面積,採光度啊,這些都是物體的特徵,通常用X來表示。
標籤(target):這裏說一下機器學習裏的標籤,就是我們通過物體的特徵來預測的值,我們要得到的結果,通常用y表示。
噪聲:數據不可解釋的部分,通常算法所能達到的期望,泛化誤差的下界。

KNN算法思想

舉個例子看一下,有兩種可樂我們已經知道了碳酸含量和甜味,我們有了一個新可樂(綠點),想知道它是哪個品牌的可樂,圖裏隨便看一下就知道了,顯然我們會把它預測爲黃牌可樂。
在這裏插入圖片描述
生活裏我們常常會有“物以類聚”,“越相近越相似”的想法,這其實就是KNN算法的本質,見名知意,k-近鄰算法,是通過距離判斷k個樣本是否相似,如果距離夠近就認爲他們⾜夠相似,有類似的特徵(features),是屬於同⼀類別,然後根據“少數服從多數,⼀點算⼀票”原則進⾏判斷,數量最多的的標籤(target)類別就是新樣本的標籤類別。
但是要注意的是:
1.因爲一點一票的關係,並不能“人人平等”,對那些住的遠的,需要進行懲罰機制,削弱其對預測結果的影響,懲罰機制在機器學習的算法會常常遇到。
2.量綱對預測結果的影響會非常大,在進行KNN算法前通常會對數據進行統一化,又叫做標準化處理。
3.KNN算法比較簡單,所以可解釋性比較強,像神經網絡等複雜的算法幾乎是沒有薩滿解釋性的,但是對噪聲的非常敏感。

Python代碼實現

我這邊用的是sklearn,代碼都可以在API找到相關的說明:
官方API:sklearn_API_原文版
中文版:sklearn_API_中文版
代碼:

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split#導入分割測試集訓練集數據集方法包
from sklearn.preprocessing import MinMaxScaler#導入歸一化對象
from sklearn.model_selection import cross_val_score#導入交叉驗證方法包
from sklearn.neighbors import KNeighborsClassifier #導入KNN模型算法
plt.style.use("seaborn")
plt.rcParams['font.sans-serif']=['Simhei']  #顯示中文,解決圖中無法顯示中文的問題
plt.rcParams['axes.unicode_minus']=False    #設置顯示中文後,負號顯示受影響。解決座標軸上付好亂碼問題 

#從sklearn調用用load_breast_cancer這個包,實例化sklearn自帶數據包對象,
from sklearn.datasets import load_breast_cancer
#X,就是我們數據的特徵,y是我們要預測的,0是惡性腫瘤,1是良性腫瘤
X = pd.DataFrame(breast_cancer.data)
y = pd.DataFrame(breast_cancer.target)

#分割數據,測試集,訓練集
X_train, X_test, y_train, y_test = train_test_split(X,y,test_size=0.3, random_state=666)

# 實例化一個歸一化對象
minmax = MinMaxScaler()
#使用*訓練集*進行對歸一化對象進行訓練,這裏注意要使用分割後的訓練集數據進行訓練
minmax.fit(X_train)
#對數據進行轉換
X_train_minmax = minmax.transform(X_train)
X_test_minmax = minmax.transform(X_test)

#這裏用學習曲線的方法去調參
trian_score_list=[]
test_score_list=[]
cross_score_list=[]
for i in range(1,31):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(X_train_minmax,y_train)
    trian_score_list.append(knn.score(X_train_minmax,y_train))
    test_score_list.append(knn.score(X_test_minmax,y_test))
    cross_score_list.append(cross_val_score(knn, X_train_minmax, y_train,cv = 5).mean())
plt.plot(range(1,31),trian_score_list,label='trian_score_list')
plt.plot(range(1,31),test_score_list,label='test_score_list')
plt.plot(range(1,31),cross_score_list,label='cross_score_list')
plt.legend();
np.max(cross_score_list)
np.argmax(cross_score_list)

輸出:
以交叉驗證數據爲標準,
分數爲0.962246,
K取得5時取到模型最好
在這裏插入圖片描述
這是機器學習比較簡單的算法,比較適合入門,對機器學習感興趣的可以多瞭解瞭解。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章