상세 컨텐츠

본문 제목

[TIL]1130: 정형 데이터의 딥러닝 분류 및 회귀

멋사 AISCOOL 7기 Python/TIL

by dundunee 2022. 11. 30. 20:53

본문

예측

예측해야하는 값이 바이너리가 아닌 0-1사이의 값이 도출됨

  • 바이너리면 결과가 2개 나와야 하는거 아닌가요? -> softmax라면 2개가 나온다
  • 바이너리로 했기 때문에 예측값이 각 row당 예측값이 하나씩 나온다
  • 여기서 나오는 값은 확률값(sigmoid) 0-1사이의 값을 갖는다
  • 따라서 이때는 특정 임계값을 정해서 크고 작다를 통해 True, False값으로 판단한다
  • 임계값은 보통 0.5를 사용하지만 다른 값을 사용하기도 한다.

개선!

  • 레이어 변경, epoch수 변경, validation 변경 등을 통해 성능을 개선할 수 있다.

(면접질문)loss와 metric의 차이는 무엇이냐?

  • loss는 손실함수이고, metric은 평가지표이다.
  • loss를 통해 실제값과 예측값의 차이를 측정하게 되고, metric을 사용해 모델의 정확도를 알 수 있다.
  • loss는 가중치(weight)와 편향(bias)을 업데이트하는데 사용하고, metric은 모델의 성능을 평가할 때 사용한다.

(면접질문)분류일 때 사용하는 loss의 종류

  • loss값을 보고 label이 어떤 형태인지 알 수 있다. label값이 바이너리, 원핫, 오디널 인코딩에 따라 사용하는 손실함수가 달라진다. binary entropy(이진분류일때), categorical entropy(label이 원핫인코딩이 되어 있다면), sparse_categorical_crossentropy(label이 label 인코딩이 되어 있다면)

(면접질문) crossentropy?

  • 다른 값과 섞여있는 정도를 확률값으로 나타내며, 분류의 손실함수로 사용한다

딥러닝의 정형데이터 성능에 대해

  • 보통은 정형데이터는 딥러닝보다는 머신러닝이 대체적으로 좋은 성능을 낸다.
  • 물론 딥러닝이 좋은 성능을 낼때도 있다,
  • 무엇보다도 중요한 것은 데이터 전처리와 피처엔지니어링이 성능에 더 많은 영향을 준다!
  • garbge in garbage out: 좋은 데이터를 통해 모델은 만드는게 성능에 가장 좋은 역할을 한다

history?

  • epoch 를 통해 학습을 하면 그 학습결과를 로그로 저장을 해서 history라는 API 명을 사용한다

자동차연비-회귀실습

목적

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

eda: sns.boxplot(data = train_dataset)

  • 데이터간에 값의 차이가 많이 나보인다. 이럴 때는 스케일링을 이용한다
  • minmiax: 최대1, 최소0, 이상치에 민감하다
  • standard: 평균0, 표준편차1, 이상치에 민감하다
  • robust: 중앙값이 0이다. 두 스케일링 방법보다 이상치에 강하다.
  • 스케일링은 스케일만 바꿀 뿐이지 분포는 변하지 않는다. -> 로그변환

추상화된 기능으로 스케일링하기

  • horsepower_normalizer = layers.Normalization(input_shape=[1,], axis=None)
  • horsepower_normalizer.adapt(horsepower)
  • 층 쌓기: horsepower_model = tf.keras.Sequential([horsepower_normalizer, ...])
  • 전처리 레이어를 추가해서 모델을 만들 때 전처리 기능을 같이 넣어줄 수 있다
  • 장점은 정규화 방법을 모르더라도 추상화된 기능을 사용해서 쉽게 정규화해줄 수 있다는 것이다
  • 단점은 추상화된 기능은 소스코드, 문서를 열어보기 전에는 어떤 기능인지 알기 어렵다

모델 컴파일

  • optimizer=tf.keras.optimizers.Adam(learning_rate=0.1)
  • "Adam"이라고 지정해주면 기본 learning rate을 지정해줌
  • api로 지정해주면 learning rate을 조정할 수 있음

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

  • 분류는(n, activation='softmax'), (1, activation='sigmoid')
  • 회귀는 항등함수로, 입력받은 값을 그대로 출력한다: layers.Dense(units=1) < 회귀의 출력층은 항상 이 형태이다.

이진 분류 실습과 회귀 loss의 차이?

  • 분류는 cross_entropy, 회귀는 mae, mse등을 사용한다.

회귀와 DNN의 loss그래프 비교(단일입력 vs 다중입력)

  • 다중입력일때는 회귀를 사용했을 때 보다 dnn을 사용했을 때 성능이 더 좋아짐
  • 다중 또는 단일 입력 기준으로 비교하기 보다, 회귀일 때 단일/다중, dnn일때 단일/다중을 비교해야함
  • 그래서 각각을 볼 때 단일입력보다 다중입력일 때 loss가 더 줄어들고 성능이 더 좋아졌으며
  • 다중입력만으로봤을 때는 회귀보다 dnn일때 성능이 더 잘나옴
  • 여기서는 다중 회귀가 단일 DNN보다 성능이 좋게 나타나는데 이런 경우 DNN이라도 입력값이 불충분하다면 제대로 학습하기 어렵다는 것을 볼 수 있으며, 과소적합으로 볼 수 있다.
  • 변수가 적다면 underfitting!이 일어날 가능성이 있다

loss? vs val_loss?

  • loss는 훈련 손실 값, val_loss는 검증 손실 값
  • validation은(val_loss가 도출되려면) model.fit(학습단계)을 할 때 validation_split을 지정해줘야 한다
  • model.fit(X_train, y_train, epochs, validation_split)

예측하기

  • tf는 예측값이 2차원으로 나오기 때문에 flatten()을 사용해 2차원을 1치원으로 평탄화해줘야한다
  • 신경망 모델은 예측값이 기본적으로 2차원으로 나온다.

 

관련글 더보기