- 전체 데이터 -> 각 객체는 sample
In [9]:
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
- 훈련 셋 / 테스트 셋으로 나누어 학습
- 샘플링 편향
In [10]:
from sklearn.neighbors import KNeighborsClassifier
k_neighbors = KNeighborsClassifier()
train_input = fish_data[:35]
train_target = fish_target[:35]
test_input = fish_data[35:]
test_target = fish_target[35:]
k_neighbors.fit(train_input, train_target)
k_neighbors.score(test_input, test_target)
Out[10]:
0.0
넘파이를 이용해 랜덤하게 훈련 셋/테스트 셋 만들기
In [11]:
import numpy as np
input_arr = np.array(fish_data)
target_arr = np.array(fish_target)
print(input_arr)
print(input_arr.shape) # return (행, 열)
# step 1. index array 랜덤하게 섞기
np.random.seed(42) # 실행마다 동일한 결과
index = np.arange(49) # 일정한 간격(default=1)의 정수/실수 배열 생성
np.random.shuffle(index)
print(index)
# step 2. array를 이용하여 동시에 여러 값을 선택하는 array indexing으로 train set 선택
train_input = input_arr[index[:35]]
train_target = target_arr[index[:35]]
test_input = input_arr[index[35:]]
test_target = target_arr[index[35:]]
# step 3. 훈련 셋/테스트셋 시각화
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()
[[ 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)
[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]
- 다시 학습시키기
- cf) numpy 모델의 입출력은 모두 numpy 배열이다
In [12]:
k_neighbors.fit(train_input, train_target)
accuracy = k_neighbors.score(test_input, test_target)
print(accuracy)
print(k_neighbors.predict(test_input))
print(test_target)
1.0
[0 0 1 0 1 1 1 0 1 1 0 1 1 0]
[0 0 1 0 1 1 1 0 1 1 0 1 1 0]
2-2. 데이터 전처리¶
- 데이터 전처리
- 표준 점수
- 브로드캐스팅
- 데이터 준비하기 (with Numpy)
In [16]:
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]
import numpy as np
np.column_stack(([1, 2, 3], [4, 5, 6])) # column을 기준으로 쌓음 -> [1, 4], [2, 5], [3, 6]
fish_data = np.column_stack((fish_length, fish_weight)) # input
print(fish_data[:5])
fish_target = np.concatenate((np.ones(35), np.zeros(14))) # target
print(fish_target)
[[ 25.4 242. ]
[ 26.3 290. ]
[ 26.5 340. ]
[ 29. 363. ]
[ 29. 430. ]]
[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.]
- 사이킷런으로 훈련 셋과 테스트 셋 나누기 (척도가 다른 경우)
In [18]:
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(fish_data, fish_target, stratify=fish_target, random_state=42) # 알아서 나눠줌
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
print(kn.predict([[25, 150]])) # 도미 데이터이지만 빙어라 판단
import matplotlib.pyplot as plt
plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(25, 150, marker="^") # 모양 지정
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
# -> 샘플이 시각화하면 1에 가깝지만, weight가 더 크게 작용하여 0으로 판단함
[0.]
- 샘플과 가장 가까운 5개의 이웃 찾기
In [20]:
distances, indexes = kn.kneighbors([[25, 150]])
plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(25, 150, marker="^")
plt.scatter(train_input[indexes, 0], train_input[indexes, 1], marker="D")
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
# 가까운 이웃으로 0 4개, 1 1개가 선정됨
print(train_input[indexes])
print(train_target[indexes])
print(distances) # -> y축 weight가 과평가됨
[[[ 25.4 242. ]
[ 15. 19.9]
[ 14.3 19.7]
[ 13. 12.2]
[ 12.2 12.2]]]
[[1. 0. 0. 0. 0.]]
[[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]
- feature의 scale 맞추기
In [21]:
# y축과 x축 스케일 동일하게 시각화하면?
plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(25, 150, marker="^")
plt.scatter(train_input[indexes, 0], train_input[indexes, 1], marker="D")
plt.xlim((0, 1000))
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
- 표준점수(Z점수)를 이용한 데이터 전처리
- Z점수 = (데이터-평균)/표준편차
- 브로드캐스팅 : 행마다 계산해주는 것
In [24]:
# z점수 계산하기
mean = np.mean(train_input, axis=0)
std = np.std(train_input, axis=0) # 행을 기준으로(axis=0) 계산
print(mean, std)
train_scaled = (train_input - mean) / std
# 변환된 데이터 시각화하기
new = ([25, 150] - mean) / std
plt.scatter(train_scaled[:, 0], train_scaled[:, 1])
plt.scatter(new[0], new[1], marker="^")
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
[ 27.29722222 454.09722222] [ 9.98244253 323.29893931]
- 다시 학습시키기
In [25]:
# 학습시키기
kn.fit(train_scaled, train_target)
test_scaled = (test_input - mean) / std
print(kn.score(test_scaled, test_target))
print(kn.predict([new]))
# 변환 후 K 이웃 시각화하기
distances, indexes = kn.kneighbors([new])
plt.scatter(train_scaled[:, 0], train_scaled[:, 1])
plt.scatter(new[0], new[1], marker="^")
plt.scatter(train_scaled[indexes, 0], train_scaled[indexes, 1], marker="D")
plt.xlabel("length")
plt.ylabel("weight")
plt.show()
1.0
[1.]
In [ ]:
'Data Science > AI' 카테고리의 다른 글
인공지능 #4 | 로지스틱 회귀, 시그모이드 함수, 확률적 경사 하강법 Stochastic Gradient Descent (0) | 2023.03.06 |
---|---|
인공지능 #3 | K-nearest neighbor 알고리즘, 선형 회귀, 릿지 회귀, 라쏘 회귀 (0) | 2023.03.06 |
인공지능 #1 | 인공지능과 머신러닝, 딥러닝 (0) | 2023.03.06 |
[에러 해결] jupyter-nbconvert not found 해결하기 (0) | 2023.03.06 |
tweepy (0) | 2021.09.29 |