기타

[AI코딩] 파이썬으로 머신러닝 코딩 예제 풀기(자동차 연비 예측하기)

경기도 초보파파 2025. 4. 8. 21:26
반응형

안녕하세요.

머신러닝 공부를 하면서 마땅한 예제가 어디 없을까 찾아보던 도중에 탠서플로우 사이트에서 알맞은 예제를 찾아왔습니다.(https://www.tensorflow.org/tutorials/keras/regression?hl=ko#%EB%AA%A8%EB%8D%B8_%ED%99%95%EC%9D%B8)

 

아래는 위 예제를 제가 직접 코딩하면서 풀어봤습니다.

 

#값 import하기
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

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

 

#dataset_path = keras.utils.get_file("auto-mpg.data", "http://archive.ics.uci.edu/ml/machine-learning-databases/auto-mpg/auto-mpg.data",progbar=False)
#의 get_file 오류 발생으로 수동 다운로드함(파일명 : test_file.txt)

column_names = ['MPG','Cylinders','Displacement','Horsepower','Weight',
                'Acceleration', 'Model Year', 'Origin']

raw_dataset = pd.read_csv('test_file.txt', names=column_names,
                      na_values = "?", comment='\t',
                      sep=" ", skipinitialspace=True)

# names => test_file.txt를 보면 컬럼값이 별도 명시되어 있지 않아서 names를 통해 컬럼값 셋팅
# na_values => 결측값 처리 옵션으로 "?"로 되어 있는 값들을 NaN으로 변경
# comment => 	'\t' (탭 문자)로 시작하는 줄은 주석 처리하여 무시합니다. 
# 실제 이 데이터셋에서는 크게 영향을 안 줄 수도 있지만, 관용적으로 추가해 놓는 경우가 많다고 합니다.
# sep => 공백을 구분자로 사용
# skipinitialspace => 각 값 앞에 불필요한 공백이 있는 경우 제거합니다. 예: ' 25.0' → '25.0'으로 인식.

dataset = raw_dataset.copy()
dataset.tail()

 

#누락데이터 확인 후 삭제
dataset.isna().sum()
# Horsepower값이 6 확인
#isna의 값은 dropna() 삭제

dataset = dataset.dropna()

 

#데이터 구조에서 범주형 데이터에 한해선 one-hot coding처리
#데이터 구조를 보면 Origin값은 범주형임을 데이터에서 파악 필요

origin = dataset.pop('Origin')
# pop메서드는 DataFrame에서 열 레이블을 꺼냅니다. 즉, 원본 DataFrame에서 해당 열이 제거됩니다.

# pop으로 Origin이 사라지고, use,Europe, Japan 확인가능
dataset['USA'] = (origin == 1)*1.0
dataset['Europe'] = (origin == 2)*1.0
dataset['Japan'] = (origin == 3)*1.0
dataset.tail()

 

#데이터셋을 훈련 세트와 테스트 세트로 분할하기
train_dataset, test_dataset = train_test_split(dataset, train_size=0.8, random_state=42)

 

#특성과 레이블 분리하기
#특성에서 타깃 값 또는 "레이블"을 분리합니다. 이 레이블을 예측하기 위해 모델을 훈련시킬 것입니다
#지금 여기에서 구하고 싶은 값은 연비(MPG)이기 때문에 MPG와 그외로 구분''

train_labels = train_dataset.pop('MPG')
test_labels = test_dataset.pop('MPG')

 

scaler = MinMaxScaler()
normed_train_data = scaler.fit_transform(train_dataset)
normed_test_data = scaler.transform(test_dataset)

 

#모델 구성
#모델을 구성해 보죠. 
#여기에서는 두 개의 완전 연결(densely connected) 은닉층으로 Sequential 모델을 만들겠습니다. 출력 층은 하나의 연속적인 값을 반환합니다.
model = keras.Sequential()
model.add(layers.Dense(64, activation='relu', input_shape=[len(train_dataset.keys())]))
model.add(layers.Dense(64, activation='relu'))
model.add(layers.Dense(1))

#생성한 모델에 대해 컴파일
model.compile(loss='mse',
                optimizer='adam',
                metrics=['mae', 'mse'])
             

# loss =>딥러닝 모델이 얼마나 틀렸는지를 수치로 표현해주는 핵심적인 요소
# 모델은 이 loss 값을 최소화하는 방향으로 학습
# 'mse' : 예측값과 실제값의 차이를 제곱한 후 평균을 냄
# 'mae' : 예측값과 실제값의 차이의 절댓값을 평균냄
# optimizer => 모델이 학습하는 방법을 결정해주는 방식으로, 대부분 상황에서 좋은 성능, 자동으로 학습률 조절. 추천!
# metrics(평가지표) => 모델이 학습 중에 얼마나 잘 작동하는지 평가하는 지표, loss는 최적화에 사용되지만, metrics는 진행 상황 파악용


#모델 정보 출력
model.summary()

#모델 실행(훈련 세트에서 10 샘플을 하나의 배치로 만들어 model.predict 메서드를 호출)
example_batch  = normed_train_data[:10]
example_result = model.predict(example_batch)
example_result

 

 

#모델 훈련
#이 모델을 100번의 에포크(epoch) 동안 훈련합니다. 훈련 정확도와 검증 정확도는 history 객체에 기록됩니다

history = model.fit(
  normed_train_data, train_labels,
  validation_data=(normed_test_data, test_labels),
  epochs=100, 
  verbose=0)
  
#  x, y: 학습 데이터와 정답
# epochs: 전체 데이터셋을 학습할 횟수
# batch_size: 한 번에 학습할 샘플 수
# validation_split: 검증 데이터로 사용할 비율 (ex. 0.2는 20%)
# validation_data: 검증용 데이터를 직접 지정할 수도 있음 (튜플 (x_val, y_val))
==> 앞에서 train_test_split을 사용하여 이미 검증 데이터를 별도로 생성해서 위의 옵션 사용
# verbose: 출력 형태 (0: 출력 안 함, 1: 진행 바, 2: 에포크별 로그)


#history값에서 val_ 값의 검증데이터를 사용했을경우의 측정값

 

# history 객체에 저장된 통계치를 사용해 모델의 훈련 과정을 시각화해 보죠.

hist = pd.DataFrame(history.history)
hist['epoch'] = history.epoch
hist.tail()
반응형