TensorFlow를 이용한 회귀 분석 기초: 자동차 연비(MPG) 예측

회귀(Regression)는 가격이나 확률과 같은 연속적인 수치 값을 예측하는 머신러닝의 핵심 기술 중 하나입니다. 이번 글에서는 TensorFlow와 Keras를 활용하여 자동차의 연비(MPG)를 예측하는 기본적인 회귀 모델 구축 과정을 살펴보겠습니다.

1. 데이터 준비 및 전처리

모델의 성능은 데이터의 품질에 좌우됩니다. 자동차 연비 데이터셋(Auto MPG Dataset)을 활용하여 데이터를 분석하고 모델이 학습할 수 있는 형태로 가공하는 과정을 진행합니다.

데이터 로드 및 세척

데이터셋에는 결측값이나 불필요한 열이 포함될 수 있습니다. Pandas를 활용하여 이를 정제합니다.

import pandas as pd
import tensorflow as tf
from tensorflow.keras import layers

# 데이터셋 컬럼 정의
feature_columns = ['MPG', 'Cylinders', 'Displacement', 'Horsepower', 'Weight', 
                   'Acceleration', 'Model Year', 'Origin']

# 데이터 불러오기 (결측치는 '?'로 표시됨)
raw_df = pd.read_csv("auto-mpg.data", names=feature_columns,
                     na_values="?", comment='\t',
                     sep=" ", skipinitialspace=True)

# 결측값 제거
mpg_data = raw_df.dropna()

# 'Origin' 열은 범주형 데이터이므로 원-핫 인코딩(One-Hot Encoding) 수행
origin_col = mpg_data.pop('Origin')
mpg_data['USA'] = (origin_col == 1) * 1.0
mpg_data['Europe'] = (origin_col == 2) * 1.0
mpg_data['Japan'] = (origin_col == 3) * 1.0

데이터셋 분할 및 정규화

전체 데이터를 학습용과 테스트용으로 분리하고, 각 특성(Feature)의 범위를 맞추기 위해 정규화를 수행합니다.

# 데이터 분할 (80% 학습, 20% 테스트)
train_set = mpg_data.sample(frac=0.8, random_state=42)
test_set = mpg_data.drop(train_set.index)

# 레이블 분리 (예측하려는 값: MPG)
train_labels = train_set.pop('MPG')
test_labels = test_set.pop('MPG')

# 통계치 산출 및 정규화 함수
stats = train_set.describe().transpose()

def normalize_data(x):
    return (x - stats['mean']) / stats['std']

normed_train_x = normalize_data(train_set)
normed_test_x = normalize_data(test_set)

2. 회귀 모델 설계

모델은 두 개의 완전 연결(Dense) 은닉층을 가진 Sequential API를 사용합니다. 출력층은 수치 하나를 예측해야 하므로 활성화 함수 없이 하나의 노드만 둡니다.

def create_regression_model():
    model = tf.keras.Sequential([
        layers.Dense(64, activation='relu', input_shape=[len(train_set.keys())]),
        layers.Dense(64, activation='relu'),
        layers.Dense(1)
    ])

    optimizer = tf.keras.optimizers.RMSprop(0.001)

    model.compile(loss='mse',
                  optimizer=optimizer,
                  metrics=['mae', 'mse'])
    return model

regression_model = create_regression_model()

3. 모델 학습 및 조기 종료(EarlyStopping)

학습 과정에서 검증 데이터의 오차가 줄어들지 않으면 학습을 멈추는 EarlyStopping 콜백을 사용합니다. 이는 과적합(Overfitting)을 방지하고 자원을 효율적으로 사용하게 해줍니다.

# 에포크가 끝날 때마다 점을 찍어 진행 상태 표시
class ProgressDot(tf.keras.callbacks.Callback):
    def on_epoch_end(self, epoch, logs):
        if epoch % 100 == 0: print('')
        print('.', end='')

# 검증 손실이 10번의 에포크 동안 개선되지 않으면 중단
stop_monitor = tf.keras.callbacks.EarlyStopping(monitor='val_loss', patience=10)

training_history = regression_model.fit(
    normed_train_x, train_labels,
    epochs=1000, validation_split=0.2, verbose=0,
    callbacks=[stop_monitor, ProgressDot()]
)

4. 예측 및 성능 평가

학습된 모델을 사용하여 테스트 데이터셋으로 예측을 수행하고 실제 값과 비교하여 오차를 확인합니다.

# 테스트 데이터셋 평가
loss, mae, mse = regression_model.evaluate(normed_test_x, test_labels, verbose=2)
print(f"테스트 세트 평균 절대 오차(MAE): {mae:5.2f} MPG")

# 예측 수행
sample_predictions = regression_model.predict(normed_test_x).flatten()

# 결과 시각화 (Matplotlib 활용 예시)
import matplotlib.pyplot as plt

plt.scatter(test_labels, sample_predictions)
plt.xlabel('True Values [MPG]')
plt.ylabel('Predictions [MPG]')
plt.axis('equal')
plt.axis('square')
plt.plot([-100, 100], [-100, 100], color='red')
plt.show()

주요 요약

  • MSE (Mean Squared Error): 회귀 문제에서 주로 사용하는 손실 함수입니다.
  • MAE (Mean Absolute Error): 회귀 모델의 성능을 평가할 때 사용하는 일반적인 지표입니다.
  • 데이터 정규화: 서로 다른 범위를 가진 입력 특성들을 동일한 범위로 맞추는 과정은 학습 속도와 정확도에 큰 영향을 미칩니다.
  • 과적합 방지: 훈련 데이터가 적을수록 작은 규모의 네트워크를 사용하거나 EarlyStopping과 같은 기법을 활용하는 것이 유리합니다.

참고 사항

환경 설정 시 tensorflow.keras 경로 문제로 라이브러리 참조 오류가 발생한다면, 설치된 TensorFlow 버전에 맞춰 from tensorflow.python.keras import layers와 같이 명시적인 경로를 확인해야 할 수도 있습니다. 또한, 데이터 파일을 온라인에서 직접 다운로드할 때 네트워크 이슈가 발생한다면 로컬 환경에 파일을 미리 내려받은 후 경로를 지정하여 처리하는 것을 권장합니다.

태그: TensorFlow keras machine learning Regression data preprocessing

7월 5일 00:28에 게시됨