5강 - 정교한 결과 도출을 위한 데이터 전처리 알아보기

2021. 6. 17. 20:23ICT 멘토링/혼자 공부하는 머신러닝+딥러닝

5강 - 정교한 결과 도출을 위한 데이터 전처리 알아보기

학습 로드맵

지난 시간에

나는 누구인가?

도미? 빙어?

넘파이로 데이터 준비

fish_data = np.column_stack((fish_length, fish_weight))

fist_target = np.concatenate((np.ones(35), np.zeros(14))

넘파이를 통해서 간단히 데이터 준비 가능!

넘파이

사이킷런으로 데이터 나누기

데이터 분류 작업은 사이킷런으로!

훈련 세트와 테스트 세트 분류

stratify - 분류 문제에서 타겟값이 골고루 섞이도록 함.

사이킷런

수상한 도미

from sklearn.neighbors import KNeighborsClassifier

kn = KNeighborsClassifier()
kn.fit(train_input, train_target)
kn.score(test_input, test_target)

print(kn.predict([[25, 150]]))

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

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.xlabel('length')
plt.ylabel('weight')
plt.show()

실제론 도미에 가까운데 빙어로 결정된 이유 - 스케일

기준을 맞춰라

y축 스케일, x축 스케일 달라서 생기는 문제

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

 xlim - x축 스케일 지정

스케일 변동 후 x는 영향 미미, y에 따라 결정

스케일 큰 쪽에 따라가게 되어 스케일 맞춰주는 작업이 필요함!

 

표준 점수로 바꾸기

z점수 = (특성 - 평균)/표준편차

mean = np.mean(train_input, axis=0)
std = np.std(train_input, axis=0)

print(mean, std)

train_scaled = (train_input - mean) / std

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

전처리 데이터에서 모델 훈련

kn.fit(train_scaled, train_target)

test_scaled = (test_input - mean) / std
kn.score(test_scaled, test_target)
//1.0
print(kn.predict([new]))
//[1.]
distances, indexes = kn.kneighbors([new])

plt.scatter(train_scaled[:,0], train_scaled[:,1])
plt.scatter(new[0], new[1], marker='^')
plt.scatter(train_scaled[indexes,0], train_scaled[indexes,1], marker='D')
plt.xlabel('length')
plt.ylabel('weight')
plt.show()

전처리 후 그래프

전처리 과정은 꼭 필요!!

 

참고자료

https://www.youtube.com/watch?v=kaCJ-knm8KU&list=PLVsNizTWUw7HpqmdphX9hgyWl15nobgQX&index=5