본문 바로가기
공부/Deep Learning

혼자 공부하는 머신러닝 + 딥러닝 2장

by 유스베리이 2023. 9. 14.

2-2  데이터 전처리 

 

numpy(넘파이) : 배열 라이브러리

import numpy as np #넘파이 라이브러리 임포트

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

numpy 배열을 출력하면 리스트와 달리 행과 열을 맞추어 출력

- np.ones() / np.zeros() : 각각 원하는 개수의 1,0을 채운 배열을 만들어줌

-np.concatenate() : 첫 번째 차원을 따라 배열을 연결하는 함수

>> 데이터가 클수록 파이썬 리스트는 비효율적이므로 넘파이 배열을 사용하는 게 좋음

 

사이킷런 : 머시러닝 모델을 위한 알고리즘뿐만 아니라 다양한 유틸리티 도구 제공

- train_test_split() : 전달되는 리스트나 배열을 비율에 맞게 훈련세트와 테스트 세트로 나눔

from sklearn.model_selection import train_test_split

  * random_state 변수 : 자체적으로 랜덤시드를 지정할 수 있는 매개변수

 

사이킷런으로 훈련 세트 / 테스트 세트 나누기

train_input, test_ input, test_target = train_test_split(fish_data, fish_target, random_state = 42)

*shape : 넘파이 배열의 속성으로 입력 데이터의 크기를 출력

print(train_input.shape, test_input.shape)
>> (36,2) (13,2) # 2차원 배열
print(train_target.shape,test_target.shape)
>> (36,) (13,) #1차원 배열
print(test_target)
>> [ 1. 0. 0. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1.]

13개 테스트 중에 10개가 1(도미), 3개가 0(빙어)  --> 비율이 3.3:1 ( 샘플링 편향 )

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

train_input, test_input, train_target, test_target
= train_test_split(fish_data, fish_target, stratify = fish_target, random_state = 42)
print(test_target)
>> [0. 0. 1. 0. 1. 0. 1. 1. 1. 1. 1. 1. 1.]

13개 테스트 중에 9개가 1(도미), 4개가 0(빙어) --> 비율이 2.25:1 (데이터 준비 완료)

 

k-최근접 이웃 훈련

k-최근접 이웃은 주변의 샘플 중 다수인 클래스를 예측으로 사용

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

KNeighborsClassifier 클래스의 n_neighbors의 default값은 5

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()

새로운 샘플은 marker = '^' 로 지정하여 삼각형으로 나타냄

이 샘플은 빙어 데이터로 예측함

-> 5개의 이웃으로 판단하기 때문

 

x축의 범위가 좁고 y축은 범위가넓어서 y축으로 조금만 멀어져도 거리가 매우 큰 값으로 계산됨. 

-> x, y 축 범위를 동일하게 바꿔야 함

 

*xlim() : x축 범위 지정 ylim() : y축 범위 지정

 

plt.scatter(train_input[:,0],train_input[:,1]
plt.scatter(25,150,marker ='^')
plt,scatter(train_input,0],train_input[indexs,1],marker='D')
plt.xlim((0,1000))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

생선의 길이 (x축)은 가장 가까운 이웃을 찾는데 크게 영향 X, 생선의 무게(y축)만 고려 대상

                                                >> 두 특성의 스케일 scale 이 다름<<

 

데이터 전처리(data preprocessing)

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

 

표준 점수: 각 특성값이 0에서 표준편차의 몇 배만큼 떨어져 있는지를 나타내는 가장 많이 사용하는 전처리방법

mean = np.mean(train_input, axis=0) # 평균을 계산
std = np.std(train_input,axis=0) # 표준편차를 계산
*axis=0 은 행을 따라 각 열의 통계 값을 계산
*axis=1 은 열을 따라 각 행의 통계 값을 계산
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()

가장 가까운 샘플들은 모두 도미

print(kn.predict([new])
>> [1. ]

<정리>

대부분의 머신러닝 알고리즘은 특성의 스케일이 다르면 잘 작동하지 않음. 

표준점수(전처리 방법) 변환을 통해 문제점 해결

데이터 전처리를 할 때 주의할 점은 훈련세트를 변환한 방식 그래도 테스트 세트를 변환해야함.