🤔loss, metric 의 차이는?
🤔분류일 때 사용하는 loss 의 종류는 무엇이 있을까?
🤔실습 후 느끼는 머신러닝 딥러닝 차이?
딥러닝이 좋은 성능을 낼 때도 있지만, 보통 정형데이터는 딥러닝보다는 머신러닝이 대체적으로 좋은 성능을 내는 편. 데이터 전처리와 피처엔지니어링이 성능에 더 많은 영향을 줌
🤔standard, min-max, robust 스케일링 각각의 특징?
Z-score scaling은 평균을 0으로, 표준편차를 1로 만들고 평균을 이용하여 계산하기 때문에 이상치에 민감함.
Min-Max scaler는 이름 그대로 최솟값과 최댓값을 0과 1로 지정. 이는 정규분포가 아니거나 표준편차가 작을 때 효과적임. 하지만 이상치를 포함하고 있다면 범위 설정에 영향이 가기 때문에 이상치에 민감함.
Robust scaler는 중앙값을 0으로, 사분위 수를 1로 만들고 중앙값을 이용하기 때문에 앞의 두 정규화 방법들에 비해 이상치에 강함.
스케일링은 범주만 바꿀 뿐 분포는 바뀌지 않음
🤔출력층 레이어 구성에서 분류와 회귀의 차이?
단일 변수 선형 회귀 모델에는 두 단계가 있음.
# 사이킷런의 전처리 기능을 사용하거나 직접 계산을 통해 정규화 하는 방법도 있음
# horsepower_normalizer : horsepower 변수를 가져와서 해당 변수만 정규화 해주는 코드
horsepower = np.array(train_features['Horsepower'])
horsepower_normalizer = layers.Normalization(input_shape=[1,], axis=None)
horsepower_normalizer.adapt(horsepower)
# 전처리 레이어를 추가해서 모델을 만들 때 전처리 기능을 같이 넣어줄 수 있음
# 장점 : 정규화 방법을 모르더라도 추상화된 기능을 사용해서 쉽게 정규화할 수 있음
# 단점 : 소스코드를 열어보기 전까지 어떤 기능인지 정확히 알기 어려움
horsepower_model = tf.keras.Sequential([
horsepower_normalizer,
layers.Dense(units=1)
])
horsepower_model.summary()
horsepower_model.compile(
optimizer=tf.keras.optimizers.Adam(learning_rate=0.1),
loss='mean_absolute_error')
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)
선형 회귀와 거의 동일한 설정을 사용하여 여러 입력을 기반으로 예측할 수 있음. 이 모델은 가 행렬이고 가 벡터라는 점을 제외하고 여전히 동일한 를 수행
normalizer
: tf.keras.layers.Normalization(axis=-1)
linear_model = tf.keras.Sequential([
normalizer,
layers.Dense(units=1)
])
DNN 모델에는 선형 모델보다 몇 개의 레이어가 더 포함됨.
horsepower_normalizer
및 다중 입력 모델의 경우 normalizer
사용)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)
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보다 좋음.
회귀 튜토리얼에서 보고자 하는 point
1) 정형데이터 입력층 input_shape
2) 정규화 레이어의 사용 => 사이킷런 api or 직접 정규화해도 됨.
3) 출력층이 분류와 다르게 구성이 된다는 점
4) loss 설정이 분류, 회귀에 따라 다름.
5) 입력변수(피처)를 하나만 사용했을 때보다 여러 변수를 사용했을 때 성능이 더 좋아짐. => 반드시 여러 변수를 사용한다라고 해서 성능이 좋아지지 않을 수도 있지만 너무 적은 변수로는 예측모델을 잘 만들기 어렵다는 점을 알 수 있음.
모델 컴파일 시 loss 지정하면 지정한 순서대로 history, evaluate에서 해당 metrics 들을 출력함
loss=["mae", "mse"]
와 같이 리스트 형태로 넣어주면 여러 지표 측정 가능EarlyStopping
을 설정(monitor
과 patience
로 멈추는 기준이 될 지표와 횟수를 설정)validation_split
을 설정하여 검증 데이터셋도 설정history
표를 보면서 측정