SERi
2-1. 데이터 전처리 본문
'혼자 공부하는 머신러닝+딥러닝'의 유투브 강의 및 도서를 통해 공부한 내용입니다.
📌 np.column_stack()
- 전달받은 리스트를 일렬(열)로 세운 다음 차례대로 나란히 연결
📌 np.concatenate()
- 전달받은 리스트를 1차원으로 배열을 연결

📌 np.zero()
- 원하는 개수만큼 배열을 0으로 채움
📌 np.ones()
- 원하는 개수만큼 배열을 1로 채움
📌 train_test_split()
- 전달되는 리스트나 배열을 비율에 맞게 훈련 세트와 테스트 세트로 나눔
- from sklearn.model_selection import train_test_split
- stratify 매개변수 : target로 지정해주면 target의 class비율을 유지한채 데이터셋을 split
📌 KNeighborsClassifier.kneighbors()
- 이웃까지의 거리와 이웃 샘플의 인덱스를 반환
📌 xlim()
- matplotlib 에서 X축 범위 지정 가능
📌 ylim()
- matplotlib 에서 y축 범위 지정 가능
📌 표준점수
- 가장 널리 사용하는 전처리 방법 중 하나
- 각 특성값이 평균에서 표준편차의 몇 배만큼 떨어져 있는지를 나타냄
- 평균을 빼고 표준편차로 나누어줌
📌 np.mean()
- 평균값
📌 np.std()
- 표준편차
📌 axis = 0
- 배열의 열을 선택
📌 axis = 1
- 배열의 행을 선택
📌 브로드캐스팅
- 일정 조건을 부합하는 다른 형태의 배열끼리 연산을 수행하는 것을 의미
📝
대부분의 머신러닝 알고리즘은 특성의 스케일이 다르면 잘 작동하지 않는다. 그래서 이 강의에서는 특성을 표준점수로 변환 하였다.
- 특성의 스케일을 조정하는 방법으로 표준점수가 가장 널리 사용하는 방법
⛔ 데이터 전처리할때 주의할 점 ⛔
훈련 세트를 변환한 방식 그대로 테스트 세트를 변환해야 함
데이터 전처리¶
넘파이로 데이터 준비하기¶
import numpy as np
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_length, fish_weight 를 하나의 데이터셋으로 변환
fish_data = np.column_stack((fish_length, fish_weight))
# fish_data 데이터 확인
fish_data[:5]
array([[ 25.4, 242. ],
[ 26.3, 290. ],
[ 26.5, 340. ],
[ 29. , 363. ],
[ 29. , 430. ]])
# 배열에 1로 5개 채우기
print(np.ones(5))
# 배열에 0으로 5개 채우기
print(np.zeros(5))
[1. 1. 1. 1. 1.] [0. 0. 0. 0. 0.]
# target 데이터 생성
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
# fish_target 데이터 확인
fish_target
array([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.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(
fish_data, fish_target, random_state=42)
train_input.shape, test_input.shape, train_target.shape, test_target.shape
((36, 2), (13, 2), (36,), (13,))
test_target
array([1., 0., 0., 0., 1., 1., 1., 1., 1., 1., 1., 1., 1.])
# 샘플링 편향방지를 위해 'stratify' 매개변수 사용
train_input, test_input, train_target, test_target = train_test_split(
fish_data, fish_target, stratify=fish_target, random_state=42)
test_target
array([0., 0., 1., 0., 1., 0., 1., 1., 1., 1., 1., 1., 1.])
수상한 도미 한마리¶
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
1.0
kn.predict([[25, 150]])
array([0.])
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()
# 샘플의 가장 가까운값 5개를 반환
distances, indexes = kn.kneighbors([[25, 150]])
distances, indexes
(array([[ 92.00086956, 130.48375378, 130.73859415, 138.32150953,
138.39320793]]),
array([[21, 33, 19, 30, 1]], dtype=int64))
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()
print(f'train data에서 거리 확인 : \n {train_input[indexes]}')
print(f'target data에서 거리 확인 : \n {train_target[indexes]}')
train data에서 거리 확인 : [[[ 25.4 242. ] [ 15. 19.9] [ 14.3 19.7] [ 13. 12.2] [ 12.2 12.2]]] target data에서 거리 확인 : [[1. 0. 0. 0. 0.]]
# 샘플과 이웃샘플까지의 거리
distances
array([[ 92.00086956, 130.48375378, 130.73859415, 138.32150953,
138.39320793]])
기준을 맞춰라¶
# x축의 범위를 1000으로 y축의 범위와 같게 맞춰줌
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()
# 훈련데이터의 평균값과 표준편차값 구하기
mean = np.mean(train_input, axis=0)
std = np.std(train_input, axis=0)
print(mean, std)
[ 27.29722222 454.09722222] [ 9.98244253 323.29893931]
# train데이터를 표준점수로 전처리
train_scaled = (train_input - mean) / std
전처리 데이터로 모델 훈련하기¶
plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(25, 150, marker='^')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
# 샘플도 train데이터와 같은값으로 전처리
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()
kn.fit(train_scaled, train_target)
KNeighborsClassifier()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
KNeighborsClassifier()
# test 데이터도 train데이터와 같은값으로 전처리
test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)
1.0
kn.predict([new])
array([1.])
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()
샘플의 근접한 값이 도미인것을 확인가능
'온라인강의 > 혼자공부하는 머신러닝+딥러닝' 카테고리의 다른 글
| 훈련세트와 테스트세트 (0) | 2022.11.30 |
|---|