- K-Nearest Neighbor는 지도 학습 기술을 기반으로 하는 가장 간단한 기계 학습 알고리즘 중 하나입니다.
- K-NN 알고리즘은 새 사례/데이터와 사용 가능한 사례 간의 유사성을 가정하고 새 사례를 사용 가능한 범주와 가장 유사한 범주에 넣습니다.
- K-NN 알고리즘은 사용 가능한 모든 데이터를 저장하고 유사성을 기반으로 새로운 데이터 포인트를 분류합니다. 이는 새로운 데이터가 나타나면 K-NN 알고리즘을 사용하여 쉽게 Well Suite 카테고리로 분류할 수 있음을 의미합니다.
- K-NN 알고리즘은 분류뿐만 아니라 회귀에도 사용할 수 있지만 대부분 분류 문제에 사용됩니다.
- K-NN은 비모수적 알고리즘 이는 기본 데이터에 대해 어떠한 가정도 하지 않음을 의미합니다.
- 그것은 또한 게으른 학습자 알고리즘 훈련 세트에서 즉시 학습하지 않고 데이터 세트를 저장하고 분류 시 데이터 세트에 대한 작업을 수행하기 때문입니다.
- 훈련 단계의 KNN 알고리즘은 데이터 세트를 저장하고 새 데이터를 받으면 해당 데이터를 새 데이터와 매우 유사한 범주로 분류합니다.
K-NN 알고리즘이 필요한 이유는 무엇입니까?
카테고리 A와 카테고리 B라는 두 개의 카테고리가 있고 새로운 데이터 포인트 x1이 있으므로 이 데이터 포인트는 이러한 카테고리 중 어느 카테고리에 속하게 될 것입니다. 이러한 유형의 문제를 해결하려면 K-NN 알고리즘이 필요합니다. K-NN의 도움으로 특정 데이터세트의 카테고리나 클래스를 쉽게 식별할 수 있습니다. 아래 다이어그램을 고려하십시오.
K-NN은 어떻게 작동하나요?
K-NN 작업은 아래 알고리즘을 기반으로 설명할 수 있습니다.
새로운 데이터 포인트가 있고 이를 필수 카테고리에 넣어야 한다고 가정해 보겠습니다. 아래 이미지를 고려하십시오.
내 모니터 화면 크기는 얼마야
- 먼저 이웃 수를 선택하므로 k=5를 선택합니다.
- 다음으로 계산해보겠습니다. 유클리드 거리 데이터 포인트 사이. 유클리드 거리는 우리가 기하학에서 이미 연구한 두 점 사이의 거리입니다. 다음과 같이 계산할 수 있습니다.
- 유클리드 거리를 계산함으로써 우리는 가장 가까운 이웃을 얻었습니다. 즉, 카테고리 A에 3개의 최근접 이웃, 카테고리 B에 2개의 최근접 이웃이 있습니다. 아래 이미지를 살펴보세요.
- 보시다시피 3개의 가장 가까운 이웃은 카테고리 A에 속하므로 이 새로운 데이터 포인트는 카테고리 A에 속해야 합니다.
K-NN 알고리즘에서 K 값을 선택하는 방법은 무엇입니까?
다음은 K-NN 알고리즘에서 K 값을 선택할 때 기억해야 할 몇 가지 사항입니다.
- 'K'에 대한 최상의 값을 결정하는 특별한 방법은 없으므로 그 중에서 가장 좋은 값을 찾기 위해 몇 가지 값을 시도해야 합니다. K의 가장 바람직한 값은 5이다.
- K=1 또는 K=2와 같이 K에 대한 값이 매우 낮으면 노이즈가 발생할 수 있으며 모델에서 이상치 효과가 발생할 수 있습니다.
- K 값이 크면 좋지만 약간의 어려움이 있을 수 있습니다.
KNN 알고리즘의 장점:
- 구현이 간단합니다.
- 시끄러운 훈련 데이터에 강인함
- 훈련 데이터가 클수록 더 효과적일 수 있습니다.
KNN 알고리즘의 단점:
- 항상 복잡할 수 있는 K 값을 결정해야 합니다.
- 모든 훈련 샘플에 대한 데이터 포인트 사이의 거리를 계산하기 때문에 계산 비용이 높습니다.
KNN 알고리즘의 Python 구현
K-NN 알고리즘을 Python으로 구현하기 위해 로지스틱 회귀에서 사용한 것과 동일한 문제와 데이터 세트를 사용합니다. 하지만 여기서는 모델의 성능을 향상하겠습니다. 아래는 문제 설명입니다.
K-NN 알고리즘의 문제: 새로운 SUV 자동차를 제조한 자동차 제조업체가 있습니다. 회사는 해당 SUV 구매에 관심이 있는 사용자에게 광고를 제공하려고 합니다. 따라서 이 문제를 위해 우리는 소셜 네트워크를 통해 여러 사용자의 정보를 포함하는 데이터 세트를 가지고 있습니다. 데이터 세트에는 많은 정보가 포함되어 있지만 예상 급여 그리고 나이 우리는 독립변수와 구매한 변수 종속변수에 대한 것입니다. 다음은 데이터 세트입니다.
K-NN 알고리즘을 구현하는 단계:
- 데이터 전처리 단계
- K-NN 알고리즘을 훈련 세트에 맞추기
- 테스트 결과 예측
- 결과의 정확성 테스트(혼란행렬 생성)
- 테스트 세트 결과 시각화.
데이터 전처리 단계:
데이터 전처리 단계는 로지스틱 회귀와 정확히 동일하게 유지됩니다. 아래는 그에 대한 코드입니다:
# importing libraries import numpy as nm import matplotlib.pyplot as mtp import pandas as pd #importing datasets data_set= pd.read_csv('user_data.csv') #Extracting Independent and dependent Variable x= data_set.iloc[:, [2,3]].values y= data_set.iloc[:, 4].values # Splitting the dataset into training and test set. from sklearn.model_selection import train_test_split x_train, x_test, y_train, y_test= train_test_split(x, y, test_size= 0.25, random_state=0) #feature Scaling from sklearn.preprocessing import StandardScaler st_x= StandardScaler() x_train= st_x.fit_transform(x_train) x_test= st_x.transform(x_test)
위의 코드를 실행하면 데이터세트를 프로그램으로 가져오고 잘 사전 처리됩니다. 기능 확장 후 테스트 데이터 세트는 다음과 같습니다.
위의 출력 이미지에서 데이터가 성공적으로 확장되었음을 확인할 수 있습니다.
이제 K-NN 분류기를 훈련 데이터에 맞추겠습니다. 이를 위해 우리는 KNeighbors분류기 클래스 Sklearn 이웃 도서관. 클래스를 가져온 후 분류기 수업의 대상. 이 클래스의 매개변수는 다음과 같습니다.
#Fitting K-NN classifier to the training set from sklearn.neighbors import KNeighborsClassifier classifier= KNeighborsClassifier(n_neighbors=5, metric='minkowski', p=2 ) classifier.fit(x_train, y_train)
출력: 위의 코드를 실행하면 다음과 같은 출력을 얻을 수 있습니다.
Out[10]: KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski', metric_params=None, n_jobs=None, n_neighbors=5, p=2, weights='uniform')
#Predicting the test set result y_pred= classifier.predict(x_test)
산출:
위 코드의 출력은 다음과 같습니다.
이제 K-NN 모델에 대한 혼동 행렬을 만들어 분류기의 정확성을 확인하겠습니다. 아래는 그에 대한 코드입니다:
#Creating the Confusion matrix from sklearn.metrics import confusion_matrix cm= confusion_matrix(y_test, y_pred)
위 코드에서는 혼란 매트릭스 함수를 가져오고 변수 cm을 사용하여 호출했습니다.
산출: 위의 코드를 실행하면 아래와 같은 행렬이 생성됩니다.
위 이미지에서는 64+29= 93개의 올바른 예측과 3+4= 7개의 잘못된 예측이 있는 반면, 로지스틱 회귀에서는 11개의 잘못된 예측이 있음을 알 수 있습니다. 따라서 K-NN 알고리즘을 사용함으로써 모델의 성능이 향상되었다고 할 수 있다.
이제 K-NN 모델에 대한 훈련 세트 결과를 시각화하겠습니다. 코드는 그래프 이름을 제외하고 로지스틱 회귀 분석에서와 동일하게 유지됩니다. 아래는 그에 대한 코드입니다:
#Visulaizing the trianing set result from matplotlib.colors import ListedColormap x_set, y_set = x_train, y_train x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN Algorithm (Training set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
산출:
xvideoservicethief 우분투 14.04 다운로드
위 코드를 실행하면 아래와 같은 그래프를 얻을 수 있습니다.
출력 그래프는 로지스틱 회귀에서 발생한 그래프와 다릅니다. 아래 사항에서 이해할 수 있습니다.
- 보시다시피 그래프에는 빨간색 점과 녹색 점이 표시됩니다. 녹색 포인트는 구매(1)에 대한 것이고 빨간색 포인트는 구매(0) 변수에 대한 것입니다.
- 그래프는 직선이나 곡선이 아닌 불규칙한 경계를 보여주는데 이는 K-NN 알고리즘, 즉 최근접이웃을 찾는 알고리즘이기 때문입니다.
- 그래프는 SUV를 구매하지 않은 대부분의 사용자가 빨간색 영역에 있고 SUV를 구매한 사용자가 녹색 영역에 있으므로 사용자를 올바른 카테고리로 분류했습니다.
- 그래프는 좋은 결과를 보이고 있지만 여전히 빨간색 영역에 녹색 점이 일부 있고 녹색 영역에 빨간색 점이 있습니다. 하지만 이 모델을 수행하면 과적합 문제가 방지되므로 이는 큰 문제가 아닙니다.
- 따라서 우리 모델은 잘 훈련되었습니다.
모델 훈련이 끝나면 이제 새로운 데이터 세트(즉, 테스트 데이터 세트)를 넣어 결과를 테스트하겠습니다. 코드는 다음과 같은 사소한 변경을 제외하고 동일하게 유지됩니다. x_train 및 y_train 로 대체됩니다 x_test 및 y_test .
아래는 그에 대한 코드입니다:
#Visualizing the test set result from matplotlib.colors import ListedColormap x_set, y_set = x_test, y_test x1, x2 = nm.meshgrid(nm.arange(start = x_set[:, 0].min() - 1, stop = x_set[:, 0].max() + 1, step =0.01), nm.arange(start = x_set[:, 1].min() - 1, stop = x_set[:, 1].max() + 1, step = 0.01)) mtp.contourf(x1, x2, classifier.predict(nm.array([x1.ravel(), x2.ravel()]).T).reshape(x1.shape), alpha = 0.75, cmap = ListedColormap(('red','green' ))) mtp.xlim(x1.min(), x1.max()) mtp.ylim(x2.min(), x2.max()) for i, j in enumerate(nm.unique(y_set)): mtp.scatter(x_set[y_set == j, 0], x_set[y_set == j, 1], c = ListedColormap(('red', 'green'))(i), label = j) mtp.title('K-NN algorithm(Test set)') mtp.xlabel('Age') mtp.ylabel('Estimated Salary') mtp.legend() mtp.show()
산출:
위 그래프는 테스트 데이터 세트의 출력을 보여줍니다. 그래프에서 볼 수 있듯이 대부분의 빨간색 점은 빨간색 영역에 있고 대부분의 녹색 점은 녹색 영역에 있으므로 예측 출력이 매우 좋습니다.
그러나 빨간색 영역에는 녹색 점이 거의 없고 녹색 영역에는 빨간색 점이 몇 개 있습니다. 따라서 이는 혼동 행렬(7 잘못된 출력)에서 관찰한 잘못된 관찰입니다.