python 기계 학습 의 KNN 분류 알고리즘

5727 단어 pythonKNN알고리즘
본 고 는 python 기계 학습 의 KNN 분류 알고리즘 을 공유 하여 여러분 께 참고 하 시기 바 랍 니 다.구체 적 인 내용 은 다음 과 같 습 니 다.
1.KNN 분류 알고리즘
KNN 분류 알고리즘(K-Nearest-Neighbors Classification)은 K 근린 알고리즘 이 라 고도 부 르 며 개념 이 매우 간단 하고 분류 효과 가 우수한 분류 알고리즘 이다.
그의 핵심 사상 은 테스트 샘플 이 어떤 유형 에 속 하 는 지 확인 하려 면 모든 훈련 샘플 에서 이 테스트 샘플 과 가장 가 까 운 앞 K 개의 샘플 을 찾 은 다음 에 이 K 개의 샘플 이 대부분 어느 유형 에 속 하 는 지 보면 이 테스트 샘플 도 어느 유형 에 속 하 는 지 를 보 는 것 이다.쉽게 말 하면 가장 비슷 한 K 개의 견본 을 투표 로 결정 하 라 는 것 이다.
여기 서 말 하 는 거 리 는 일반적으로 다 차원 공간의 유럽식 거리 이다.이곳 의 차원 은 특징 차원,즉 견본 에 몇 가지 특징 이 있 으 면 몇 차원 에 속한다.
KNN 설명도 아래 와 같다.(사진 출처:바 이 두 백과)

위의 그림 에서 견본 의 녹색 이 파란색 에 속 하 는 지 빨간색 에 속 하 는 지 확인 해 야 한다.
분명히 K=3 시 에는 1:2 의 투표 결과 로 빨간색 으로 분류 된다.반면 K=5 시 에는 3 대 2 투표 결과 로 파란색 으로 분류 된다.
KNN 알고리즘 은 간단 하고 효과 적 이지 만 최적화 되 지 않 은 폭력 법의 효율 성 은 병목 에 도달 하기 쉽다.예 를 들 어 견본 의 개수 가 N 이 고 특징 차원 이 D 일 때 이 알고리즘 은 시간 복잡 도가 O(DN)로 증가한다.
그래서 보통 KNN 의 실현 은 훈련 데 이 터 를 K-D Tree(K-dimensional tree)로 구축 하 는데 구축 과정 이 빠 르 고 D 차원 오 씨 거 리 를 계산 하지 않 아 도 되 며 검색 속도 가 O(D*log(N)에 달한다.
그러나 D 차원 이 너무 높 으 면 이른바'차원 재난'이 발생 해 결국 폭력 법 과 마찬가지 로 효율 성 이 떨어진다.
따라서 보통 D>20 이후 에는 더 효율 적 인 Ball-tree 를 사용 하 는 것 이 좋 으 며,시간 복잡 도 는 O(D*log(N)이다.
사람들 은 장기 적 인 실천 을 통 해 KNN 알고리즘 이 간단 하지만 대규모 데이터 분 류 를 처리 할 수 있 고 특히 샘플 분류 경계 가 불규칙 한 상황 에 적합 하 다 는 것 을 발견 했다.가장 중요 한 것 은 이 알고리즘 이 많은 고급 기계 학습 알고리즘 의 기초 이다.
물론 KNN 알고리즘 에 도 모든 문제 가 있다.예 를 들 어 훈련 데이터 가 대부분 특정한 유형 에 속 하면 투표 알고리즘 에 큰 문제 가 생 긴 다.이 럴 때 는 모든 유권자 표 의 가중치 설 계 를 고려 해 야 한다.
2.테스트 데이터
테스트 데이터 의 형식 은 여전히 앞에서 사용 한 키 와 체중 데이터 와 일치 합 니 다.그러나 데이터 가 약간 증가 했다.
1.5 40 thin
1.5 50 fat
1.5 60 fat
1.6 40 thin
1.6 50 thin
1.6 60 fat
1.6 70 fat
1.7 50 thin
1.7 60 thin
1.7 70 fat
1.7 80 fat
1.8 60 thin
1.8 70 thin
1.8 80 fat
1.8 90 fat
1.9 80 thin
1.9 90 fat
3.Python 코드
scikit-learn 은 우수한 KNN 알고리즘 을 지원 합 니 다.Python 코드 를 사용 하면 다음 과 같 습 니 다:

# -*- coding: utf-8 -*-
import numpy as np
from sklearn import neighbors
from sklearn.metrics import precision_recall_curve
from sklearn.metrics import classification_report
from sklearn.cross_validation import train_test_split
import matplotlib.pyplot as plt
 
'''      '''
data = []
labels = []
with open("data\\1.txt") as ifile:
 for line in ifile:
  tokens = line.strip().split(' ')
  data.append([float(tk) for tk in tokens[:-1]])
  labels.append(tokens[-1])
x = np.array(data)
labels = np.array(labels)
y = np.zeros(labels.shape)
 
'''      0/1 '''
y[labels=='fat']=1
 
'''             '''
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.2)
 
'''           '''
h = .01
x_min, x_max = x[:, 0].min() - 0.1, x[:, 0].max() + 0.1
y_min, y_max = x[:, 1].min() - 1, x[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
   np.arange(y_min, y_max, h))
 
'''   KNN    '''
clf = neighbors.KNeighborsClassifier(algorithm='kd_tree')
clf.fit(x_train, y_train)
 
'''       '''
answer = clf.predict(x)
print(x)
print(answer)
print(y)
print(np.mean( answer == y))
 
'''       '''
precision, recall, thresholds = precision_recall_curve(y_train, clf.predict(x_train))
answer = clf.predict_proba(x)[:,1]
print(classification_report(y, answer, target_names = ['thin', 'fat']))
 
'''                     '''
answer = clf.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:,1]
z = answer.reshape(xx.shape)
plt.contourf(xx, yy, z, cmap=plt.cm.Paired, alpha=0.8)
 
'''        '''
plt.scatter(x_train[:, 0], x_train[:, 1], c=y_train, cmap=plt.cm.Paired)
plt.xlabel(u'  ')
plt.ylabel(u'  ')
plt.show()
4.결과 분석
그 출력 결 과 는 다음 과 같다.
[ 0.  0.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  1.]
[ 0.  1.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  0.  1.  1.  0.  1.]
정확도=0.94,score=0.94
             precision    recall  f1-score   support
       thin      0.89      1.00      0.94         8
        fat       1.00      0.89      0.94         9
avg / total       0.95      0.94      0.94        17

KNN 분류 기 는 여러 분류 알고리즘 중 가장 간단 한 것 중 하나 로 주의해 야 할 부분 이 많 지 않다.이 몇 가지 설명 할 점 이 있다.
1.KNeighbors Classifier 는 3 가지 알고리즘 을 설정 할 수 있 습 니 다.'brute','kdtree',‘ball_tree'。어떤 것 을 사용 해 야 좋 을 지 모 르 면'auto'를 설정 하여 KNeighbors Classifier 가 스스로 입력 에 따라 결정 하도록 합 니 다.
2.통계 정확도 에 주의 할 때 분류 기의 score 는 R2 가 아 닌 정확 한 비율 을 계산 하 는 것 으로 돌아 갑 니 다.R2 는 일반적으로 회귀 문제 에 적용 된다.
3.본 사례 는 먼저 견본 에서 신장 과 체중 의 최대 최소 치 에 따라 밀집 격자(보폭 h=0.01)를 생 성 한 다음 에 격자 중의 모든 점 을 테스트 견본 으로 삼 아 테스트 한 다음 에 contourf 함 수 를 사용 하여 서로 다른 색 으로 뚱뚱,C 두 가 지 를 표시 했다.
쉽게 볼 수 있 듯 이 본 사례 의 분류 경 계 는 상대 적 으로 복잡 하지만 거리 와 뚜렷 한 규칙 을 가 진 톱니 모양 이다.
이런 경계 선형 함 수 는 처리 하기 어렵다.한편,KNN 알고리즘 은 이러한 경계 문 제 를 처리 하 는 데 타고 난 장점 을 가진다.우 리 는 후속 시리즈 에서 이 데이터 세트 가 정확도=0.94 에 이 르 렀 으 니 매우 우수한 결과 라 고 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.

좋은 웹페이지 즐겨찾기