이전시간(https://wondangcom.tistory.com/2357)에 최근접 이웃 알고리즘을 실습을 해 보았습니다.
그런데 다음의 데이터를 예측을 해 보면 어떤 결과를 나타낼까요?
길이 25, 무게 150 그램을 판단 해 보면 도미라고 나와야 할 것 같은데 빙어라고 나오는 것을 확인 할 수 있네요.
그래프를 그려 보면 다음의 위치에 있습니다.
왜 이런 결과가 생겼을까요?
이것은 단위가 틀린 것이 문제가 됩니다. 무게를 살펴 보면 도미의 가장 가벼운 무게는 242부터 시작하고 빙어의 무게는 19.9 까지의 무게 인것을 알 수 있습니다.
이때 무게의 거리로 다섯개를 찾아 보면 도미 한마리와 빙어 4마리가 선택 됩니다.
따라서 이러한 단위가 틀린 데이터를 같은 기준으로 맞추어야 합니다.
1. 기준을 맞춰라
산점도를 보는 기준을 길이를 1000 까지로 맞춰서 살펴 보면 산점도는 위와 같은 모양이 됩니다.
이렇게 두 특성의 값이 놓인 범위가 매우 다르기 때문에 생기는 문제인데 이러한 것을 두 특성의 스케일(scale)가 다르다고 합니다.
이러한 데이터의 특성값을 일정한 기준으로 맞추어 주어야 하는데 이런 작업을 데이터 전처리(data preprocessing) 이라고 합니다.
가장 널리 사용되는 전처리 방법 중 하나는 표준점수(standard score) 입니다.
표준점수로 계산하는 방법은 다음과 같습니다.
mean = np.mean(train_input,axis=0) #평균
std = np.std(train_input,axis=0) #표준편차
train_scaled = (train_input - mean)/std
각각의 입력데이터에서 평균을 뺀 값을 표준편차로 나누어 주면 됩니다.
여기서 axis=0 의 의미는 각각의 특성별로 계산을 한다는 의미입니다.
이렇게 전처리 한 데이터를 이용하여 모델을 훈련해 봅시다.
2. 전처리 데이터로 모델 훈련하기
앞에서 만든 train_scaled의 산점도를 그려 보면 다음과 같습니다.
new =([25,150]-mean)/std # 확인 하고 싶은 데이터도 표준 점수로 만들어 주어야 한다.
plt.scatter(train_scaled[:,0],train_scaled[:,1])
plt.scatter(new[0],new[1],marker='^')
plt.xlabel('length') #x축 라벨
plt.ylabel('weight') #y축 라벨
plt.show() # 산점도 확인
이 데이터로 다시 훈련을 해 봅니다.
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
kn.fit(train_scaled,train_target) #fish_data 로 최근접 이웃 훈련
다시 수상한 도미를 훈련 모델에 넣어서 결과를 확인해 봅니다.
네~ 정상적으로 출력이 되는 것을 확인 할 수 있네요~
이 처럼 단위가 틀려지거나 할 때는 반드시 전처리 해서 일정한 기준으로 맞추어 주는 전처리 과정이 꼭 필요합니다.
참고]
혼자 공부하는 머신러닝
'강의자료 > 머신러닝' 카테고리의 다른 글
[캐글(Kaggle) 따라하기]06-2.랜덤 포레스트(RandomForest) (12) | 2022.12.29 |
---|---|
[캐글(Kaggle) 따라하기]06-1.의사결정 트리 (6) | 2022.12.21 |
[캐글(Kaggle) 따라하기]05-2.KNN(K-최근접 이웃) 알고리즘2 - 실습하기 (7) | 2022.12.09 |
[캐글(Kaggle) 따라하기]05-1.KNN(K-최근접 이웃) 알고리즘1- 데이터 준비 (9) | 2022.11.22 |
[캐글(Kaggle) 따라하기]04. 타이타닉 문제 해결하기 (7) | 2022.11.15 |