기존에 for문을 돌면서 zip함수로 처리한 데이터들을 fish_data에 받아서 만들었었는데, 이를 간단히 구현해보자면
np.column_stack(([1,2,3], [4,5,6]))
"""
array([[1, 4],
[2, 5],
[3, 6]])
"""
fish_data = np.column_stack((fish_length, fish_weight))
print(fish_data)
fish_target = np.concatenate((np.ones(35), np.zeros(14)))
print(fish_target)
from sklearn.model_selection import train_test_split
fish_data와 fish_target 2개의 배열을 전달했으므로
총 4개의 train 및 test 배열로 바뀌어 출력된다.
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 매개변수에 타깃 데이터를 전달하면 클래스 비율에 맞게 데이터를 나눈다.
K- nearest Neighbor classifier
# K-NN training
from sklearn.neighbors import KNeighborsClassifier
kn = KNeighborsClassifier()
# Train the model using the fit() method with the training set
# Evaluate using the score() method with the test set
kn.fit(train_input, train_target)
kn.score(test_input, test_target)
# score() method는 0에서 1 사이의 값을 반환합니다.
# 1은 모든 데이터를 정확히 맞혔다는 것을 나타냅니다. 예를 들어 0.5라면 절반만 맞혔다는 의미입니다.
predict함수를 이용해 테스트 세트의 예측 결과과 실제 타깃을 확인
0이면 빙어, 1이면 도미라고 가정한다.
distances, indexes = kn.kneighbors([[25, 150]])
kneighbors함수로 해당 샘플에서 가장 가까운 이웃을 찾아서 반환해준다.
distance를 출력하면
[[ 92.00086956 130.48375378 130.73859415 138.32150953 138.39320793]]
(25, 150)과 가까운 이웃들 간의 거리가 나타난다.
x와 y의 좌표축 범위가 달라 (스케일이 다르다고 표현) 다르게 범위를 지정하기 위해 xlim()함수를 사용하였다.
plt.scatter(train_input[:,0], train_input[:,1])
plt.scatter(25, 150, marker='^')
plt.scatter(train_input[indexes,0], train_input[indexes,1], marker='D')
plt.xlim((0, 1000))
plt.xlabel('length')
plt.ylabel('weight')
plt.show()
Data preprocessing
특성값을 일정한 기준으로 맞춰주어 샘플 간의 거리가 결괏값에 영향을 받지 않도록 한다.
표준점수(Standard score)로 이를 구현하는데,
mean = np.mean(train_input, axis = 0)
std = np.std(train_input, axis = 0)
train_scaled = (train_input - mean) / std
이렇게 구한 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')
plt.ylabel('weight')
plt.show()
Real Value로 표현되던 그래프가 -1.5 ~ 1.5 범위로 수정되었다.
이제 빙어가 아닌 도미로 정상적으로 예측되는 것을 볼 수 있다.
이렇게 스케일에 민감하지 않게 안정적인 예측이 가능한 모델을 만들어보았다.
'Major Study > Artificial Intelligence Application' 카테고리의 다른 글
Numpy 기초) Numpy 사용하기 & Data Split (0) | 2022.04.18 |
---|---|
최적화 기법(Optimization) Linear/SVM/SoftMax Classifier (0) | 2022.04.16 |
Python 기본 문법 정리 (0) | 2022.04.15 |
선형 회귀(Linear Regression)의 개념과 Prediction (0) | 2022.04.03 |
Supervised Learning(지도 학습)의 개념 (0) | 2022.04.03 |