본문 바로가기

인공지능(AI) 공부/혼자 공부하는 머신러닝+딥러닝

[혼공머신] 02-2. 데이터 전처리

도미 데이터 15개, 빙어 데이터 14개를 준비하고 도미와 빙어 데이터를 하나의 데이터로 합친다.

넘파이의 column_stack 함수는 전달받은 리스트를 일렬로 세운 다음 차례대로 나란히 연결하는 함수이다. 예를 들어 np.coloum_stack(([1,2,3], [4,5,6]))이라면 결과는 [[1,4], [2,5], [3,6]]이다.

넘파이의 column_stack 함수를 사용하여 생선 데이터 리스트를 일렬로 세운 다음 차례대로 나란히 연결하여 생선의 길이 데이터와 생선의 무게 데이터를 나란히 붙인다.

넘파이의 ones 함수와 zeros 함수는 각각 원하는 개수의 1과 0을 채운 배열을 만들어주는 함수이다. 넘파이의 concatenate 함수는 배열 2개를 나란히 합치는 함수이다. 넘파이의 ones 함수로 도미 15개, zeros 함수로 빙어 14개의 배열을 만든 다음 concatenate 함수를 사용해 두 배열을 합쳐준다.

 

 

사이킷런의 train_test_split 함수는 전달되는 리스트나 배열을 비율에 맞게 훈련 세트와 테스트 세트로 나누어준다. 데이터를 나누기 전 데이터를 무작위로 섞어주기 위해 random_state 매개변수를 사용해준다. fish_data와 fish_target 즉 2개의 배열을 전달했으므로 2개씩 나뉘어 총 4개의 배열이 반환된다.

 

 

KNeighborsClassifier 클래스를 이용하여 모델 객체 kn를 생성한다. 훈련 세트로 모델을 학습시키고 정확도를 확인해보면 1.0 즉 정확도가 100%가 나온다는 것을 알 수 있다.

 

 

잘 훈련시킨 모델에 25cm 150kg 도미를 넣어보면 결과는 0 즉 해당 생선을 빙어라고 예측한다는 것을 알 수 있다. 뭔가 잘 못 되었다는 것을 감지할 수 있다.

 

 

무엇이 잘못되었는지 알아보기 위해 산점도를 그린다.

K-최근접 이웃 알고리즘은 주변의 샘플 중에서 다수인 클래스를 예측으로 사용한다. 그러므로 25cm 250kg 도미의 주변 샘플을 확인해보면 된다. KNeighborsClassifier 클래스는 주어진 샘플에서 가장 가까운 이웃을 찾아 주는 kneighbors 함수를 제공한다. 이 함수는 이웃까지의 거리와 이웃 샘플의 인덱스를 반환한다. kneighbors 함수를 사용하여 25cm 250kg 도미에 가까운 이웃 5개의 거리와 인덱스를 선언한다. 그런 다음 산점도를 그려보면 도미 1개, 빙어 4개가 가까운 샘플이라고 한다.

이러한 문제는 x축의 범위는 좁고 y축의 범위는 넓어서 일어난다. y축으로 조금만 멀어져도 거리가 아주 큰 값으로 계산되기 때문에 오른쪽 위의 도미 샘플이 이웃으로 선택되지 못하기 때문이다.

 

 

x축과 y축의 범위를 맞춰주기 위해 xlim 함수를 사용하여 x축의 범위를 0~500으로 지정한다. 그런 다음 산점도를 그리면 그래프가 거의 일직선을 나타낸다. 이런 경우 x축은 가장 가까운 이웃을 찾는 데 크게 영향을 못 미친다. 오로지 y축만 고려 대상이 된다.

이러한 문제가 생기는 이유는 두 특성의 스케일이 다르기 때문이다. 즉 두 특성(길이와 무게)의 값이 놓인 범위가 매우 다르기 떄문이다. 예를 들어 방의 넓이를 재는데 세로는 cm로 가로는 inch로 재는 경우인 셈이다. 샘플 간의 거리에 영향을 많이 받으므로 해당 알고리즘을 제대로 사용하려면 특성값을 일정한 기준으로 맞춰줘야 한다. 이러한 작업을 데이터 전처리라고 부른다. 데이터 전처리할 때 주의할 점은 훈련 세트를 변환한 방식 그대로 테스트 세트를 변환해야 한다는 것이다.

 

 

가장 많이 쓰이는 전처리 방법 중 하나는 표준점수이다. 넘파이의 mean 함수는 평균을 계산하고, std 함수는 표준편차를 계산한다.

 

 

입력 데이터를 평균으로 빼고 표준편차로 나누는 작업을 수행한다. 그런 다음 산점도를 그리면 오른쪽 맨 꼭대기에 25cm 150kg 도미만 덩그러니 떨어져 있다는 것을 알 수 있다. 이는 훈련 세트만 평균으로 빼고 표준편차로 나누는 작업을 해주었기 떄문이다. 테스트 세트 또한 mean, std 함수를 이용해서 변환해야 한다.

 

 

테스트 세트 또한 데이터 전처리 과정을 적용해준 다음 산점도를 그린다. 앞서 표준편차로 변환하기 전의 산점도와 거의 동일하지만 x축과 y축의 범위가 -1.5~1.5 사이로 바뀌었다. 이는 데이터의 두 특성이 비슷한 범위를 차지하고 있다는 것을 의미한다.

 

 

모델 객체 kn을 훈련 데이터로 훈련시키고 정확도를 보면 1.0 즉 정확도가 100%인 것을 알 수 있다.

 

 

해당 모델로 25cm 150kg 도미를 예측해보면 1 즉 도미로 정확하게 예측한다는 것을 알 수 있다.

 

 

25cm 150kg 도미와 가까운 샘플을 알아보기 위한 산점도를 그리면 도미 4개, 빙어 1개가 가까운 샘플인 것을 알 수 있다. 결과적으로 특성값의 스케일에 민감하지 않고 안정적인 예측을 할 수 있는 모델을 생성하였다.