본문 바로가기
👩🏻‍💻 강의 기록용/처음 시작하는 데이터 사이언스

6-② 탠서플로를 통한 자동차 연비 예측하기 (데이터셋 나누기, 딥러닝 모델 만들기, 딥러닝 모델로 학습과 예측하기)

by b5ingbo2ng 2023. 9. 19.

탠서플로를 통한 자동차 연비 예측하기 공식 문서 (링크)

 


 

필요한 도구 가져오기

# 데이터 분석을 위한 pandas, 시각화를 위한 seaborn 불러오기
import pandas as pd
import seaborn as sns

 

 

데이터셋 로드하고 결측치 확인

  • 머신러닝, 딥러닝으로 데이터 예측할 때는 연산작용을 통해서 결과값이 출력되는 것
  • 그런데, 결측치가 있으면 그 데이터는 계산할 수 없기 때문에 결측치를 제거하거나 대체해야함
  • 결측치가 많지 않으면 제거하면 되고, 결측치가 너무 많다면 다른 값으로 대체하는게 적절
# 자동차연비 데이터셋인 mpg 데이터셋을 불러옵니다.
df = sns.load_dataset('mpg')
df.shape
(398, 9)


# 결측치의 합계 구하기
df.isnull().sum()
mpg             0
cylinders       0
displacement    0
horsepower      6
weight          0
acceleration    0
model_year      0
origin          0
name            0
dtype: int64

 

결측치 제거 : dropna

# dropna로 결측치를 제거합니다.
df= df.dropna()
df

 

 

수치 데이터만 가져오기

  • 머신러닝이나 딥러닝 모델은 내부에서 수치계산을 하기 때문에 숫자가 아닌 데이터를 넣어주면 모델이 학습과 예측을 할 수 없음
# select_dtypes 를 통해 object 타입을 제외하고 가져옵니다.
df = df.select_dtypes(exclude='object')
df

 

 

데이터셋 나누기

  • 전체 데이터프레임에서 train용 데이터셋test용 데이터셋으로 분리
    • train_dataset : 학습에 사용 (예: 기출문제)
    • test_dataset : 실제 예측에 사용 (예 : 실전문제)
  • 기출문제로 공부하고 실전 시험을 보는 과정과 유사

 

1️⃣ train_dataset 만들기

  • 전체 데이터셋 중에서 80퍼를 샘플로 추출해라 → train에 지정
train_dataset = df.sample(frac=0.8, random_state=42)
train_dataset.shape

 

2️⃣ test_dataset 만들기

  • 그냥 따로 또 sample을 사용해서 테스트 데이터셋으로 분리하면 겹치는게 있을 수도 있음 😱
  • 그래서 위에서 만든 train 데이터셋을 전체데이터에서 빼면 돼!! => 아예 빼버릴 때는 drop 이용
test_dataset = df.drop(train_dataset.index)
test_dataset.shape

 

 

 

문제에서 정답(label)을 분리하기

  • train_dataset, test_dataset 에서 label(정답) 값을 꺼내 label 을 따로 생성합니다.
    • 우리 데이터에서는 전체 데이터에서 mpg(예측할 값)칼럼을 따로 빼야해
  • pop : 특정 데이터 칼럼만 뽑아줘
    • 그 전 데이터프레임에선 아예 없어지는거. 아예 다 떼버려 

# train 데이터셋의 mpg값만 추출
train_labels = train_dataset.pop('mpg')
train_labels

# test 데이터셋의 mpg값만 추출
test_labels = test_dataset.pop('mpg')
test_labels

이렇게 pop으로 정답 칼럼을 따로 빼내고, 원래 데이터 셋을 확인해보면?

train_dataset.shape, test_dataset.shape
((314, 6), (78, 6))

칼럼 수가 7개에서 6개로 줄었다!!! 🌟

 

 

 

 


여기서 잠깐 정리하자면,, 

train_dataset에 연비를 제외한 나머지 컬럼들이 있는데, 그 나머지 컬럼들을 학습해서

test_datset에서 연비가 얼마인지를 예측을 한다!

 

 

 

 

[딥러닝 모델 만들기]

  • 두 개의 완전 연결(densely connected) 은닉층으로 Sequential 모델을 만들겠습니다.
  • 출력 층은 하나의 연속적인 값을 반환합니다.

 

# tensorflow 를 불러옵니다.
import tensorflow as tf
tf.__version__

 

 

1️⃣ 딥러닝 층 구성

  • Dense layer에 들어가는 숫자는 유닛의 개수를 의미,, 임의로 지정해주면 돼
  • input_shape : 입력하는 변수의 개수 (=train_dataset의 칼럼 개수=6)
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(64, input_shape=[len(train_dataset.keys())])) # 입력층
model.add(tf.keras.layers.Dense(64)) # 히든 레이어 1
model.add(tf.keras.layers.Dense(64)) # 히든 레이어 2
model.add(tf.keras.layers.Dense(1)) # 출력층

 

 

2️⃣ 모델 컴파일 : 모델을 학습시키기 위한 학습과정을 설정하는 단계

  • metrics : 우리가 만든 모델의 정확도 어느정도 되는지 측정하는 여러가지 방법
      • MAE(Mean Absolute of Errors) : 평균 절대 오차 
        • 예측값 - 관측값들의 제곱이 아니라 '절댓값' 을 통해 음수를 처리한 뒤 이들의 평균
          → 제곱을 하지 않아서 단위 자체가 기존 데이터와 같아 회귀 계수 증감에 따른 오차를 쉽게 파악할 수 있음
        • 오차에 대한 절댓값의 평균
        • 오차가 0에 가까울수록 정확도가 높구나~ 판단
      • MSE(Mean Square of Errors) : 평균 제곱 오차
        • 예측값 - 관측값의 제곱된 값의 평균
        • 제곱으로 인해 원래 차이보다 다소 민감한 성능평가일 수 있음
      • 선형 회귀의 평가 지표 참고 링크회귀에서는 'mae', 'mse' 방법을 많이 사용하는 편
model.compile(loss='mse', metrics = ['mae', 'mse'])

 

 

 

3️⃣ 만든 모델 확인하기 

model.summary()

 

 

 

4️⃣ 딥러닝 모델로 학습하기 

  • fit : 트레이닝 데이터와 레이블을 가지고 학습을 한다~
  • epochs : 몇 번 반복해서 학습할건지 입력
  • verbose: 로그를 어떻게 찍을건지를 의미 ➡️ 0 으로 하면 로그 출력 안함
model.fit(train_dataset, train_labels, epochs = 100, verbose = 0)

 

 

 

5️⃣ 딥러닝 모델 평가하기 

  • 모델 직접 컴파일할 때 지정한 오차 측정방법을 통해서 오차를 구함
  • 평가 방법
    • 자동차 연비를 예측을 하는데 평균적으로 절댓값이 7정도가 차이가 난다 평가
    • 에러값을 제곱해서 평균을 구한게 75정도 된다.
model.evaluate(test_dataset, test_labels)

3/3 [==============================] - 0s 5ms/step - loss: 75.1122 - mae: 7.5044 - mse: 75.1122
[75.11222839355469, 7.504369258880615, 75.11222839355469]

 

 

6️⃣ 딥러닝 모델의 예측하기

  • 2차원 형태로 결과가 나와서 한줄로 보고싶다면? flatten() 사용
predict_labels = model.predict(test_dataset).flatten()
predict_labels[:5]

3/3 [==============================] - 0s 3ms/step
array([ 9.417114,  3.280769, 20.84774 , 19.498169, 11.095715],
      dtype=float32)

 

 

7️⃣ 딥러닝 모델의 예측결과 평가하기

  • 잘 예측했으면 mpg값이 우 대각선이 그려져서 실제값과 예측값이 상관이 되어야한다.
  • 근데 우리 그림은 제대로 학습이 안된 것 같아 ➡️ 모델을 개선하면서 오차 값을 점점 줄여야 해
sns.scatterplot(x=test_labels, y=predict_labels)

 

[모델 개선하는 방법 ]

  • 1. 학습 반복 횟수(epoch) UP
    • epoch 횟수 10번만 학습하는게 아니라 100번 정도 학습시켜라 →  mae 값이 줄어들었음
  • 2. 딥러닝 층 구성 할 때, activation = 'relu' 추가
    • 출력층에는 넣지 말고 입력층과 히든층에만
  • 3. 레이어의 수를 변경해보거나 레이어 안의 유닛개수를 조정해본다

 

# 실제 값이 증가함에 따라 예측값도 증가하고 있군!
sns.jointplot(x=test_labels, y=predict_labels, kind = 'reg')