Loading...

Python/머신러닝 / / 2022. 5. 14. 16:47

머신러닝 4강. 데이터 전처리

반응형

K-최근접 이웃 알고리즘으로 훈련한 데이터에

이상한 점이 발견되었다.

 

분명 테스트 세트의 도미와 빙어를 모두 올바르게 분류했는데

이 모델에 길이 25cm, 무게 150g 데이터를 넣고 결과를 확인해봤더니

당연히 도미(1)로 예측할 줄 알았으나 빙어(0)로 예측했다.

 

대체 근처에 있는 이웃이 뭐길래 빙어로 예측했는지

그래프로 확인해보자.

 

import matplotlib.pyplot as plt

plt.scatter(train_input[:, 0], train_input[:, 1]) #  모든 행의 length, wieght
plt.scatter(test_input[:, 0], test_input[:, 1]) #  모든 행의 length, wieght
plt.scatter([25], [150], marker="^") # 세모
plt.show();

 

눈으로 보기에는 도미인 이웃과 가까워 보이는데

머신러닝은 빙어로 예측했다.

 

그래프를 보면 직관적으로 도미와 가깝게 보이는데?

 

 

근처 이웃들과의 실제 거리를 구해보자.

수상한 도미 근처의 가장 가까운 이웃을 찾아주는 메서드가 kneighbors( )이다.

distances, indexes = kn.kneighbors([[25, 150]])

print(distances)
print(train_input[indexes])

 

가까운 이웃중 4개의 데이터가 빙어인 것 같다.

그렇기 때문에 머신러닝이 빙어라고 예측한 것이다.

 

x축의 범위가 좁고, y축의 범위가 넓기 때문에

우리 눈에는 도미 데이터와 가깝게 보인것이다.

 

이를 눈으로 명확히 확인하기 위해

x축의 범위를 y축과 동일하게 0~1000으로 맞추어 확인해보자.

 

import matplotlib.pyplot as plt

plt.scatter(train_input[:, 0], train_input[:, 1])
plt.scatter(test_input[:, 0], test_input[:, 1])
plt.scatter([25], [150], marker="^")
plt.xlim(0, 1000) # 세로 limit와 비율을 맞춰주는것
plt.show();

 

그래프가 거의 일직선으로 나타난다.

이런 데이터라면 생선의 길이(x축)는 가까운 이웃을 찾는데 크게 영향을 미치지 못한다.

 

두 특성의 값이 놓인 범위가 매우 다르기 때문인데

이를 두 특성의 스케일이 다르다고 말한다.

 

데이터를 표현하는 기준이 다르면 알고리즘이 올바르게 예측할 수 없다.

특성값을 일정한 기준으로 맞춰 주어야 한다.

 

이 작업을 데이터 전처리라고 한다.

 


 

표준점수를 이용하여 전처리를 해줄 것이다.

이를 통해 실제 특성값의 크기와 상관없이 동일한 조건으로 비교할 수 있다.

 

# print(train_input) # 세로축을 기준으로 평균을 구해야함

# 방향을 지정해줘서 알아서 평균 구해주게 하자 axis = 0(행 가로), 1(열 세로)
mean = np.mean(train_input, axis=0) # length, weight끼리 평균
std = np.std(train_input, axis=0) # 표준변차 구하는 메서드(분산 생략 가능)

# 훈련 테이터 표준 편차
train_scaled = (train_input - mean) / std


mean2 = np.mean(test_input, axis=0)
std2 = np.std(test_input, axis=0)

# 테스트 데이터 표준 편차
test_scaled = (test_input - mean2) / std2

 

마찬가지로 예측값도 스케일링하여 그래프를 확인해보자.

 

# 예측값 스케일링
new = ([25, 150] - mean) / std

plt.scatter(train_scaled[:, 0], train_scaled[:, 1])
plt.scatter(test_scaled[:, 0], test_scaled[:, 1])
plt.scatter(new[0], new[1], marker="^")
plt.show();

 

표준점수를 사용하면 상대적으로 비교가 가능하다.

 

length와 weight의 스케일이 달랐기 때문에

각각의 표준점수를 구해 상대적으로 비교할 수 있다.

 

# 스케일링 된 값으로 다시 학습시키기
kn.fit(train_scaled, train_target)
# 결과
print(kn.score(test_scaled, test_target))
# 예측
print(kn.predict([new]))

 

 

 

 

 

 

[출처]

 

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

 

머신러닝+딥러닝 » 혼자 공부하는 책

혼자 공부하는 머신러닝 딥러닝, 무료 동영상 강의, 머신러닝+딥러닝 용어집을 다운로드 하세요. 포기하지 마세요! 독학으로 충분히 하실 수 있습니다. ‘때론 혼자, 때론 같이’ 하며 힘이 되겠

hongong.hanbit.co.kr

 

 

 

반응형