알파카징징이 알파카징징이 코딩하는 알파카

혼공머_2_2 데이터 전처리

» writing

혼자공부하는머신러닝+딥러닝 수업을 참고하여 작성하였습니다

2_2_데이터 전처리

정의


데이터 전처리

1. 넘파이로 데이터 준비

fish_length = [23,34,23,11,22,33,42,12, 11,12,9,13,14,15]
fish_weight = [242,323,222,333,245,266,234,254, 6,5,7,9,4,6]

import numpy as np
fish_data = np.column_stack((fish_length, fish_weight))

# array([[ 23, 242],
#        [ 34, 323],
#        [ 23, 222],
#        [ 11, 333],
#        [ 22, 245],
#        [ 33, 266],
#        [ 42, 234],
#        [ 12, 254],
#        [ 11,   6],
#        [ 12,   5],
#        [  9,   7],
#        [ 13,   9],
#        [ 14,   4],
#        [ 15,   6]])

fish_target = np.concatenate((np.ones(8), np.zeros(6)))

fish_target

# array([1., 1., 1., 1., 1., 1., 1., 1., 0., 0., 0., 0., 0., 0.])

column_stack() : 전달받은 리스트로 일렬로 세운 다음 차례대로 나란히 연결

np.concatenate() : 첫 번째 차원을 따라 배열을 연결

np.ones() : 원하는 개수의 1을 채운 배열 만들기

np.zeros() : 원하는 개수의 0을 채운 배열 만들기

2. 사이킷런으로 훈련세트, 테스트세트 나누기

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)

stratify : 타깃 데이터를 전달하면 클래스 비율에 맞게 데이터 나눔

3. 수상한 도미 한 마리 (k - 최근접 이웃으로 훈련)

from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# 1.0
kn.predict([[25,100]])
distance, indexes = kn.kneighbors([[25,100]])

import matplotlib.pyplot as plt

plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 100, marker = '^')
plt.scatter(train_input[indexes, 0], train_input[indexes, 1], marker = 'D')

plt.xlabel('length')
plt.ylabel('weight')
plt.show()

KNeighborsClassifier 클래스는 주어진 샘플에서 가장 가까운 이웃을 찾아주는 kneighbors() 메서드 제공

삼각형 샘플에 가장 가까운 5개의 샘플이 초록 다이아몬드로 표시(아래)

수상한 도미 한마리

4. 데이터 전처리

알고리즘은 샘플 간의 거리에 영향을 많이 받기에, 특성값을 일정한 기준으로 맞춰야 한다

1) 표준 점수 (z 점수)

: 각 특정값이 0에서 표준편차의 몇 배만큼 떨어져 있는지 나타냄

- 분산 : 데이터에서 평균을 뺀 값을 모두 제곱한 다음 평균을 내어 구함

표준편차 : 분산의 제곱근으로 데이터가 분산된 정도, 각 데이터가 원점에서 몇 표준편차만큼 떨어져 있는지를 나타냄

mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis = 0)
# 특성마다 값의 스케일이 다르므로 평균과 표준편차는 각 특성별로 계산 (행을 따라 각 열의 통계값 계산)

print(mean, std)
# [ 21.3 164.4] [ 11.05486318 133.58532854]

train_scaled = (train_input -mean)/std
# array([[-0.93171664, -1.18575896],
#        [-0.93171664,  1.26211465],
#        [ 1.14881567,  1.18725613],
#        [-0.84125872, -1.19324481],
#        [ 0.15377847,  0.43118508],
#        [ 0.15377847,  0.58090212],
#        [-0.56988494, -1.18575896],
#        [-1.11263249, -1.17827311],
#        [ 1.05835774,  0.76056256],
#        [ 1.87247908,  0.5210153 ]])

브로드캐스팅(broadcasting : 넘파일 배열 사이에서 모든 행에 적용)

5. 전처리 데이터로 모델 훈련

new = ([25,100] - 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()

전처리 모델

전처리 모델(위)

test_scaled = (test_input - mean) / std

kn.score(test_scaled, test_target)
kn.predict([new])

스케일 한 도미예측

스케일 한 도미예측(위)