코딩헤딩

[ML(머신러닝)] 머신러닝 기초 3-2 <정규화> 본문

카테고리 없음

[ML(머신러닝)] 머신러닝 기초 3-2 <정규화>

멈머이 2023. 12. 22. 22:12
728x90

https://coding-heading.tistory.com/84

 

[ML(머신러닝)] 머신러닝 기초 3-2 <훈련 및 테스트 분류(train_test_split)>

https://coding-heading.tistory.com/83 [ML(머신러닝)] 머신러닝 기초 3-1 - 정의된 변수 이름은 없음 - 훈련데이터 : 훈련(fit)에 사용되는 데이터 : (훈련 독립변수) train_input, train-x, X_train : (훈련 종속변수) tra

coding-heading.tistory.com

위 글과 이어집니다.


<현재까지 수행 순서>

 1. 데이터 수집
 2. 독립변수 2차원과 종속변수 1차원 데이터로 취합
 3. 훈련, 검증, 테스트 데이터로 섞으면서 분리 -----------3번 후 정규화 진----------
 4. 훈련, 검증, 테스트 데이터 중에 독립변수에 대해서만 정규화 전처리 수행
 ------------------▲ 데이터 전처리---------------------
 ------------------▼ 항상 동일---------------------
 5. 훈련모델 생성
 6. 모델 훈련 시키기
 7. 훈련 및 검증 정확도 확인
 8. 하이퍼파라미터 튜닝
 9. 예측


앞 글에서  가장 가까운 이웃 5개를 보여주는 산점도의 각 축의 스케일이 다르기 때문에

이 문제를 해결하기 위해서는 정규화 작업이 필요했다.


* 정규화 -> 표준점수화 하기
 - 표준점수 = (각 데이터 - 데이터 전체 평균) / 데이터 전체 표준편차
 - 표준점수 : 각 데이터가 원점(0)에서 표준편차만큼 얼마나 떨어져 있는지를 나타내는 값

 

* 데이터 전체 평균 구하기 / 데이터 전체 표준편차 구하기

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

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

결과 

mean : array([ 27.02352941, 445.60294118])

    std : array([ 10.0816099 , 319.21122132])

 

* 정규화(표준점수) 처리하기

train_scaled = (train_input - mean) /std
train_scaled

* 이웃을 포함하여 산정도 그리기

plt.scatter(train_scaled[:,0], train_scaled[:,1], c="red", label="bream")
plt.scatter(new[0], new[1], marker="^", c="green", label="pred")
plt.scatter(train_scaled[indexes, 0], train_scaled[indexes, 1], c="blue", label="nei")
plt.xlabel("lenght")
plt.ylabel("weight")
plt.legend()
plt.show()

* 모델 생성하기 / 모델 훈련하기

kn = KNeighborsClassifier()

kn.fit(train_scaled, train_target)

* 훈련 데이터 검증하기

train_score = kn.score(train_scaled, train_target)
train_score

* 테스트 데이터로 검증하기

test_scaled = (test_input - mean) / std
test_score = kn.score(test_scaled, test_target)
test_score

결과 : 1.0

 - 검증 또는 테스트 데이터를 스케일링 정규화 처리 
 - 이떄는 훈련에서 사용한 mean과 std를 그대로 사용해야 함

 

* 예측하기

kn.predict([new])

결과 : array([1.])

 

* 예측에 사용된 이웃 확인하고 시각화 / 이웃을 포함하여 산정도 그리기

dist, indexes = kn.kneighbors([new])

plt.scatter(train_scaled[:,0], train_scaled[:,1], c="red", label="bream")
plt.scatter(new[0], new[1], marker="^", c="green", label="pred")
plt.scatter(train_scaled[indexes, 0], train_scaled[indexes, 1], c="blue", label="nei")
plt.xlabel("lenght")
plt.ylabel("weight")
plt.legend()
plt.show()

728x90