예측
예측해야하는 값이 바이너리가 아닌 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 명을 사용한다
자동차연비-회귀실습
목적
- 정형 데이터의 입력층: input_shape
- 정규화 레이어틔 사용 => 직접 정규화 해도된다.
- 출력층에 분류와 다르게 구성이 된다는 점
- loss 설정이 분류 및 회귀에 따라 다르다
- 입력변수(피처)를 하나만 사용했을 때 보다 여러 변수를 사용했을 때 성능이 더 좋아졌다 : 반드시 여러변수를 사용한다고 해서 성능이 좋아지지 않을 수도 있지만, 너무 적은 변수로 예측모델을 잘 만들기 어렵다는 것을 알 수 있다
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차원으로 나온다.
[TIL]1206: CNN Classification, 이미지로드방법 (0) |
2022.12.06 |
[TIL]1205: DNN리뷰, CNN(Convolution,Pooling) 기본개념 (0) |
2022.12.06 |
[TIL]1129: 딥러닝기초, 레이어구성, 활성화함수, 옵티마이저, MNIST, FMNIST (1) |
2022.11.29 |
[TIL]1128: 이진분류평가지표, resampling, 딥러닝연산, 딥러닝학습법 (0) |
2022.11.29 |
[TIL] 20221123 (0) |
2022.11.24 |