Scikit Learn - KNN Learning

k-NN (k-Nearest Neighbor), một trong những thuật toán học máy đơn giản nhất, có bản chất là phi tham số và lười biếng. Phi tham số có nghĩa là không có giả định cho phân phối dữ liệu cơ bản tức là cấu trúc mô hình được xác định từ tập dữ liệu. Học tập dựa trên phiên bản hoặc lười biếng có nghĩa là với mục đích tạo mô hình, nó không yêu cầu bất kỳ điểm dữ liệu đào tạo nào và toàn bộ dữ liệu đào tạo được sử dụng trong giai đoạn thử nghiệm.

Thuật toán k-NN bao gồm hai bước sau:

Bước 1

Trong bước này, nó tính toán và lưu trữ k lân cận gần nhất cho mỗi mẫu trong tập huấn luyện.

Bước 2

Trong bước này, đối với một mẫu không được gắn nhãn, nó lấy k lân cận gần nhất từ ​​tập dữ liệu. Sau đó trong số k-láng giềng gần nhất này, nó dự đoán lớp thông qua bỏ phiếu (lớp có đa số phiếu sẽ thắng).

Mô-đun, sklearn.neighbors triển khai thuật toán k-láng giềng gần nhất, cung cấp chức năng cho unsupervised cũng như supervised phương pháp học tập dựa trên hàng xóm.

Các hàng xóm gần nhất không được giám sát thực hiện các thuật toán khác nhau (BallTree, KDTree hoặc Brute Force) để tìm (các) hàng xóm gần nhất cho mỗi mẫu. Phiên bản không được giám sát này về cơ bản chỉ là bước 1, đã được thảo luận ở trên và là nền tảng của nhiều thuật toán (KNN và K-có nghĩa là thuật toán nổi tiếng) yêu cầu tìm kiếm hàng xóm. Nói một cách đơn giản, đó là người học Không được giám sát để thực hiện các tìm kiếm hàng xóm.

Mặt khác, học tập dựa trên hàng xóm có giám sát được sử dụng để phân loại cũng như hồi quy.

Học KNN không được giám sát

Như đã thảo luận, tồn tại nhiều thuật toán như KNN và K-Means yêu cầu tìm kiếm hàng xóm gần nhất. Đó là lý do tại sao Scikit-learning quyết định triển khai phần tìm kiếm hàng xóm với tư cách là “người học” của riêng mình. Lý do đằng sau việc thực hiện tìm kiếm hàng xóm như một người học riêng biệt là việc tính toán tất cả khoảng cách theo cặp để tìm người hàng xóm gần nhất rõ ràng là không hiệu quả lắm. Chúng ta hãy xem mô-đun được Sklearn sử dụng để triển khai học tập hàng xóm gần nhất không được giám sát cùng với ví dụ.

Mô-đun Scikit-learning

sklearn.neighbors.NearestNeighborslà mô-đun được sử dụng để triển khai học tập hàng xóm gần nhất không được giám sát. Nó sử dụng các thuật toán hàng xóm gần nhất cụ thể có tên BallTree, KDTree hoặc Brute Force. Nói cách khác, nó hoạt động như một giao diện thống nhất cho ba thuật toán này.

Thông số

Bảng theo dõi bao gồm các thông số được sử dụng bởi NearestNeighbors mô-đun -

Sr.No Mô tả về Thông Số
1

n_neighbors - int, tùy chọn

Số lượng hàng xóm để có được. Giá trị mặc định là 5.

2

radius - phao, tùy chọn

Nó giới hạn khoảng cách trở lại của những người hàng xóm. Giá trị mặc định là 1,0.

3

algorithm - {'auto', 'ball_tree', 'kd_tree', 'brute'}, tùy chọn

Tham số này sẽ sử dụng thuật toán (BallTree, KDTree hoặc Brute-force) mà bạn muốn sử dụng để tính toán các nước láng giềng gần nhất. Nếu bạn cung cấp 'tự động', nó sẽ cố gắng quyết định thuật toán thích hợp nhất dựa trên các giá trị được truyền cho phương thức phù hợp.

4

leaf_size - int, tùy chọn

Nó có thể ảnh hưởng đến tốc độ xây dựng & truy vấn cũng như bộ nhớ cần thiết để lưu trữ cây. Nó được chuyển cho BallTree hoặc KDTree. Mặc dù giá trị tối ưu phụ thuộc vào bản chất của vấn đề, giá trị mặc định của nó là 30.

5

metric - chuỗi hoặc có thể gọi

Nó là số liệu được sử dụng để tính toán khoảng cách giữa các điểm. Chúng ta có thể chuyển nó dưới dạng một chuỗi hoặc hàm có thể gọi. Trong trường hợp hàm có thể gọi, số liệu được gọi trên mỗi cặp hàng và giá trị kết quả được ghi lại. Nó kém hiệu quả hơn so với việc chuyển tên chỉ số dưới dạng một chuỗi.

Chúng tôi có thể chọn từ số liệu từ scikit-learning hoặc scipy.spatial.distance. các giá trị hợp lệ như sau:

Scikit-learning - ['cosine', 'manhattan', 'Euclidean', 'l1', 'l2', 'cityblock']

Scipy.spatial.distance -

['braycurtis', 'canberra', 'chebyshev', 'dice', 'hamming', 'jaccard', 'tương quan', 'kulsinski', 'mahalanobis', 'minkowski', 'rogerstanimoto', 'russellrao', ' sokalmicheme ',' sokals Below ',' seuclidean ',' sqeuclidean ',' yule '].

Số liệu mặc định là 'Minkowski'.

6

P - số nguyên, tùy chọn

Đây là tham số cho chỉ số Minkowski. Giá trị mặc định là 2 tương đương với việc sử dụng Euclidean_distance (l2).

7

metric_params - dict, tùy chọn

Đây là đối số từ khóa bổ sung cho hàm số liệu. Giá trị mặc định là không có.

số 8

N_jobs - int hoặc None, tùy chọn

Nó cài đặt lại số lượng các công việc song song để chạy tìm kiếm hàng xóm. Giá trị mặc định là không có.

Implementation Example

Ví dụ dưới đây sẽ tìm các láng giềng gần nhất giữa hai tập dữ liệu bằng cách sử dụng sklearn.neighbors.NearestNeighbors mô-đun.

Đầu tiên, chúng ta cần nhập mô-đun và các gói cần thiết -

from sklearn.neighbors import NearestNeighbors
import numpy as np

Bây giờ, sau khi nhập các gói, hãy xác định các tập dữ liệu ở giữa chúng ta muốn tìm các hàng xóm gần nhất -

Input_data = np.array([[-1, 1], [-2, 2], [-3, 3], [1, 2], [2, 3], [3, 4],[4, 5]])

Tiếp theo, áp dụng thuật toán học tập không giám sát, như sau:

nrst_neigh = NearestNeighbors(n_neighbors = 3, algorithm = 'ball_tree')

Tiếp theo, lắp mô hình với tập dữ liệu đầu vào.

nrst_neigh.fit(Input_data)

Bây giờ, hãy tìm K-láng giềng của tập dữ liệu. Nó sẽ trả về các chỉ số và khoảng cách của các điểm lân cận của mỗi điểm.

distances, indices = nbrs.kneighbors(Input_data)
indices

Output

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

Output

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]
   ]
)

Kết quả trên cho thấy rằng láng giềng gần nhất của mỗi điểm là chính điểm đó, tức là ở điểm không. Đó là vì tập truy vấn khớp với tập huấn luyện.

Example

Chúng tôi cũng có thể hiển thị kết nối giữa các điểm lân cận bằng cách tạo ra một biểu đồ thưa thớt như sau:

nrst_neigh.kneighbors_graph(Input_data).toarray()

Output

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.]
   ]
)

Một khi chúng tôi phù hợp với không giám sát NearestNeighbors mô hình, dữ liệu sẽ được lưu trữ trong cấu trúc dữ liệu dựa trên giá trị được đặt cho đối số ‘algorithm’. Sau đó, chúng tôi có thể sử dụng người học không giám sát nàykneighbors trong một mô hình yêu cầu tìm kiếm hàng xóm.

Complete working/executable program

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()

Học tập KNN có giám sát

Việc học tập dựa trên những người hàng xóm có giám sát được sử dụng để làm theo:

  • Phân loại, đối với dữ liệu có nhãn rời rạc
  • Hồi quy, cho dữ liệu có nhãn liên tục.

Bộ phân loại hàng xóm gần nhất

Chúng ta có thể hiểu phân loại dựa trên Láng giềng với sự trợ giúp của hai đặc điểm sau:

  • Nó được tính toán từ đa số phiếu đơn giản của những người hàng xóm gần nhất của mỗi điểm.
  • Nó chỉ đơn giản là lưu trữ các phiên bản của dữ liệu đào tạo, đó là lý do tại sao nó là một kiểu học không khái quát hóa.

Mô-đun Scikit-learning

Tiếp theo là hai loại phân loại láng giềng gần nhất khác nhau được sử dụng bởi scikit-learning -

Không. Bộ phân loại & Mô tả
1. KNeighborsClassifier

K trong tên của bộ phân loại này đại diện cho k lân cận gần nhất, trong đó k là một giá trị nguyên do người dùng chỉ định. Do đó, như tên cho thấy, bộ phân loại này thực hiện học tập dựa trên k láng giềng gần nhất. Sự lựa chọn giá trị của k phụ thuộc vào dữ liệu.

2. RadiusNeighborsClassifier

Bán kính trong tên của bộ phân loại này đại diện cho các láng giềng gần nhất trong bán kính r được chỉ định, trong đó r là giá trị dấu phẩy động do người dùng chỉ định. Do đó, như tên cho thấy, bộ phân loại này thực hiện học tập dựa trên số lượng hàng xóm trong bán kính r cố định của mỗi điểm đào tạo.

Nhà điều chỉnh hàng xóm gần nhất

Nó được sử dụng trong các trường hợp nhãn dữ liệu có bản chất liên tục. Các nhãn dữ liệu được gán được tính toán dựa trên giá trị trung bình của các nhãn của các vùng lân cận gần nhất của nó.

Tiếp theo là hai loại hồi quy lân cận gần nhất khác nhau được sử dụng bởi scikit-learning -

KNeighborsRegressor

K trong tên của hồi quy này đại diện cho k lân cận gần nhất, trong đó k là một integer valuedo người dùng chỉ định. Do đó, như tên cho thấy, bộ hồi quy này thực hiện học tập dựa trên k lân cận gần nhất. Sự lựa chọn giá trị của k phụ thuộc vào dữ liệu. Hãy hiểu nó nhiều hơn với sự trợ giúp của một ví dụ triển khai.

Tiếp theo là hai loại hồi quy lân cận gần nhất khác nhau được sử dụng bởi scikit-learning -

Ví dụ triển khai

Trong ví dụ này, chúng tôi sẽ triển khai KNN trên tập dữ liệu có tên là tập dữ liệu Iris Flower bằng cách sử dụng scikit-learning KNeighborsRegressor.

Đầu tiên, nhập tập dữ liệu mống mắt như sau:

from sklearn.datasets import load_iris
iris = load_iris()

Bây giờ, chúng ta cần chia dữ liệu thành dữ liệu đào tạo và thử nghiệm. Chúng tôi sẽ sử dụng Sklearntrain_test_split chức năng chia dữ liệu thành tỷ lệ 70 (dữ liệu đào tạo) và 20 (dữ liệu thử nghiệm) -

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)

Tiếp theo, chúng ta sẽ thực hiện chia tỷ lệ dữ liệu với sự trợ giúp của mô-đun tiền xử lý Sklearn như sau:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Tiếp theo, nhập KNeighborsRegressor lớp từ Sklearn và cung cấp giá trị của hàng xóm như sau.

Thí dụ

import numpy as np
from sklearn.neighbors import KNeighborsRegressor
knnr = KNeighborsRegressor(n_neighbors = 8)
knnr.fit(X_train, y_train)

Đầu ra

KNeighborsRegressor(
   algorithm = 'auto', leaf_size = 30, metric = 'minkowski',
   metric_params = None, n_jobs = None, n_neighbors = 8, p = 2,
   weights = 'uniform'
)

Thí dụ

Bây giờ, chúng ta có thể tìm thấy MSE (Mean Squared Error) như sau:

print ("The MSE is:",format(np.power(y-knnr.predict(X),4).mean()))

Đầu ra

The MSE is: 4.4333349609375

Thí dụ

Bây giờ, sử dụng nó để dự đoán giá trị như sau:

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]]))

Đầu ra

[0.66666667]

Hoàn thành chương trình làm việc / thực thi

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

Bán kính trong tên của bộ hồi quy này đại diện cho các lân cận gần nhất trong bán kính r được chỉ định, trong đó r là giá trị dấu phẩy động do người dùng chỉ định. Do đó, như tên cho thấy, bộ hồi quy này thực hiện việc học tập dựa trên số lân cận trong bán kính r cố định của mỗi điểm đào tạo. Hãy hiểu nó nhiều hơn với sự trợ giúp nếu một ví dụ triển khai -

Ví dụ triển khai

Trong ví dụ này, chúng tôi sẽ triển khai KNN trên tập dữ liệu có tên là tập dữ liệu Iris Flower bằng cách sử dụng scikit-learning RadiusNeighborsRegressor -

Đầu tiên, nhập tập dữ liệu mống mắt như sau:

from sklearn.datasets import load_iris
iris = load_iris()

Bây giờ, chúng ta cần chia dữ liệu thành dữ liệu đào tạo và thử nghiệm. Chúng tôi sẽ sử dụng hàm Sklearn train_test_split để chia dữ liệu thành tỷ lệ 70 (dữ liệu đào tạo) và 20 (dữ liệu thử nghiệm) -

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)

Tiếp theo, chúng ta sẽ thực hiện chia tỷ lệ dữ liệu với sự trợ giúp của mô-đun tiền xử lý Sklearn như sau:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
scaler.fit(X_train)
X_train = scaler.transform(X_train)
X_test = scaler.transform(X_test)

Tiếp theo, nhập RadiusneighborsRegressor từ Sklearn và cung cấp giá trị của bán kính như sau:

import numpy as np
from sklearn.neighbors import RadiusNeighborsRegressor
knnr_r = RadiusNeighborsRegressor(radius=1)
knnr_r.fit(X_train, y_train)

Thí dụ

Bây giờ, chúng ta có thể tìm thấy MSE (Mean Squared Error) như sau:

print ("The MSE is:",format(np.power(y-knnr_r.predict(X),4).mean()))

Đầu ra

The MSE is: The MSE is: 5.666666666666667

Thí dụ

Bây giờ, sử dụng nó để dự đoán giá trị như sau:

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]]))

Đầu ra

[1.]

Hoàn thành chương trình làm việc / thực thi

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]]))