인공지능

전처리(3)

yul_S2 2023. 1. 9. 09:34
반응형

 

스케일 조정

스케일을 조정하는 방법은 많지만 신경망에서 자주 사용하는 방법은 표준화이다.
평균을 빼고 표준 편차로 나누면 되는 간단한 방법이다.

이때, 훈련 세트 검증 세트의 스케일을 같이 맞춰야 한다. 
만약 하나라도 빼먹으면 성능이 매우 안 좋을 수 있다.
그리고 훈련 세트와 검증 세트를 같은 비율로 조정해야 한다.
즉, 훈련 세트의 평균과 표준 편차로 모두 표준화해야 한다는 뜻이다. 만약 따로따로 한다면 검증 세트의 샘플 데이터를 잘못 인식하게 된다. 

 

 

# 1.  넘파이로 표준화 구현하기

# (1) 표준화전처리하기 

train_mean = np.mean(x_train, axis=0)
train_std = np.std(x_train, axis=0)
 
x_train_scaled = (x_train-train_mean) / train_std

▶표준화를 구현한 다음에 특성별로 스케일 조정
mean(), std()함수의 axis 0으로 지정하면 
2차원 배열의 열을 기준으로 통계치를 계산하여 하나의 행 벡터로 변환한다
훈련세트에서 평균을 빼고 표준편차로 나누면된다.

 

 

 

# (2) 모델 훈련하기 _ 특성별로 스케일 조정

layer2 = SingleLayer()
layer2.fit(x_train_scaled, y_train)
w2 = []
w3 = []
for w in layer2.w_history:
    w2.append(w[2])
    w3.append(w[3])

 

 

# (3) 시각화

plt.plot(w2,w3)
plt.plot(w2[-1], w3[-1], 'ro')
plt.xlabel('w[2]')
plt.ylabel('w[3]')
plt.show()

 

▶그래프 결과 
w2와 w3의 변화 비율이 비슷하여 대각선 방향으로 가중치가 이동한다.
특성의 스케일을 비슷하게 맞추었기 때문에 최적값에 빠르게 근접하고 있다.

 

 

 

# (4) 성능평가하기

layer2.score(x_val, y_val)
# 0.37362637362637363

▶좋지 않은 성능이다 
검증세트의 스케일을 바꾸지 않았기 때문이다.  
검증세트도 표준화 전처리를 해야한다.

 

 

# (5) 검증세트 표준화 하기

val_mean = np.mean(x_val, axis=0)
val_std = np.std(x_val, axis=0)
x_val_scaled = (x_val-val_mean) / val_std

 

 

# (6) 다시 성능평가하기

layer2.score(x_val_scaled, y_val)
# 0.967032967032967

 

 

 

 

# 1.  원본 훈련 세트와 검증 세트로 산점도 그리기

plt.plot(x_train[:50, 0], x_train[:50, 1], 'bo')
plt.plot(x_val[:50, 0], x_val[:50, 1], 'ro')
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.legend(['train set', 'val. set'])
plt.show()

▶trainset : 파란색 / testset : 빨간색

 

 

 

# 2.  전처리한 훈련 세트와 검증세트로 산점도 그리기

plt.plot(x_train_scaled[:50, 0], x_train_scaled[:50, 1], 'bo')
plt.plot(x_val_scaled[:50, 0], x_val_scaled[:50, 1], 'ro')
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.legend(['train set', 'val. set'])
plt.show()

▶미세하게 다른 비율로 변환되었다. 

원본 훈련 세트와 검증 세트의 점과 점 사이의 거리가 변환된 이후에 그대로 유지 되지 않았다고 볼 수 있다.

데이터를 제대로 전처리 했다면(스케일 조정) 훈련 세트와 검증 세트의 거리가 그대로 유지되어야한다.

점과 점 사이의 거리가 달라진 이유는 훈련 세트와 검증 세트를 다른 비율로 전처리 했기 때문이다.

 

 

 

# 3.  올바르게 검증세트 전처리하기

x_val_scaled = (x_val-train_mean) / train_std
plt.plot(x_train_scaled[:50, 0], x_train_scaled[:50, 1], 'bo')
plt.plot(x_val_scaled[:50, 0], x_val_scaled[:50, 1], 'ro')
plt.xlabel('feature 1')
plt.ylabel('feature 2')
plt.legend(['train set', 'val. set'])
plt.show()

▶훈련세트의 평균, 표준편차를 사용하여 검증세트를 변환한다.

원본데이터의 산점도와 스케일 조정 이후 산점도가 같아졌다
검증세트와 훈련세트가 동일한 비율로 변환되었다고 본다.

 

 

# 4. 모델 성능평가

layer2.score(x_val_scaled, y_val)
# 0.967032967032967

▶ 검증세트로 모델의 성능평가 

위스콘신 유방암데이터는 크지 않기 때문에 검증 세트 전처리 전 후 성능이 동일하다.

즉, 동일한 개수의 샘플을 올바르게 예측했다고 볼 수 있다.

만약 검증 세트가 클 경우 성능에 차이가 나타날 수 있다.

 

반응형