
- Scikit Learn 教程
- Scikit Learn - 首頁
- Scikit Learn - 簡介
- Scikit Learn - 建模過程
- Scikit Learn - 資料表示
- Scikit Learn - 估計器API
- Scikit Learn - 約定
- Scikit Learn - 線性建模
- Scikit Learn - 擴充套件線性建模
- 隨機梯度下降
- Scikit Learn - 支援向量機
- Scikit Learn - 異常檢測
- Scikit Learn - K近鄰演算法
- Scikit Learn - KNN學習
- 樸素貝葉斯分類
- Scikit Learn - 決策樹
- 隨機決策樹
- Scikit Learn - 整合方法
- Scikit Learn - 聚類方法
- 聚類效能評估
- 使用PCA進行降維
- Scikit Learn 有用資源
- Scikit Learn - 快速指南
- Scikit Learn - 有用資源
- Scikit Learn - 討論
Scikit Learn - KNN學習
k-NN(k近鄰演算法)是最簡單的機器學習演算法之一,它是非引數的和惰性的。非引數意味著它不對底層資料分佈做任何假設,即模型結構由資料集決定。惰性或基於例項的學習意味著它不需要任何訓練資料點來生成模型,整個訓練資料都用於測試階段。
k-NN演算法包含以下兩個步驟:
步驟1
此步驟計算並存儲訓練集中每個樣本的k個最近鄰。
步驟2
此步驟對於未標記的樣本,從資料集中檢索k個最近鄰。然後,在這k個最近鄰中,透過投票預測類別(得票最多的類別獲勝)。
實現k近鄰演算法的模組sklearn.neighbors提供了無監督和監督的基於鄰域的學習方法的功能。
無監督最近鄰實現不同的演算法(BallTree、KDTree或蠻力法)來為每個樣本找到最近鄰。這個無監督版本基本上只有上面討論的步驟1,它是許多演算法(KNN和K均值是最著名的)的基礎,這些演算法需要鄰域搜尋。簡單來說,它是用於實現鄰域搜尋的無監督學習器。
另一方面,監督基於鄰域的學習用於分類和迴歸。
無監督KNN學習
如上所述,存在許多像KNN和K均值這樣的演算法需要最近鄰搜尋。這就是為什麼Scikit-learn決定將其鄰域搜尋部分實現為它自己的“學習器”。將鄰域搜尋作為單獨的學習器的原因是,計算所有成對距離以查詢最近鄰顯然效率不高。讓我們看看Sklearn用於實現無監督最近鄰學習的模組以及示例。
Scikit-learn模組
sklearn.neighbors.NearestNeighbors是用於實現無監督最近鄰學習的模組。它使用名為BallTree、KDTree或蠻力法的特定最近鄰演算法。換句話說,它充當這三種演算法的統一介面。
引數
下表包含NearestNeighbors模組使用的引數:
序號 | 引數及描述 |
---|---|
1 |
n_neighbors − int,可選 要獲取的鄰居數量。預設值為5。 |
2 |
radius − float,可選 它限制返回鄰居的距離。預設值為1.0。 |
3 |
algorithm − {‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’},可選 此引數將採用您要用於計算最近鄰的演算法(BallTree、KDTree或蠻力法)。如果您提供‘auto’,它將嘗試根據傳遞給fit方法的值決定最合適的演算法。 |
4 |
leaf_size − int,可選 它可以影響構建和查詢的速度以及儲存樹所需的記憶體。它傳遞給BallTree或KDTree。雖然最佳值取決於問題的性質,但其預設值為30。 |
5 |
metric − 字串或可呼叫物件 用於計算點之間距離的度量。我們可以將其作為字串或可呼叫函式傳遞。對於可呼叫函式,度量在每一對行上呼叫,並記錄結果值。它不如將度量名稱作為字串傳遞有效率。 我們可以從scikit-learn或scipy.spatial.distance中選擇度量。有效值為: Scikit-learn − [‘cosine’,’manhattan’,’Euclidean’, ‘l1’,’l2’, ‘cityblock’] Scipy.spatial.distance − [‘braycurtis’,’canberra’,’chebyshev’,’dice’,’hamming’,’jaccard’, ‘correlation’,’kulsinski’,’mahalanobis’,’minkowski’,’rogerstanimoto’,’russellrao’, ‘sokalmicheme’,’sokalsneath’, ‘seuclidean’, ‘sqeuclidean’, ‘yule’]。 預設度量為‘Minkowski’。 |
6 |
P − 整數,可選 它是Minkowski度量的引數。預設值為2,相當於使用Euclidean_distance(l2)。 |
7 |
metric_params − dict,可選 這是度量函式的其他關鍵字引數。預設值為None。 |
8 |
N_jobs − int或None,可選 它表示為鄰域搜尋執行的並行作業數。預設值為None。 |
實現示例
下面的示例將使用sklearn.neighbors.NearestNeighbors模組查詢兩組資料之間的最近鄰。
首先,我們需要匯入所需的模組和包:
from sklearn.neighbors import NearestNeighbors import numpy as np
現在,匯入包後,定義我們要在其間查詢最近鄰的資料集:
Input_data = np.array([[-1, 1], [-2, 2], [-3, 3], [1, 2], [2, 3], [3, 4],[4, 5]])
接下來,應用無監督學習演算法,如下所示:
nrst_neigh = NearestNeighbors(n_neighbors = 3, algorithm = 'ball_tree')
接下來,使用輸入資料集擬合模型。
nrst_neigh.fit(Input_data)
現在,查詢資料集的K近鄰。它將返回每個點的鄰居的索引和距離。
distances, indices = nbrs.kneighbors(Input_data) indices
輸出
array( [ [0, 1, 3], [1, 2, 0], [2, 1, 0], [3, 4, 0], [4, 5, 3], [5, 6, 4], [6, 5, 4] ], dtype = int64 ) distances
輸出
array( [ [0. , 1.41421356, 2.23606798], [0. , 1.41421356, 1.41421356], [0. , 1.41421356, 2.82842712], [0. , 1.41421356, 2.23606798], [0. , 1.41421356, 1.41421356], [0. , 1.41421356, 1.41421356], [0. , 1.41421356, 2.82842712] ] )
上述輸出顯示每個點的最近鄰都是該點本身,即為零。這是因為查詢集與訓練集匹配。
示例
我們還可以透過生成稀疏圖來顯示相鄰點之間的連線,如下所示:
nrst_neigh.kneighbors_graph(Input_data).toarray()
輸出
array( [ [1., 1., 0., 1., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0.], [1., 1., 1., 0., 0., 0., 0.], [1., 0., 0., 1., 1., 0., 0.], [0., 0., 0., 1., 1., 1., 0.], [0., 0., 0., 0., 1., 1., 1.], [0., 0., 0., 0., 1., 1., 1.] ] )
一旦我們擬合了無監督的NearestNeighbors模型,資料將儲存在基於引數‘algorithm’設定的值的資料結構中。之後,我們可以在需要鄰域搜尋的模型中使用這個無監督學習器的kneighbors。
完整的可執行程式
from sklearn.neighbors import NearestNeighbors import numpy as np Input_data = np.array([[-1, 1], [-2, 2], [-3, 3], [1, 2], [2, 3], [3, 4],[4, 5]]) nrst_neigh = NearestNeighbors(n_neighbors = 3, algorithm='ball_tree') nrst_neigh.fit(Input_data) distances, indices = nbrs.kneighbors(Input_data) indices distances nrst_neigh.kneighbors_graph(Input_data).toarray()
監督KNN學習
監督基於鄰域的學習用於以下用途:
- 分類,用於具有離散標籤的資料
- 迴歸,用於具有連續標籤的資料。
最近鄰分類器
我們可以透過以下兩個特徵來理解基於鄰域的分類:
- 它由每個點的最近鄰的簡單多數投票計算得出。
- 它只儲存訓練資料的例項,因此它是一種非泛化學習。
Scikit-learn模組
以下是scikit-learn使用的兩種不同型別的最近鄰分類器:
序號 | 分類器及描述 |
---|---|
1. | KNeighborsClassifier
分類器名稱中的K代表k個最近鄰,其中k是由使用者指定的整數值。因此,顧名思義,此分類器實現基於k個最近鄰的學習。k的值的選擇取決於資料。 |
2. | RadiusNeighborsClassifier
分類器名稱中的Radius代表指定半徑r內的最近鄰,其中r是由使用者指定的浮點值。因此,顧名思義,此分類器實現基於每個訓練點固定半徑r內的鄰居數量的學習。 |
最近鄰迴歸器
它用於資料標籤本質上是連續的情況。分配的資料標籤是根據其最近鄰標籤的平均值計算的。
以下是scikit-learn使用的兩種不同型別的最近鄰迴歸器:
KNeighborsRegressor
迴歸器名稱中的K代表k個最近鄰,其中k是由使用者指定的整數值。因此,顧名思義,此迴歸器實現基於k個最近鄰的學習。k的值的選擇取決於資料。讓我們透過實現示例來更好地理解它。
以下是scikit-learn使用的兩種不同型別的最近鄰迴歸器:
實現示例
在這個示例中,我們將使用scikit-learn KNeighborsRegressor在名為Iris Flower的資料集上實現KNN。
首先,匯入iris資料集,如下所示:
from sklearn.datasets import load_iris iris = load_iris()
現在,我們需要將資料分成訓練資料和測試資料。我們將使用Sklearn train_test_split函式將資料分成70(訓練資料)和20(測試資料)的比例:
X = iris.data[:, :4] y = iris.target from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20)
接下來,我們將使用Sklearn預處理模組進行資料縮放,如下所示:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test)
接下來,從Sklearn匯入KNeighborsRegressor類,並提供鄰居的值,如下所示。
示例
import numpy as np from sklearn.neighbors import KNeighborsRegressor knnr = KNeighborsRegressor(n_neighbors = 8) knnr.fit(X_train, y_train)
輸出
KNeighborsRegressor( algorithm = 'auto', leaf_size = 30, metric = 'minkowski', metric_params = None, n_jobs = None, n_neighbors = 8, p = 2, weights = 'uniform' )
示例
現在,我們可以找到MSE(均方誤差),如下所示:
print ("The MSE is:",format(np.power(y-knnr.predict(X),4).mean()))
輸出
The MSE is: 4.4333349609375
示例
現在,使用它來預測值,如下所示:
X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] from sklearn.neighbors import KNeighborsRegressor knnr = KNeighborsRegressor(n_neighbors = 3) knnr.fit(X, y) print(knnr.predict([[2.5]]))
輸出
[0.66666667]
完整的可執行程式
from sklearn.datasets import load_iris iris = load_iris() X = iris.data[:, :4] y = iris.target from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) import numpy as np from sklearn.neighbors import KNeighborsRegressor knnr = KNeighborsRegressor(n_neighbors=8) knnr.fit(X_train, y_train) print ("The MSE is:",format(np.power(y-knnr.predict(X),4).mean())) X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] from sklearn.neighbors import KNeighborsRegressor knnr = KNeighborsRegressor(n_neighbors=3) knnr.fit(X, y) print(knnr.predict([[2.5]]))
RadiusNeighborsRegressor
迴歸器名稱中的Radius代表指定半徑r內的最近鄰,其中r是由使用者指定的浮點值。因此,顧名思義,此迴歸器實現基於每個訓練點固定半徑r內的鄰居數量的學習。讓我們透過實現示例來更好地理解它:
實現示例
在這個示例中,我們將使用scikit-learn RadiusNeighborsRegressor在名為Iris Flower的資料集上實現KNN:
首先,匯入iris資料集,如下所示:
from sklearn.datasets import load_iris iris = load_iris()
現在,我們需要將資料分成訓練資料和測試資料。我們將使用Sklearn train_test_split函式將資料分成70(訓練資料)和20(測試資料)的比例:
X = iris.data[:, :4] y = iris.target from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20)
接下來,我們將使用Sklearn預處理模組進行資料縮放,如下所示:
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test)
接下來,從Sklearn匯入RadiusneighborsRegressor類,並提供半徑的值,如下所示:
import numpy as np from sklearn.neighbors import RadiusNeighborsRegressor knnr_r = RadiusNeighborsRegressor(radius=1) knnr_r.fit(X_train, y_train)
示例
現在,我們可以找到MSE(均方誤差),如下所示:
print ("The MSE is:",format(np.power(y-knnr_r.predict(X),4).mean()))
輸出
The MSE is: The MSE is: 5.666666666666667
示例
現在,使用它來預測值,如下所示:
X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] from sklearn.neighbors import RadiusNeighborsRegressor knnr_r = RadiusNeighborsRegressor(radius=1) knnr_r.fit(X, y) print(knnr_r.predict([[2.5]]))
輸出
[1.]
完整的可執行程式
from sklearn.datasets import load_iris iris = load_iris() X = iris.data[:, :4] y = iris.target from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20) from sklearn.preprocessing import StandardScaler scaler = StandardScaler() scaler.fit(X_train) X_train = scaler.transform(X_train) X_test = scaler.transform(X_test) import numpy as np from sklearn.neighbors import RadiusNeighborsRegressor knnr_r = RadiusNeighborsRegressor(radius = 1) knnr_r.fit(X_train, y_train) print ("The MSE is:",format(np.power(y-knnr_r.predict(X),4).mean())) X = [[0], [1], [2], [3]] y = [0, 0, 1, 1] from sklearn.neighbors import RadiusNeighborsRegressor knnr_r = RadiusNeighborsRegressor(radius = 1) knnr_r.fit(X, y) print(knnr_r.predict([[2.5]]))