基於scikit-learn包實現機器學習之KNN(K近鄰)html
scikit-learn(簡稱sklearn)是目前最受歡迎,也是功能最強大的一個用於機器學習的Python庫件。它普遍地支持各類分類、聚類以及迴歸分析方法好比支持向量機、隨機森林、DBSCAN等等,因爲其強大的功能、優異的拓展性以及易用性,目前受到了不少數據科學從業者的歡迎,也是業界至關著名的一個開源項目之一。算法
基於上一篇的k近鄰原理講解,咱們這一片主要是利用相應的工具包實現機器學習,爲了逐步掌握這樣成功的工具包,咱們從簡單的KNN開始入手,其中scikit-learn就是一個不錯的選擇。數組
首先咱們須要安裝sklearn這個庫(因爲您能夠在咱們的網頁上進行全部的實驗,因此您能夠在以後再嘗試在您的電腦上安裝sklearn)。sklearn是Python的擴展庫,所以咱們必須首先設置好Python運行環境。同時,因爲sklearn基於Numpy和Scipy這兩個庫,咱們也要首先安裝好它們。而後,咱們即可以使用pip
或conda
來自動安裝sklearn,具體方法以下:數據結構
# 安裝sklearn以前必須先安裝較新版本的Scipy與Numpy
# 使用pip安裝sklearn:
pip install -U scikit-learn
# 使用conda安裝sklearn:
conda install scikit-learn多線程
安裝好sklearn以後,咱們即可以在Python腳本中使用來自sklearn中的各類數據、功能函數等等。dom
數據是機器學習的關鍵,在機器學習工做中咱們須要花費大量的時間來採集和整理數據,合理且科學的數據是獲得良好機器學習效果的關鍵。通常而言,一個分類問題的機器學習過程須要用到四塊數據內容,分別是:機器學習
train
來表示target
來表示test
來表示expected
來表示爲了方便學習和測試機器學習中的各類內容,sklearn內置了各類有用的數據集,文本處理、圖像識別等具備表明性的問題的數據在sklearn中均有收集(對於初學者來講,不得不說很人性化)。函數
本文中用的鳶尾花數據集一樣能夠在sklearn中的datasets
模塊中找到。工具
很少說,直接先上代碼,後面再進行詳解。性能
#-*-coding:utf-8 -*-
from sklearn import datasets
#導入內置數據集模塊
from sklearn.neighbors import KNeighborsClassifier
#導入sklearn.neighbors模塊中KNN類
import numpy as np
np.random.seed(0)
#設置隨機種子,不設置的話默認是按系統時間做爲參數,所以每次調用隨機模塊時產生的隨機數都不同設置後每次產生的同樣
iris=datasets.load_iris()
#導入鳶尾花的數據集,iris是一個相似於結構體的東西,內部有樣本數據,若是是監督學習還有標籤數據
iris_x=iris.data
#樣本數據150*4二維數據,表明150個樣本,每一個樣本4個屬性分別爲花瓣和花萼的長、寬
iris_y=iris.target
#長150的覺得數組,樣本數據的標籤
indices = np.random.permutation(len(iris_x))
#permutation接收一個數做爲參數(150),產生一個0-149一維數組,只不過是隨機打亂的,固然她也能夠接收一個一維數組做爲參數,結果是直接對這個數組打亂
iris_x_train = iris_x[indices[:-10]]
#隨機選取140個樣本做爲訓練數據集
iris_y_train = iris_y[indices[:-10]]
#而且選取這140個樣本的標籤做爲訓練數據集的標籤
iris_x_test = iris_x[indices[-10:]]
#剩下的10個樣本做爲測試數據集
iris_y_test = iris_y[indices[-10:]]
#而且把剩下10個樣本對應標籤做爲測試數據及的標籤
knn = KNeighborsClassifier()
#定義一個knn分類器對象
knn.fit(iris_x_train, iris_y_train)
#調用該對象的訓練方法,主要接收兩個參數:訓練數據集及其樣本標籤
iris_y_predict = knn.predict(iris_x_test)
#調用該對象的測試方法,主要接收一個參數:測試數據集
probility=knn.predict_proba(iris_x_test)
#計算各測試樣本基於機率的預測
neighborpoint=knn.kneighbors(iris_x_test[-1],5,False)
#計算與最後一個測試樣本距離在最近的5個點,返回的是這些樣本的序號組成的數組
score=knn.score(iris_x_test,iris_y_test,sample_weight=None)
#調用該對象的打分方法,計算出準確率
print('iris_y_predict = ')
print(iris_y_predict)
#輸出測試的結果
print('iris_y_test = ')
print(iris_y_test)
#輸出原始測試數據集的正確標籤,以方便對比
print 'Accuracy:',score
#輸出準確率計算結果
print 'neighborpoint of last test sample:',neighborpoint
print 'probility:',probility
***********************************
結果輸出:
iris_y_predict =
[1 2 1 0 0 0 2 1 2 0]
iris_y_test =
[1 1 1 0 0 0 2 1 2 0]
Accuracy: 0.9
neighborpoint of last test sample: [[ 75 41 96 78 123]]
probility: [[ 0. 1. 0. ]
[ 0. 0.4 0.6]
[ 0. 1. 0. ]
[ 1. 0. 0. ]
[ 1. 0. 0. ]
[ 1. 0. 0. ]
[ 0. 0. 1. ]
[ 0. 1. 0. ]
[ 0. 0. 1. ]
[ 1. 0. 0. ]]
基於此,KNN算法實現已經完全完成了,固然,咱們仍是須要稍微再解讀一下,上面所說的主要兩個對象的方法,一個是fit()方法,一個是predict()方法,我說的主要接受兩個參數,並非說只接受兩個參數或者一個參數,而是說其餘參數都有默認值,且是內部參數,這裏咱們詳細解讀。KNeighborsClassifier是一個類,它集成了其餘的NeighborsBase, KNeighborsMixin,SupervisedIntegerMixin, ClassifierMixin。這裏咱們暫時無論它。主要看它的幾個主要的方法。固然有的方法是其從父類那裏集成過來的。
__init__() 初始化函數(構造函數) 它主要有一下幾個參數:
n_neighbors=5
int 型參數 knn算法中指定以最近的幾個最近鄰樣本具備投票權,默認參數爲5
weights='uniform'
str參數 即每一個擁有投票權的樣本是按什麼比重投票,'uniform'表示等比重投票,'distance'表示按距離反比投票,[callable]表示本身定義的一個函數,這個函數接收一個
距離數組,返回一個權值數組。默認參數爲‘uniform’
algrithm='auto'
str參數 即內部採用什麼算法實現。有如下幾種選擇參數:'ball_tree':球樹、'kd_tree':kd樹、'brute':暴力搜索、'auto':自動根據數據的類型和結構選擇合適的算法。默認狀況下是‘auto’。暴力搜索就不用說了你們都知道。具體前兩種樹型數據結構哪一種好視狀況而定。KD樹是對依次對K維座標軸,以中值切分構造的樹,每個節點是一個超矩形,在維數小於20時效率最高--能夠參看《統計學習方法》第二章。ball tree 是爲了克服KD樹高維失效而發明的,其構造過程是以質心C和半徑r分割樣本空間,每個節點是一個超球體。通常低維數據用kd_tree速度快,用ball_tree相對較慢。超過20維以後的高維數據用kd_tree效果反而不佳,而ball_tree效果要好,具體構造過程及優劣勢的理論你們有興趣能夠去具體學習。
leaf_size=30
int參數 基於以上介紹的算法,此參數給出了kd_tree或者ball_tree葉節點規模,葉節點的不一樣規模會影響數的構造和搜索速度,一樣會影響儲樹的內存的大小。具體最優規模是多少視狀況而定。
matric='minkowski'
str或者距離度量對象 即怎樣度量距離。默認是閔氏距離,閔氏距離不是一種具體的距離度量方法,它能夠說包括了其餘距離度量方式,是其餘距離度量的推廣,具體各類距離度量只是參數p的取值不一樣或者是否去極限的不一樣狀況,具體你們能夠參考這裏,講的很是詳細
p=2
int參數 就是以上閔氏距離各類不一樣的距離參數,默認爲2,即歐氏距離。p=1表明曼哈頓距離等等
metric_params=None
距離度量函數的額外關鍵字參數,通常不用管,默認爲None
n_jobs=1
int參數 指並行計算的線程數量,默認爲1表示一個線程,爲-1的話表示爲CPU的內核數,也能夠指定爲其餘數量的線程,這裏不是很追求速度的話不用管,須要用到的話去看看多線程。
fit()
訓練函數,它是最主要的函數。接收參數只有1個,就是訓練數據集,每一行是一個樣本,每一列是一個屬性。它返回對象自己,即只是修改對象內部屬性,所以直接調用就能夠了,後面用該對象的預測函數取預測天然及用到了這個訓練的結果。其實該函數並非KNeighborsClassifier這個類的方法,而是它的父類SupervisedIntegerMixin繼承下來的方法。
predict()
預測函數 接收輸入的數組類型測試樣本,通常是二維數組,每一行是一個樣本,每一列是一個屬性返回數組類型的預測結果,若是每一個樣本只有一個輸出,則輸出爲一個一維數組。若是每一個樣本的輸出是多維的,則輸出二維數組,每一行是一個樣本,每一列是一維輸出。
predict_prob()
基於機率的軟判決,也是預測函數,只是並非給出某一個樣本的輸出是哪個值,而是給出該輸出是各類可能值的機率各是多少接收參數和上面同樣返回參數和上面相似,只是上面該是值的地方所有替換成機率,好比說輸出結果又兩種選擇0或者1,上面的預測函數給出的是長爲n的一維數組,表明各樣本一次的輸出是0仍是1.而若是用機率預測函數的話,返回的是n*2的二維數組,每一行表明一個樣本,每一行有兩個數,分別是該樣本輸出爲0的機率爲多少,輸出1的機率爲多少。而各類可能的順序是按字典順序排列,好比先0後1,或者其餘狀況等等都是按字典順序排列。
score()
計算準確率的函數,接受參數有3個。 X:接收輸入的數組類型測試樣本,通常是二維數組,每一行是一個樣本,每一列是一個屬性。y:X這些預測樣本的真實標籤,一維數組或者二維數組。sample_weight=None,是一個和X第一位同樣長的各樣本對準確率影響的權重,通常默認爲None.輸出爲一個float型數,表示準確率。內部計算是按照predict()函數計算的結果記性計算的。其實該函數並非KNeighborsClassifier這個類的方法,而是它的父類KNeighborsMixin繼承下來的方法。
kneighbors()
計算某些測試樣本的最近的幾個近鄰訓練樣本。接收3個參數。X=None:須要尋找最近鄰的目標樣本。n_neighbors=None,表示須要尋找目標樣本最近的幾個最近鄰樣本,默認爲None,須要調用時給出。return_distance=True:是否須要同時返回具體的距離值。返回最近鄰的樣本在訓練樣本中的序號。其實該函數並非KNeighborsClassifier這個類的方法,而是它的父類KNeighborsMixin
繼承下來的方法。
下面舉一個簡單例子讓你們稍微看看,(其實上面的例子已經很具體形象了):
Examples
--------
>>> X = [[0], [1], [2], [3]]
>>> y = [0, 0, 1, 1]
>>> from sklearn.neighbors import KNeighborsClassifier
>>> neigh = KNeighborsClassifier(n_neighbors=3)
>>> neigh.fit(X, y)
>>> print(neigh.predict([[1.1]]))
[0]
>>> print(neigh.predict_proba([[0.9]]))
[[ 0.66666667 0.33333333]]
以上講解關於sklearn中的knn算法基本講解完了,不知道你們是否學會了呢?以上部分除了sklearn背景介紹,後面的部分爲原創,但願你們共同窗習共同進步,後續會繼續更新sklearn的其餘方法。