機器學習 第四章KNN演算法

2021-09-17 03:25:29 字數 4341 閱讀 4712

k近鄰演算法是機器學習中最簡單的分類演算法之一,這篇文章主要講解knn演算法的在scikit-learn中的使用,其中不僅僅包括了演算法本身,還有測試訓練集的分離,交叉驗證的使用,資料標準化等。

首先用乙個簡單的例子引入knn演算法

import numpy as np

import matplotlib.pyplot as plt

from sklearn.neighbors import kneighborsclassifier #從sklearn中匯入knn分類器

#建立乙個簡單的group分組,以及每個不同樣本對應的lebel

group = np.array([[

1,1]

,[1,

1.1],[

0,0.1],[

0,0]

])labels = np.array(

['a'

,'a'

,'b'

,'b'])

#視覺化一下我們的資料

#實現乙個簡單的knn分類器

knn_cls = kneighborsclassifier(n_neighbors=3)

#n_neighbor表示我們選擇的近鄰的資料個數

knn_cls.fit(group,labels)

#**一下(1,1.3)這個資料應該是a還是b

knn_cls.predict([[

1,1.3]])

out:array(

['a'

], dtype=

') 這時候分類器告訴我們這個點是屬於a分類的

這樣乙個簡單的knn分類器就實現了是不是很簡單,下面我們用乙個更複雜的例子實現knn分類器以及文章開頭我提到的功能。

這裡我們使用鳶尾花資料集

in

:from sklearn.datasets import load_iris

iris = load_iris(

) iris.data

out:array([[

5.1,

3.5,

1.4,

0.2],[

4.9,3.

,1.4

,0.2],

[4.7

,3.2

,1.3

,0.2],

[4.6

,3.1

,1.5

,0.2],

[5.,

3.6,

1.4,

0.2],[

5.4,

3.9,

1.7,

0.4],.

..])

#這四個特徵分別為花萼長度,花萼寬度,花瓣長度,花瓣寬度

in:iris.target

out:array([0

,0,0

,0,0

,0,0

...]

)#這裡的0代表第一種鳶尾花,1代表第二種鳶尾花,2代表第三種鳶尾花由於資料集比較多所以這裡只顯示了前6個資料,實際上後面還有很多分類為1和分類為2的資料

資料視覺化
plt.scatter(x[y==0,

這時我們取了鳶尾花的花萼長度和花萼寬度兩個特徵進行了繪圖,當然你也可以選取其他兩個特徵,可以看出鳶尾花的分布還是比較有規律的。

訓練測試的分離

由於我們需要對我們訓練的模型進行乙個評估,所以我們將資料分為測試集和訓練集,我們用測試集擬合我們的模型,之後用測試集來對我們的模型好壞進行評估,這樣就有了訓練測試集的分離

from sklearn.model_selection import train_test_split

x_train,x_test,y_train,y_test = train_test_split(x,y,test_size=

0.2,random_state=42)

#這裡我們設定了訓練集與測試集的比例為2:8

資料的標準化

這裡我們使用z-score標準化,在sklearn的學習中,資料集的標準化是很多機器學習模型演算法的常見要求。如果個別特徵看起來不是很符合正態分佈,那麼他們可能為表現不好。

from sklearn.preprocessing import standardscaler  #匯入均值方差標準化

scaler = standardscaler(

) scaler.fit(x_train)

#讓我們的scaler擬合測試資料

x_train_scale = scaler.transform(x_train)

#這樣就能將資料均值方差標準化了

#再來看一下我們的資料

可以看到資料的均值和方差變為了0和1但是實際形狀和之前並沒有變化。這樣的均值方差歸一化方便我們的演算法更加準確的擬合資料。

超引數的設定以及交叉驗證

knn演算法我們可以設定不同的引數,首先最清楚的k引數是選擇距離最近的資料的個數,還存在乙個引數weights,預設情況下weights = uniform 而當weights = distance時,knn演算法則會考慮當前樣本到鄰近k個樣本的距離權重,還有關於距離的引數這裡我不詳細介紹,主要介紹交叉驗證這種思想。

param_grid =[,

]#對以上的超引數進行遍歷

knn_clf = kneighborsclassifier(

)from sklearn.model_selection import gridsearchcv

grid_search = gridsearchcv(knn_clf,param_grid,cv=3)

#cv表示叫交叉驗證的次數

grid_search.fit(x_train,y_train)

這時就能得到我們最好的分數,以及最好的引數選擇了

in

:grid_search.best_score_

out:

0.7583333333333333

in:grid_search.best_params_

out:

accuracy_score

我們一般用accuracy_score來衡量我們的演算法的準確度,使用方法如下:

in

:from sklearn.metrics import accuracy_score

accuracy_score(y_test,y_predict)

#這裡我們用我們**的y_predict和測試集中實際的y_test進行評估

out:

0.9

機器學習第四章學習筆記

真的不開學了嗎,家裡蹲一學期?頂不住了 而在學習的過程中,首先的問題就是解域 這兩個引數的解究竟在哪個範圍,確定了範圍再求出最優解 也就是在解域中求得最優解 首先對於資料預處理,使兩類在超平面的同一側 並行感知機和序列感知機是以樣本的給出方式劃分的,樣本一次全部給出稱為並行,乙個乙個給出稱為序列 而...

機器學習 第四章 概念學習

本文為閱讀總結個人認為書裡概念性的 對本人有幫助的內容,僅供參考。邏輯模型的特點是它們均通過邏輯表示式將例項空間劃分為一組區隔,因此所構建的都是分組模型。而其目標可概括如下 針對所要解決的任務,找到可使每個區隔中的資料更為一致的例項空間劃分方案。在分類任務中我們希望找到這樣一種劃分 位於每個區隔中的...

演算法第四章作業

1.我對貪心演算法的理解 貪心演算法是指,在對問題求解時,總是做出在當前看來是最好的選擇。也就是說,不從整體最優上加以考慮,他所做出的是在某種意義上的區域性最優解。貪心演算法不是對所有問題都能得到整體最優解,關鍵是貪心策略的選擇,選擇的貪心策略必須具備無後效性,即某個狀態以前的過程不會影響以後的狀態...