반응형

# 머신러닝 알고리즘

 1. 지도학습

  - 훈련 데이터 : {

          데이터 : 입력,

          정답 : 타깃

     }

 2. 비지도학습

  - (추후에 나옴)

 

훈련시킬때 데이터를 입력해서 맞추는 것은 답을 알려주고 문제를 맞추는 것과 같은 개념!

따라서 훈련시킬 데이터(훈련 세트)와 평가에 사용할 데이터(테스트 세트)를 구분하는 것이 바람직!

 

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]

fish_data = [[l, w] for l, w in zip(fish_length, fish_weight)]
fish_target = [1]*35 + [0]*14

# 도미 35마리와 빙어 14마리로 전체 49개의 샘플이 있고, 길이와 무게 2개의 특성을 갖는다.
# 도미인 처음 35개 데이터를 훈련세트로, 나머지 14개(빙어)를 테스트 세트로 이용해보도록 하자

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()

# 슬라이싱 [0:35] -> 인덱스 0부터 35 전까지(35는 미포함) 데이터를 리턴
# 시작 인덱스가 0인 경우 생략 가능 [:35]
# 마찬가지로 뒤가 마지막 인덱스인 경우 생략 가능 [35:]

train_input = fish_data[:35] # 1~35 데이터 인덱스로는 0~34
train_target = fish_target[:35]

test_input = fish_data[35:] # 36~49 데이터 인덱스로는 35~48
test_target = fish_target[35:]

kn = kn.fit(train_input, train_target)
kn.score(test_input, test_target)

# 결과인 정확도가 0.0이 나온다....
# 너무 당연하다 도미 데이터만 훈련시켰기때문에 빙어데이터와 구분할 수 있는 방법이 학습되지 않았기 때문이다.

# 넘파이를 배울 타이밍 - 파이썬의 대표적인 배열 라이브러리
import numpy as np

input_arr = np.array(fish_data)
target_arr = np.array(fish_target)

print(input_arr)

print(input_arr.shape) #(샘플수, 특성 수) 출력

# index를 랜덤하게 돌려 편향성이 없으면서도 도미와 빙어가 골고루 들어갈 수 있도록 test set를 분리한다.
np.random.seed(42)
index = np.arange(49)
np.random.shuffle(index)

train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]

test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]

# 산점도를 그려 골고루 분리가 되었는지 확인해 본다.
import matplotlib.pyplot as plt
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! 어디한번 테스트 세트를 돌려보자!


print('test_input')
print(kn.predict(test_input))

print('test data')
print(test_target)

위 소스에 대한 실행결과는 아래와 같음

[[  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. ]
 [  33.   700. ]
 [  33.   700. ]
 [  33.5  610. ]
 [  33.5  650. ]
 [  34.   575. ]
 [  34.   685. ]
 [  34.5  620. ]
 [  35.   680. ]
 [  35.   700. ]
 [  35.   725. ]
 [  35.   720. ]
 [  36.   714. ]
 [  36.   850. ]
 [  37.  1000. ]
 [  38.5  920. ]
 [  38.5  955. ]
 [  39.5  925. ]
 [  41.   975. ]
 [  41.   950. ]
 [   9.8    6.7]
 [  10.5    7.5]
 [  10.6    7. ]
 [  11.     9.7]
 [  11.2    9.8]
 [  11.3    8.7]
 [  11.8   10. ]
 [  11.8    9.9]
 [  12.     9.8]
 [  12.2   12.2]
 [  12.4   13.4]
 [  13.    12.2]
 [  14.3   19.7]
 [  15.    19.9]]
(49, 2)
test_input
[0 0 1 0 1 1 1 0 1 1 0 1 1 0]
test data
[0 0 1 0 1 1 1 0 1 1 0 1 1 0]
반응형

+ Recent posts