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 에 이 르 렀 으 니 매우 우수한 결과 라 고 할 수 있다.
이상 이 바로 본 고의 모든 내용 입 니 다.여러분 의 학습 에 도움 이 되 고 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
로마 숫자를 정수로 또는 그 반대로 변환그 중 하나는 로마 숫자를 정수로 변환하는 함수를 만드는 것이었고 두 번째는 그 반대를 수행하는 함수를 만드는 것이었습니다. 문자만 포함합니다'I', 'V', 'X', 'L', 'C', 'D', 'M' ; 문자열이 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.