[TIL] 22.11.30

문종현·2022년 11월 30일
0

TIL

목록 보기
49/119
post-custom-banner

👉 오늘 한 일

  • pima 분류 실습 이어서
  • tensorflow 회귀 튜토리얼
  • pima 회귀 실습

pima 데이터셋 실습 - 분류

  • dropout은 바로 전 layer에만 적용됨

🤔loss, metric 의 차이는?

  • loss 는 모델 훈련 시 W, b 값을 업데이트 해주기 위해 사용함
  • metric 은 모델 검증 시 모델의 성능을 평가하기 위해 사용함

🤔분류일 때 사용하는 loss 의 종류는 무엇이 있을까?

  • 이진분류 : binarycrossentropy
  • 다중분류(원핫인코딩) : categorical_crossentropy
  • 다중분류(오디널) : sparse_categorical_crossentropy

🤔실습 후 느끼는 머신러닝 딥러닝 차이?
딥러닝이 좋은 성능을 낼 때도 있지만, 보통 정형데이터는 딥러닝보다는 머신러닝이 대체적으로 좋은 성능을 내는 편. 데이터 전처리와 피처엔지니어링이 성능에 더 많은 영향을 줌

  • garbage in garbage out : 좋은 데이터를 통해 모델을 만드는게 성능에 가장 중요한 역할을 함

Tensorflow 회귀 튜토리얼

🤔standard, min-max, robust 스케일링 각각의 특징?

  • Z-score scaling은 평균을 0으로, 표준편차를 1로 만들고 평균을 이용하여 계산하기 때문에 이상치에 민감함.

  • Min-Max scaler는 이름 그대로 최솟값과 최댓값을 0과 1로 지정. 이는 정규분포가 아니거나 표준편차가 작을 때 효과적임. 하지만 이상치를 포함하고 있다면 범위 설정에 영향이 가기 때문에 이상치에 민감함.

  • Robust scaler는 중앙값을 0으로, 사분위 수를 1로 만들고 중앙값을 이용하기 때문에 앞의 두 정규화 방법들에 비해 이상치에 강함.

  • 스케일링은 범주만 바꿀 뿐 분포는 바뀌지 않음

🤔출력층 레이어 구성에서 분류와 회귀의 차이?

  • 활성화 함수를 쓰지 않고 항등함수로 받아서 입력받은 값을 그대로 출력함

💡단일 변수 선형 회귀

단일 변수 선형 회귀 모델에는 두 단계가 있음.

  • tf.keras.layers.Normalization 전처리 레이어를 사용하여 'Horsepower' 입력 특성을 정규화함.
  • 선형 변환( y=mx+b )을 적용하여 선형 레이어(tf.keras.layers.Dense)로 1개의 출력을 생성함.
  • 입력의 수는 input_shape 인수로 설정하거나 모델이 처음 실행될 때 자동으로 설정할 수 있음.
  • 한 개 피처를 이용해 선형회귀 실행
# 사이킷런의 전처리 기능을 사용하거나 직접 계산을 통해 정규화 하는 방법도 있음
# horsepower_normalizer : horsepower 변수를 가져와서 해당 변수만 정규화 해주는 코드

horsepower = np.array(train_features['Horsepower'])

horsepower_normalizer = layers.Normalization(input_shape=[1,], axis=None)
horsepower_normalizer.adapt(horsepower)
  • keras 모델 순차 빌드
# 전처리 레이어를 추가해서 모델을 만들 때 전처리 기능을 같이 넣어줄 수 있음
# 장점 : 정규화 방법을 모르더라도 추상화된 기능을 사용해서 쉽게 정규화할 수 있음
# 단점 : 소스코드를 열어보기 전까지 어떤 기능인지 정확히 알기 어려움

horsepower_model = tf.keras.Sequential([
    horsepower_normalizer,
    layers.Dense(units=1)
])

horsepower_model.summary()
  • 모델 컴파일
    • loss function이 분류와 다름
horsepower_model.compile(
    optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),
    loss='mean_absolute_error')
  • epoch 를 통해 학습을 하면 그 학습결과를 로그로 저장을 해서 history라는 API 명을 사용함
history = horsepower_model.fit(
    train_features['Horsepower'],
    train_labels,
    epochs=100,
    # Suppress logging.
    verbose=0,
    # Calculate validation results on 20% of the training data.
    validation_split = 0.2)

💡다중 입력이 있는 선형 회귀

선형 회귀와 거의 동일한 설정을 사용하여 여러 입력을 기반으로 예측할 수 있음. 이 모델은 mm가 행렬이고 bb가 벡터라는 점을 제외하고 여전히 동일한 y=mx+by = mx+b를 수행

  • 전체 피처에 대해 선형회귀 수행
  • normalizer : tf.keras.layers.Normalization(axis=-1)
linear_model = tf.keras.Sequential([
    normalizer,
    layers.Dense(units=1)
])

💡심층 신경망(DNN)을 사용한 단일, 다중입력 회귀

DNN 모델에는 선형 모델보다 몇 개의 레이어가 더 포함됨.

  • 이전과 같은 정규화 레이어(단일 입력 모델의 경우 horsepower_normalizer 및 다중 입력 모델의 경우 normalizer 사용)
  • ReLU(relu) 활성화 함수 비선형성이 있는 두 개의 숨겨진 비선형 Dense 레이어
  • 선형 Dense 단일 출력 레이어

두 모델 모두 동일한 훈련 절차를 사용하므로 compile 메서드는 아래의 build_and_compile_model 함수에 포함됨

# 컴파일까지의 과정을 함수로 만들어 처리
def build_and_compile_model(norm):
  model = keras.Sequential([
      norm,
      layers.Dense(64, activation='relu'),
      layers.Dense(64, activation='relu'),
      layers.Dense(1)
  ])

  model.compile(loss='mean_absolute_error',
                optimizer=tf.keras.optimizers.Adam(0.001))
  return model

# 단일 입력
dnn_horsepower_model = build_and_compile_model(horsepower_normalizer)

# 다중 입력
dnn_model = build_and_compile_model(normalizer)
  • 예측값이 기본적으로 2차원으로 나오기 때문에, flatten()을 통해 예측값을 1차원으로 만들어줘야 함
test_predictions = dnn_model.predict(test_features).flatten()
  • flatten(), ravel(), reshape() 는 n차원도 1차원으로 변환해줌
a = np.arange(8)
print(a, "ndim : ", a.ndim)
b = a.reshape(2, 2, 2)
print(b, "ndim : ", b.ndim)
b.reshape(-1)
b.flatten(), b.ravel()

💡결과를 비교해봤을 때, 다중입력 선형 회귀의 성능이 단일입력 DNN보다 좋음.

  • 즉, DNN이라도 입력값이 불충분하다면 제대로 학습하기 어렵다
  • 과소적합 때문

📌Summary

회귀 튜토리얼에서 보고자 하는 point

1) 정형데이터 입력층 input_shape
2) 정규화 레이어의 사용 => 사이킷런 api or 직접 정규화해도 됨.
3) 출력층이 분류와 다르게 구성이 된다는 점
4) loss 설정이 분류, 회귀에 따라 다름.
5) 입력변수(피처)를 하나만 사용했을 때보다 여러 변수를 사용했을 때 성능이 더 좋아짐. => 반드시 여러 변수를 사용한다라고 해서 성능이 좋아지지 않을 수도 있지만 너무 적은 변수로는 예측모델을 잘 만들기 어렵다는 점을 알 수 있음.

pima 데이터셋 실습 - 회귀

모델 컴파일 시 loss 지정하면 지정한 순서대로 history, evaluate에서 해당 metrics 들을 출력함

  • 아무것도 지정하지 않아도 디폴트로 loss값을 찾아서 출력함(MAE)
  • evaluate 했을 때도 마찬가지

💡 DNN 회귀 모델 구축 정리

  1. input_shape는 사용할 x의 피처 개수(shape)를 넣어줌
  2. 출력층에서는 분류 모델과 다르게 Dense로 출력 및 유닛 1로 설정
  3. 모델 컴파일 시 loss, metrics 변경
  • 이 때, loss=["mae", "mse"] 와 같이 리스트 형태로 넣어주면 여러 지표 측정 가능
  1. 자원과 시간을 아끼기 위해서 학습 과정 중 성능이 비슷하면 멈출 수 있도록 EarlyStopping 을 설정(monitorpatience 로 멈추는 기준이 될 지표와 횟수를 설정)
  2. 학습 과정에서 validation_split 을 설정하여 검증 데이터셋도 설정
  3. 학습한 모델의 성능을 history 표를 보면서 측정
profile
자라나라 새싹새싹🌱
post-custom-banner

0개의 댓글