NAN/머신 러닝
KNN 간단 예제_1
onddd
2021. 7. 9. 18:15
728x90
# 데이터 시각 화를 위해 matplotlib 로드
import matplotlib.pyplot as plt
# 데이터 준비
bream_length = [25.4, 26.3, 26.5, 29.0, 29.0, 29.7, 29.7, 30.0, 30.0, 30.7, 31.0, 31.0,
31.5, 32.0, 32.0, 32.0, 33.0, 33.0, 33.5, 33.5, 34.0, 34.0, 34.5, 35.0,
35.0, 35.0, 35.0, 36.0, 36.0, 37.0, 38.5, 38.5, 39.5, 41.0, 41.0]
bream_weight = [242.0, 290.0, 340.0, 363.0, 430.0, 450.0, 500.0, 390.0, 450.0, 500.0, 475.0, 500.0,
500.0, 340.0, 600.0, 600.0, 700.0, 700.0, 610.0, 650.0, 575.0, 685.0, 620.0, 680.0,
700.0, 725.0, 720.0, 714.0, 850.0, 1000.0, 920.0, 955.0, 925.0, 975.0, 950.0]
# 시각화 할 데이터 선별
plt.scatter(bream_length, bream_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
# 비교 데이터 선별
smelt_length = [9.8, 10.5, 10.6, 11.0, 11.2, 11.3, 11.8, 11.8, 12.0, 12.2, 12.4, 13.0, 14.3, 15.0]
smelt_weight = [6.7, 7.5, 7.0, 9.7, 9.8, 8.7, 10.0, 9.9, 9.8, 12.2, 13.4, 12.2, 19.7, 19.9]
# 기존 데이터와 비교를 위해 시각화 반복
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
# 데이터 타입 구분을 위해 더하기
lenght = bream_length + smelt_length
weight = bream_weight + smelt_weight
# 사이킷런 패키지를 사용하기 위해선 데이터가 2차원 리스트여야한다.
# 합친 데이터를 2차원 리스트로 만들기위해 zip()함수와 리스트 내포를 사용
# 반복문을 통해 각각의 2차원 리스트로 넣어 줄 수 있다.
fish_data = [[l,w] for l,w in zip(lenght, weight)]
print(fish_data)
# 이를 출력하면 각 데이터 l,w가 하나의 원소로 구성된 리스트가 생성된다.
[[25.4, 242.0], [26.3, 290.0], [26.5, 340.0], [29.0, 363.0], [29.0, 430.0], [29.7, 450.0], [29.7, 500.0], [30.0, 390.0], [30.0, 450.0], [30.7, 500.0], [31.0, 475.0], [31.0, 500.0], [31.5, 500.0], [32.0, 340.0], [32.0, 600.0], [32.0, 600.0], [33.0, 700.0], [33.0, 700.0], [33.5, 610.0], [33.5, 650.0], [34.0, 575.0],
[34.0, 685.0], [34.5, 620.0], [35.0, 680.0], [35.0, 700.0], . . . .
# 정답 데이터 준비
fish_target = [1] * 35 + [0] * 14
print(fish_target)
[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
# 데이터 적용을 위해 사이킷런 로드
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
# fit()는 사이킷런으로 데이터를 훈련시키는 함수
kn.fit(fish_data,fish_target)
# score()는 훈련된 데이터 값을 실제로 출력하는 함수
# 0 - 1 사이의 값을 반환 1에 가까울수록 정확도가 높다.
kn.score(fish_data, fish_target)
1.0
# predict( )메서드는 새로운 데이터의 정답을 예측해준다.
# 새로운 데이터 역시 2차원 배열 규칙을 지켜준다.
kn.predict([[30,600]])
array([1])
=====================참고 ======================
# 이 과정을 통해 참고 데이터 수를 조절 할 수 있다.
kn49 = KNeighborsClassifier(n_neighbors=49) # 기본 값은 5
kn49.fit(fish_data, fish_target)
kn49.score(fish_data, fish_target)
# 정확도
0.7142857142857143
# 기존 데이터를 통해 두 데이터를 구분 할 수 있었고
# 새로운 데이터를 추가해 해당 데이터가 어디에 속하는지 알 수 있었다.
# 시각화
plt.scatter(bream_length, bream_weight)
plt.scatter(smelt_length, smelt_weight)
plt.scatter(30, 600, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
결과적으로 데이터와 샘플이 잘 나눠진걸로 보이지만, 사실 이렇게 모든 데이터를 훈련 데이터로 사용하여
훈련된 데이터로 결과값을 확인하는건 좋은 분석 방법이 아니다.
그 이유로 시험지의 답을 외우고 답을 적는것과 시험 범위를 공부하고 답을 적는 차이라고 생각하면 되는데
올바른 훈련법과 데이터의 활용법은 다음 포스트에서 확인하자.