機器學習(二)-------KNN算法的sklearn KNN實踐

2021-03-02 Maxwell的學習筆記

上次介紹了KNN的基本原理,以及KNN的幾個竅門,這次就來用sklearn實踐一下KNN算法。

一.Skelarn KNN參數概述

要使用sklearnKNN算法進行分類,我們需要先了解sklearnKNN算法的一些基本參數,那麼這節就先介紹這些內容吧。

def KNeighborsClassifier(n_neighbors = 5,
weights='uniform',
algorithm = '',
leaf_size = '30',
p = 2,
metric = 'minkowski',
metric_params = None,
n_jobs = None
)

- n_neighbors:這個值就是指 KNN 中的 「K」了。前面說到過,通過調整 K 值,算法會有不同的效果。
- weights(權重):最普遍的 KNN 算法無論距離如何,權重都一樣,但有時候我們想搞點特殊化,比如距離更近的點讓它更加重要。這時候就需要 weight 這個參數了,這個參數有三個可選參數的值,決定了如何分配權重。參數選項如下:
• 'uniform':不管遠近權重都一樣,就是最普通的 KNN 算法的形式。
• 'distance':權重和距離成反比,距離預測目標越近具有越高的權重。
• 自定義函數:自定義一個函數,根據輸入的坐標值返回對應的權重,達到自定義權重的目的。
- algorithm:在 sklearn 中,要構建 KNN 模型有三種構建方式,1. 暴力法,就是直接計算距離存儲比較的那种放松。2. 使用 kd 樹構建 KNN 模型 3. 使用球樹構建。其中暴力法適合數據較小的方式,否則效率會比較低。如果數據量比較大一般會選擇用 KD 樹構建 KNN 模型,而當 KD 樹也比較慢的時候,則可以試試球樹來構建 KNN。參數選項如下:
• 'brute' :蠻力實現
• 'kd_tree':KD 樹實現 KNN
• 'ball_tree':球樹實現 KNN
• 'auto':默認參數,自動選擇合適的方法構建模型
不過當數據較小或比較稀疏時,無論選擇哪個最後都會使用 'brute'

- leaf_size:如果是選擇蠻力實現,那麼這個值是可以忽略的,當使用KD樹或球樹,它就是是停止建子樹的葉子節點數量的閾值。默認30,但如果數據量增多這個參數需要增大,否則速度過慢不說,還容易過擬合。
- p:和metric結合使用的,當metric參數是"minkowski"的時候,p=1為曼哈頓距離, p=2為歐式距離。默認為p=2。
- metric:指定距離度量方法,一般都是使用歐式距離。
• 'euclidean' :歐式距離
• 'manhattan':曼哈頓距離
• 'chebyshev':切比雪夫距離
• 'minkowski':閔可夫斯基距離,默認參數
- n_jobs:指定多少個CPU進行運算,默認是-1,也就是全部都算。



二. KNN代碼實例

KNN算法算是機器學習裡面最簡單的算法之一了,我們來sklearn官方給出的例子,來看看KNN應該怎樣使用吧:

數據集使用的是著名的鳶尾花數據集,用KNN來對它做分類。我們先看看鳶尾花長的啥樣。

上面這個就是鳶尾花了,這個鳶尾花數據集主要包含了鳶尾花的花萼長度,花萼寬度,花瓣長度,花瓣寬度4個屬性(特徵),以及鳶尾花卉屬於『Setosa,Versicolour,Virginica』三個種類中的哪一類(這三種都長什麼樣我也不知道)。

在使用KNN算法之前,我們要先決定K的值是多少,要選出最優的K值,可以使用sklearn中的交叉驗證方法,代碼如下:

from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
from sklearn.neighbors import KNeighborsClassifier

#讀取鳶尾花數據集
iris = load_iris()
x = iris.data
y = iris.target
k_range = range(1, 31)
k_error = []
#循環,取k=1到k=31,查看誤差效果
for k in k_range:
knn = KNeighborsClassifier(n_neighbors=k)
#cv參數決定數據集劃分比例,這裡是按照5:1劃分訓練集和測試集
scores = cross_val_score(knn, x, y, cv=6, scoring='accuracy')
k_error.append(1 - scores.mean())

#畫圖,x軸為k值,y值為誤差值
plt.plot(k_range, k_error)
plt.xlabel('Value of K for KNN')
plt.ylabel('Error')
plt.show()

運行後,我們可以得到下面這樣的圖:

有了這張圖,我們就能明顯看出K值取多少的時候誤差最小,這裡明顯是K=11最好。當然在實際問題中,如果數據集比較大,那為減少訓練時間,K的取值範圍可以縮小。

有了K值我們就能運行KNN算法了,具體代碼如下:

import matplotlib.pyplot as plt
from numpy import *
from matplotlib.colors import ListedColormap
from sklearn import neighbors, datasets

n_neighbors = 11

# 導入一些要玩的數據
iris = datasets.load_iris()
x = iris.data[:, :2] # 我們只採用前兩個feature,方便畫圖在二維平面顯示
y = iris.target


h = .02 # 網格中的步長

# 創建彩色的圖
cmap_light = ListedColormap(['#FFAAAA', '#AAFFAA', '#AAAAFF'])
cmap_bold = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])


#weights是KNN模型中的一個參數,上述參數介紹中有介紹,這裡繪製兩種權重參數下KNN的效果圖
for weights in ['uniform', 'distance']:
# 創建了一個knn分類器的實例,並擬合數據。
clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights)
clf.fit(x, y)

# 繪製決策邊界。為此,我們將為每個分配一個顏色
# 來繪製網格中的點 [x_min, x_max]x[y_min, y_max].
x_min, x_max = x[:, 0].min() - 1, x[:, 0].max() + 1
y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

# 將結果放入一個彩色圖中
Z = Z.reshape(xx.shape)
plt.figure()
plt.pcolormesh(xx, yy, Z, cmap=cmap_light)

# 繪製訓練點
plt.scatter(x[:, 0], x[:, 1], c=y, cmap=cmap_bold)
plt.xlim(xx.min(), xx.max())
plt.ylim(yy.min(), yy.max())
plt.title("3-Class classification (k = %i, weights = '%s')"
% (n_neighbors, weights))

plt.show()

KNN和Kmeans

前面說到過,KNN和Kmeans聽起來有些像,但本質是有區別的,這裡我們就順便說一下兩者的異同吧。

相同:

K值都是重點

都需要計算平面中點的距離

相異:
Knn和Kmeans的核心都是通過計算空間中點的距離來實現目的,只是他們的目的是不同的。KNN的最終目的是分類,而Kmeans的目的是給所有距離相近的點分配一個類別,也就是聚類。

簡單說,就是畫一個圈,KNN是讓進來圈子裡的人變成自己人,Kmeans是讓原本在圈內的人歸成一類人。

相關焦點

  • KNN算法(三)-sklearn實現
    上篇講到KNN算法的實例。在python中sklearn庫可直接實現KNN算法。本篇介紹運用sklearn庫實現KNN算法。
  • Sk-learn之KNN算法綜合實戰
    前面幾篇文章我們通過幾個小案例熟悉了在Python中使用sklearn模塊來用做機器學習項目的一般步驟,並通過機器學習中最簡單的KNN算法進行演示。這裡我們總結一下,對於一個機器學習一般有如下套路:導包並查看數據形狀以及基本信息,例如樣本個數,欄位,標籤(目標值)等信息使用mold section下的train_test_split方法拆分數據集。
  • 「人工智慧核心之機器學習(2)」——python 實現 KNN
    歡迎大家關注公眾號【哈希大數據】1、KNN算法基本介紹K-Nearest Neighbor(k最鄰近分類算法),簡稱KNN,是最簡單的一種有監督的機器學習算法。也是一種懶惰學習算法,即開始訓練僅僅是保存所有樣本集的信息,直到測試樣本到達才開始進行分類決策。
  • KNN算法中的K有多重要
    from sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)第一個模型是k=1的knn模型。
  • 比KNN快380倍!我們有了新選擇
    圖源:Google我們正在經歷一場滅絕性的大事件,頗受歡迎的KNN算法正面臨淘汰,而幾乎每門數據科學課上都會學習這種算法!下列有幾種ANN算法:· Spotify的【ANNOY】· Google的【ScaNN】· Facebook的【Faiss】· 還有個人最愛:分層可導航小世界圖【HNSW】下面我們把焦點從Python的 sklearn中的KNN算法轉向在Python的hnswlib 包中的HNSW圖這一出色的ANN算法。
  • 機器學習之KNN檢測惡意流量
    背景任何智能活動的都可以稱為人工智慧,而機器學習(Machine Learning)屬於人工智慧的一個分支,深度學習(Deep
  • R語言--鄰近算法KNN
    ❝KNN(k鄰近算法)是機器學習算法中常見的用於分類或回歸的算法。它簡單,訓練數據快,對數據分布沒有要求,使它成為機器學習中使用頻率較高的算法,並且,在深度學習大行其道的今天,傳統可解釋的簡單模型在工業大數據領域的應用更為廣泛。本文介紹KNN算法的基本原理和用R代碼實現。
  • kNN算法量化交易初試
    這一篇簡單地聊一聊kNN算法在股票選擇上的一些應用。kNN算是一個簡單易用的監督學習分類算法,可以比較容易地用在一些特徵矩陣維度不高的數據集上來對target variable進行分類。最近因為在面試一個風控策略算法的崗位,複習了一下分類問題的算法,於是突發奇想拿kNN來分類股票策略,發現 Google 和知網上早就有了相關的paper。
  • 直播案例 | 使用KNN對新聞主題進行自動分類
    本案例旨在用新聞主題分類這一簡單任務演示機器學習的一般流程。具體地,我們使用了一個搜狐新聞數據集。使用 Python 的 jieba 分詞工具對中文新聞進行了分詞處理。然後使用 Scikit-learn 工具的 K近鄰算法構建 KNN 模型。最後對新聞分類的效果進行了簡單的分析。
  • 聚類(三):KNN算法(R語言)
    k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
  • sklearn:Python語言開發的通用機器學習庫
    scikit-learn是Python語言開發的機器學習庫,一般簡稱為sklearn,目前算是通用機器學習算法庫中實現得比較完善的庫了。其完善之處不僅在於實現的算法多,還包括大量詳盡的文檔和示例。其文檔寫得通俗易懂,完全可以當成機器學習的教程來學習。如果要說sklearn文檔的重要性,個人覺得,應該可以與佛經中的《金剛經》相比。
  • 數據科學經典算法 KNN 已被嫌慢,ANN 比它快 380 倍
    近日,一家技術公司的數據科學主管 Marie Stephen Leo 撰文對 KNN 與 ANN 進行了比較,結果表明,在搜索到最近鄰的相似度為 99.3% 的情況下,ANN 比 sklearn 上的 KNN 快了 380 倍。
  • 圖像識別之KNN算法的理解與應用
    該算法既可以用於數據分類,也可以用於數據回歸預測,其核心思路是在訓練樣本中尋找距離最接近待分類樣本的K個樣本。然後,如果目的是分類,則統計這K個樣本中的各個類別數量,數量最多的類別即認為是待分類樣本的類別;如果目的是回歸預測,則計算這K個樣本的平均值作為預測值。圖像識別,本質上也是數據分類,也即把每一張圖像歸類,因此KNN算法可以應用於圖像識別。
  • 可能是關於 kNN 算法最詳細的入門總結
    其次,學習路徑一定程度地被魔化了:很多人說學機器學習要先去啃《西瓜書》、《統計學習方法》這些大篇幅的數學公式算法書,很容易讓新手放棄。要說它不對也有道理。一是可能你並沒有真正想去學它,沒發現它有用或者至少有趣的地方;二是機器學習真的沒有那麼難入門,前提是找到合適自己的方法。所以想清楚為什麼學和從哪兒開始學很重要。
  • 有人斷言KNN面臨淘汰,更快更強的ANN將取而代之
    近日,一家技術公司的數據科學主管 Marie Stephen Leo 撰文對 KNN 與 ANN 進行了比較,結果表明,在搜索到最近鄰的相似度為 99.3% 的情況下,ANN 比 sklearn 上的 KNN 快了 380 倍。
  • 速度數百倍之差,有人斷言KNN面臨淘汰,更快更強的ANN將取而代之
    選自towardsdatascience作者:Marie Stephen Leo機器之心編譯編輯:小舟、杜偉數據科學經典算法 KNN 已被嫌慢,ANN 比它快 380 倍。
  • R語言實現K最近鄰算法(KNN)
    例如西紅柿和四季豆之間的距離為:d(西紅柿,四季豆)=√(6−3)2+(4−7)2=4.2d(西紅柿,四季豆)=(6−3)2+(4−7)2=4.2根據以上算法,我們分別計算了西紅柿和葡萄、四季豆、堅果、橙子之間的距離,分別是2.2、4.2、3.6、1.4。我們發現西紅柿和橙子之間的距離最短,那麼我們據此認為西紅柿是一種水果。
  • 9種常用的機器學習算法實現
    (Supervised Learning,SL),這類算法的工作原理是使用帶標籤的訓練數據來學習輸入變量2、非監督學習(Unsupervised Learning,UL),這類算法的工作原理是從無標籤的訓練數據中學習數據的底層結構。
  • 圖像識別之KNN算法的理解與應用(2)
    在上一篇文章中,我們介紹了KNN算法的原理,並詳細闡述了使用Opencv的KNN算法模塊對手寫數字圖像進行識別,發現識別的準確率還是比較高的,達到
  • 機器學習第二篇:詳解KNN算法
    01|算法簡介:KNN是英文k-nearest neighbor的縮寫,表示K個最接近的點。該算法常用來解決分類問題,具體的算法原理就是先找到與待分類值A距離最近的K個值,然後判斷這K個值中大部分都屬於哪一類,那麼待分類值A就屬於哪一類。