-
KNN 간단 예제_2NAN/머신 러닝 2021. 7. 11. 18:10728x90
올바른 훈련 데이터 사용법
# 데이터 준비 fish_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, 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] fish_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, 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]
# 리스트 내포 훈련 데이터 2차원 배열로 만들기 # 정답 데이터 준비 fish_data = [[l,w] for l,w in zip(fish_length, fish_weight)] fish_target = [1] * 35 + [0] * 14
# 지도 학습을 위해 KNeighborsClassifier 로드 from sklearn.neighbors import KNeighborsClassifier kn = KNeighborsClassifier() # 올바른 결괏값을 위해 훈련,테스트 데이터/정답 나누기 train_input = fish_data[:35] train_target = fish_target[:35] test_input = fish_data[35:] test_target = fish_target[35:] # 훈련 후 결과 도출 kn = kn.fit(train_input, train_target) kn.score(test_input, test_target) 0.0
올바른 결괏값을 도출하기 위해 전과는 다르게 전체 데이터를 훈련, 테스트 데이터로 나누었고,
fit( )과, score( )를 통해 훈련 데이터를 잘 다루었다고 생각했지만
결괏값은 0.0으로 우리가 원했던 값 1과는 상반된 답을 얻었다. 이는 데이터를 훈련 데이터와 테스트 데이터로 나눈 다는
좋은 생각만으로 그쳤을 뿐 전체 데이터를 섞어주지 않았기 때문에 발생한 현상이다.
이런 문제를 쉽게 해결하기 위해 사용하는 게 바로 numpy 라이브러리이고 이를 통해 2차원 배열도 손쉽게 만들 수 있다.
# numpy 로드 import numpy as np # 기존 데이터 nparray로 변환 input_arr = np.array(fish_data) target_arr = np.array(fish_target) print(input_arr) [[ 25.4 242. ] [ 26.3 290. ] [ 26.5 340. ] [ 29. 363. ] [ 29. 430. ] [ 29.7 450. ] [ 29.7 500. ] [ 30. 390. ] [ 30. 450. ] [ 30.7 500. ] [ 31. 475. ] [ 31. 500. ] [ 31.5 500. ] [ 32. 340. ] [ 32. 600. ] [ 32. 600. ] .............. .............. ..............
전체 데이터를 섞을때 주의해야 할 점으로 input_arr과 target_arr이 섞일 때 그 값이 함께 이동하여 섞여야 한다는 점이다.
이런 문제를 쉽게 해결하기 위해 인덱스를 섞어서 분류하는 방법이다.
# 항상 같은 랜덤값을 받기위해 np.random.seed(42)지정 np.random.seed(42) # 0부터 48까지 총 49개의 index 생성 index = np.arange(49) # 임의로 섞기 np.random.shuffle(index) print(index) [13 45 47 44 17 27 26 25 31 19 12 4 34 8 3 6 40 41 46 15 9 16 24 33 30 0 43 32 5 29 11 36 1 21 2 37 35 23 39 10 22 18 48 20 7 42 14 28 38] # 인덱스 번호로 하나 이상의 데이터를 불러 올 수 있다. print(input_arr[[1,3]]) [[ 26.3 290. ] [ 29. 363. ]] # 훈련 데이터 나누기 (배열 슬라이싱) train_input = input_arr[index[:35]] # 정답 데이터 나누기 (배열 슬라이싱) train_target = target_arr[index[:35]] print(input_arr[13], train_input[0]) [ 32. 340.] [ 32. 340.] # 테스트 데이터 나누기 (배열 슬라이싱) test_input = input_arr[index[35:]] # 테스트 정답 데이터 나누기 (배열 슬라이싱) test_target = target_arr[index[35:]]
# 시각화 import matplotlib.pyplot as plt # x 축(전체 행, 특정 열(길이)), y축(전체 행,특정 열(무게)) plt.scatter(train_input[:,0], train_input[:,1]) plt.scatter(test_input[:,0], test_input[:,1]) plt.xlabel('length') plt.ylabel('weight') plt.show()
데이터가 잘 섞인걸 확인 할 수 있다. # 최종. 훈련 데이터 훈련하기 kn = kn.fit(train_input, train_target) # 테스트 데이터로 결과 확인 kn.score(test_input,test_target) 1.0 # 재확인 # predict == 새로운 데이터 예측 np.array이는 리스트로 감쌀 필요 없다. kn.predict(test_input) array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0]) # 정확하게 일치 test_target array([0, 0, 1, 0, 1, 1, 1, 0, 1, 1, 0, 1, 1, 0])
'NAN > 머신 러닝' 카테고리의 다른 글
K-최근접 이웃 회귀 예제 (0) 2021.07.13 KNN 간단 예제_3 (0) 2021.07.13 KNN 간단 예제_1 (0) 2021.07.09 K 평균(K Means) 실습 (0) 2021.07.08 데이터 실습 (0) 2021.07.08