반응형
안녕하세요.
머신러닝 공부를 하면서 마땅한 예제가 어디 없을까 찾아보던 도중에 탠서플로우 사이트에서 알맞은 예제를 찾아왔습니다.(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()
반응형
'기타' 카테고리의 다른 글
[자격증] 국내 최초 AI국가 공인자격증(AICE) 샘플 문제 풀기 (3) | 2025.04.24 |
---|---|
[자격증] 국내 최초 AI국가 공인자격증(AICE) (9) | 2025.04.17 |
[견과류 칼로리] 견과류의 영양성분(ex. 아몬드,호두 등) (18) | 2025.04.07 |
[AI코딩] 파이썬으로 머신런닝 진행해보기 (6) | 2025.04.05 |
[파이썬] 데이터를 시각화하여 분석해보자(seaborn(씨본) 라이브러리) (7) | 2025.03.30 |