Scikit Learn-KNN 학습
가장 간단한 기계 학습 알고리즘 중 하나 인 k-NN (k-Nearest Neighbor)은 본질적으로 비모수 적이며 게으른 것입니다. 비모수는 기본 데이터 분포에 대한 가정이 없음을 의미합니다. 즉, 모델 구조가 데이터 세트에서 결정됩니다. 지연 또는 인스턴스 기반 학습은 모델 생성을 위해 학습 데이터 포인트가 필요하지 않으며 전체 학습 데이터가 테스트 단계에서 사용됨을 의미합니다.
k-NN 알고리즘은 다음 두 단계로 구성됩니다.
1 단계
이 단계에서는 훈련 세트의 각 샘플에 대해 k 개의 가장 가까운 이웃을 계산하고 저장합니다.
2 단계
이 단계에서는 레이블이 지정되지 않은 샘플의 경우 데이터 세트에서 k 개의 가장 가까운 이웃을 검색합니다. 그런 다음 이러한 k- 최근 접 이웃 중에서 투표를 통해 클래스를 예측합니다 (과반수 투표가이기는 클래스).
모듈, sklearn.neighbors k- 최근 접 이웃 알고리즘을 구현하고 다음과 같은 기능을 제공합니다. unsupervised 만큼 잘 supervised 이웃 기반 학습 방법.
감독되지 않은 가장 가까운 이웃은 각 샘플에 대한 가장 가까운 이웃을 찾기 위해 다른 알고리즘 (BallTree, KDTree 또는 Brute Force)을 구현합니다. 이 비지도 버전은 기본적으로 위에서 논의한 1 단계에 불과하며 이웃 검색을 필요로하는 많은 알고리즘 (KNN 및 K- 평균이 유명한 알고리즘)의 기초입니다. 간단히 말해서 이웃 검색을 구현하는 비지도 학습자입니다.
반면, 감독 이웃 기반 학습은 회귀뿐만 아니라 분류에도 사용됩니다.
비지도 KNN 학습
논의한 바와 같이 최근 접 이웃 검색을 필요로하는 KNN 및 K-Means와 같은 많은 알고리즘이 있습니다. 이것이 Scikit-learn이 이웃 검색 부분을 자체 "학습자"로 구현하기로 결정한 이유입니다. 이웃 검색을 별도의 학습자로 만드는 이유는 가장 가까운 이웃을 찾기 위해 모든 쌍별 거리를 계산하는 것이 분명히 효율적이지 않기 때문입니다. Sklearn에서 비지도 최근 접 이웃 학습을 구현하는 데 사용하는 모듈을 예제와 함께 살펴 보겠습니다.
Scikit-learn 모듈
sklearn.neighbors.NearestNeighbors감독되지 않은 최근 접 이웃 학습을 구현하는 데 사용되는 모듈입니다. BallTree, KDTree 또는 Brute Force라는 특정 인접 이웃 알고리즘을 사용합니다. 즉,이 세 가지 알고리즘에 대한 균일 한 인터페이스 역할을합니다.
매개 변수
다음 표는에서 사용하는 매개 변수로 구성됩니다. NearestNeighbors 모듈-
Sr. 아니요 | 매개 변수 및 설명 |
---|---|
1 | n_neighbors − int, 선택 사항 얻을 이웃의 수입니다. 기본값은 5입니다. |
2 | radius − 부동, 선택 사항 반환 할 이웃의 거리를 제한합니다. 기본값은 1.0입니다. |
삼 | algorithm − { 'auto', 'ball_tree', 'kd_tree', 'brute'}, 선택 사항 이 매개 변수는 가장 가까운 이웃을 계산하는 데 사용할 알고리즘 (BallTree, KDTree 또는 Brute-force)을 사용합니다. '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 ']. 기본 메트릭은 '민 코스키'입니다. |
6 | P − 정수, 선택 사항 Minkowski 측정 항목의 매개 변수입니다. 기본값은 2이며 Euclidean_distance (l2)를 사용하는 것과 같습니다. |
7 | metric_params − dict, 선택 사항 메트릭 함수에 대한 추가 키워드 인수입니다. 기본값은 없음입니다. |
8 | N_jobs − int 또는 None, 선택 사항 이웃 검색을 위해 실행할 병렬 작업의 수를 재현합니다. 기본값은 없음입니다. |
Implementation Example
아래 예제는 다음을 사용하여 두 데이터 세트 사이의 가장 가까운 이웃을 찾습니다. 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
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]
]
)
위의 출력은 각 점의 가장 가까운 이웃이 점 자체, 즉 0임을 보여줍니다. 쿼리 세트가 훈련 세트와 일치하기 때문입니다.
Example
다음과 같이 희소 그래프를 생성하여 인접 지점 간의 연결을 표시 할 수도 있습니다.
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.]
]
)
우리가 감독되지 않은 사람에게 적합하면 NearestNeighbors 모델의 경우 데이터는 인수에 대해 설정된 값을 기반으로 데이터 구조에 저장됩니다. ‘algorithm’. 그 후이 비지도 학습자의kneighbors 이웃 검색이 필요한 모델에서.
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()
감독 된 KNN 학습
지도 이웃 기반 학습은 다음에 사용됩니다-
- 개별 레이블이있는 데이터에 대한 분류
- 연속 레이블이있는 데이터에 대한 회귀.
최근 접 이웃 분류기
다음 두 가지 특성을 통해 이웃 기반 분류를 이해할 수 있습니다.
- 각 포인트의 가장 가까운 이웃에 대한 단순 다수결로 계산됩니다.
- 그것은 단순히 훈련 데이터의 인스턴스를 저장하기 때문에 비 일반화 학습 유형입니다.
Scikit-learn 모듈
다음은 scikit-learn에서 사용하는 두 가지 유형의 가장 가까운 이웃 분류기입니다.
S. 아니. | 분류기 및 설명 |
---|---|
1. | KNeighborsClassifier 이 분류기 이름의 K는 k 개의 가장 가까운 이웃을 나타냅니다. 여기서 k는 사용자가 지정한 정수 값입니다. 따라서 이름에서 알 수 있듯이이 분류기는 k 개의 최근 접 이웃을 기반으로 학습을 구현합니다. k 값의 선택은 데이터에 따라 다릅니다. |
2. | RadiusNeighborsClassifier 이 분류기 이름의 반경은 지정된 반경 r 내에서 가장 가까운 이웃을 나타냅니다. 여기서 r은 사용자가 지정한 부동 소수점 값입니다. 따라서 이름에서 알 수 있듯이이 분류기는 각 훈련 포인트의 고정 반경 r 내의 이웃 수를 기반으로 학습을 구현합니다. |
최근 접 이웃 회귀 변수
데이터 레이블이 본질적으로 연속적인 경우에 사용됩니다. 할당 된 데이터 레이블은 가장 가까운 이웃 레이블의 평균을 기반으로 계산됩니다.
다음은 scikit-learn에서 사용하는 두 가지 유형의 가장 가까운 이웃 회귀 분석입니다.
KNeighborsRegressor
이 회귀 분석기 이름의 K는 k 개의 가장 가까운 이웃을 나타냅니다. k 이다 integer value사용자가 지정합니다. 따라서 이름에서 알 수 있듯이이 회귀 분석기는 k 개의 최근 접 이웃을 기반으로 학습을 구현합니다. k 값의 선택은 데이터에 따라 다릅니다. 구현 예를 통해 더 자세히 이해합시다.
다음은 scikit-learn에서 사용하는 두 가지 유형의 가장 가까운 이웃 회귀 분석입니다.
구현 예
이 예에서는 scikit-learn을 사용하여 Iris Flower 데이터 세트라는 데이터 세트에 KNN을 구현합니다. KNeighborsRegressor.
먼저 다음과 같이 홍채 데이터 세트를 가져옵니다.
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)
다음으로 KNeighborsRegressor Sklearn에서 클래스를 만들고 다음과 같이 이웃 값을 제공합니다.
예
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
이 회귀 분석기 이름의 반경은 지정된 반경 r 내에서 가장 가까운 이웃을 나타냅니다. 여기서 r은 사용자가 지정한 부동 소수점 값입니다. 따라서 이름에서 알 수 있듯이이 회귀 분석기는 각 훈련 포인트의 고정 반경 r 내에서 이웃 수를 기반으로 학습을 구현합니다. 구현 예가 있으면 도움을 받아 더 많이 이해합시다.
구현 예
이 예에서는 scikit-learn을 사용하여 Iris Flower 데이터 세트라는 데이터 세트에 KNN을 구현합니다. RadiusNeighborsRegressor −
먼저 다음과 같이 홍채 데이터 세트를 가져옵니다.
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)
다음으로 RadiusneighborsRegressor Sklearn에서 클래스를 만들고 다음과 같이 반경 값을 제공하십시오-
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]]))