새소식

Machine Learning

1.회귀문제_4_네비게이션

  • -

layout: single
title: "jupyter notebook 변환하기!"
categories: coding
tag: [python, blog, jekyll]
toc: true
author_profile: false


네비게이션 주행데이터를 이용한 도착시각 예측 문제


[미션 안내]

  • 네비게이션 주행데이터를 읽어들여 데이터를 분석 및 전처리한 후 머신러닝과 딥러닝으로 도착시각을 예측하고 결과를 분석하세요.

[유의 사항]

  • 각 문항의 답안코드는 반드시 '#여기에 답안코드를 작성하세요'로 표시된 cell에 작성해야 합니다.

  • 제공된 cell을 추가/삭제하고 다른 cell에 답안코드를 작성 시 채점되지 않습니다.

  • 반드시 문제에 제시된 가이드를 읽고 답안 작성하세요.

  • 문제에 변수명이 제시된 경우 반드시 해당 변수명을 사용하세요.

  • 문제와 데이터는 제3자에게 공유하거나 개인적인 용도로 사용하는 등 외부로 유출할 수 없으며 유출로 인한 책임은 응시자 본인에게 있습니다.

import warnings
warnings.filterwarnings(action='ignore')

1. scikit-learn 패키지는 머신러닝 교육을 위한 최고의 파이썬 패키지입니다.

scikit-learn를 별칭(alias) sk로 임포트하는 코드를 작성하고 실행하세요.

# 여기에 답안코드를 작성하세요.
import sklearn as sk 

2. Pandas는 데이터 분석을 위해 널리 사용되는 파이썬 라이브러리입니다.

Pandas를 사용할 수 있도록 별칭(alias)을 pd로 해서 불러오세요.

# 여기에 답안코드를 작성하세요.
import pandas as pd 

3. 모델링을 위해 분석 및 처리할 데이터 파일을 읽어오려고 합니다.

Pandas함수로 데이터 파일을 읽어 데이터프레임 변수명 df에 할당하는 코드를 작성하세요.

path = 'https://raw.githubusercontent.com/khw11044/csv_dataset/master/A0007IT.json'
df = pd.read_json(path)
df.head()

Time_Departure Time_Arrival Distance Time_Driving Speed_Per_Hour Address1 Address2 Signaltype Weekday Hour Day
0 35:21.0 55:22.6 12914.0 1201.534058 38.692536 경기도 광명시 7 0 5 20
1 55:22.0 09:06.9 7483.0 823.817017 32.699980 서울특별시 영등포구 31 0 5 20
2 13:46.0 22:32.9 8087.0 526.710998 55.273575 경기도 김포시 6 0 0 20
3 13:43.0 28:42.7 10528.0 898.581970 42.178456 경기도 광주시 2 0 0 20
4 01:57.0 17:58.2 10636.0 957.758972 39.978326 경기도 안산시 상록구 28 0 0 20

4. Address1(주소1)에 대한 분포도를 알아 보려고 합니다.

Address1(주소1)에 대해 countplot그래프로 만들고 아래 가이드에 따라 답하세요.

  • Seaborn을 활용하세요.

  • 첫번째, Address1(주소1)에 대해서 분포를 보여주는 countplot그래프 그리세요.

  • 두번째, 지역명이 없는 '-'에 해당되는 row(행)을 삭제하세요.

  • 세번째, 그래프를 보고 해석한 것으로 옳지 않은 선택지를 아래에서 골라 '답안04' 변수에 저장하세요 (예. 답안04=3)

    1. Countplot 그래프에서 Address1(주소1) 분포를 확인시 '경기도' 분포가 제일 크다

    2. Address1(주소1) 분포를 보면 '인천광역시' 보다 '서울특별시'가 더 크다

    3. 지역명이 없는 '-'에 해당되는 row(행)가 2개 있다.

# 여기에 답안코드를 작성하세요.
import seaborn as sns 
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = 'Malgun Gothic'
# 여기에 답안코드를 작성하세요.
# 첫번째, Address1(주소1)에 대해서 분포를 보여주는 countplot그래프 그리세요.

sns.countplot(x='Address1', data=df)
plt.show()
# 두번째, 지역명이 없는 '-'에 해당되는 row(행)을 삭제하세요.
idx = df[df['Address1']=='-'].index
df.drop(idx, axis=0, inplace=True) #또는 df = df.drop(idx, axis=0)
# 또는 df = df[df['Address1]!='-']
# 세번째, 그래프를 보고 해석한 것으로 옳지 않은 선택지를 아래에서 골라 '답안04' 변수에 저장하세요 (예. 답안04=3)
print(len(idx))
답안04=3
90

5. 실주행시간과 평균시속의 분포를 같이 확인하려고 합니다.

Time_Driving(실주행시간)과 Speed_Per_Hour(평균시속)을 jointplot 그래프로 만드세요.

  • Seaborn을 활용하세요.

  • X축에는 Time_Driving(실주행시간)을 표시하고 Y축에는 Speed_Per_Hour(평균시속)을 표시하세요.

# 여기에 답안코드를 작성하세요.

import seaborn as sns
import matplotlib.pyplot as plt
import scipy.stats as st

graph = sns.jointplot(x=df['Time_Driving'], y=df['Speed_Per_Hour'], kind='scatter')
graph.set_axis_labels(xlabel='Time_Driving(실주행시간)', ylabel='Speed_Per_Hour(평균시속)')
plt.show()

6. 위의 jointplot 그래프에서 시속 300이 넘는 이상치를 발견할 수 있습니다.

jointplot 그래프에서 발견한 이상치 1개를 삭제하세요.

  • 대상 데이터프레임: df

  • jointplot 그래프를 보고 시속 300 이상되는 이상치를 찾아 해당 행(Row)을 삭제하세요.

  • 전처리 반영 후에 새로운 데이터프레임 변수명 df_temp에 저장하세요.

# 여기에 답안코드를 작성하세요.

df_temp = df[df['Speed_Per_Hour']<300]

7. 모델링 성능을 제대로 얻기 위해서 결측치 처리는 필수입니다.

아래 가이드를 따라 결측치 처리하세요.

  • 대상 데이터프레임: df_temp

  • 결측치를 확인하는 코드를 작성하세요.

  • 결측치가 있는 행(raw)를 삭제 하세요.

  • 전처리 반영된 결과를 새로운 데이터프레임 변수명 df_na에 저장하세요.

# 여기에 답안코드를 작성하세요.
print(df_temp.isnull().sum())
print('---'*10)
df_na = df_temp.dropna(axis=0)  # 행은 axis=0

print(df_na.isnull().sum())
Time_Departure    0
Time_Arrival      0
Distance          2
Time_Driving      3
Speed_Per_Hour    0
Address1          0
Address2          0
Signaltype        0
Weekday           0
Hour              0
Day               0
dtype: int64
------------------------------
Time_Departure    0
Time_Arrival      0
Distance          0
Time_Driving      0
Speed_Per_Hour    0
Address1          0
Address2          0
Signaltype        0
Weekday           0
Hour              0
Day               0
dtype: int64

8. 모델링 성능을 제대로 얻기 위해서 불필요한 변수는 삭제해야 합니다.

아래 가이드를 따라 불필요 데이터를 삭제 처리하세요.

  • 대상 데이터프레임: df_na

  • 'Time_Departure', 'Time_Arrival' 2개 컬럼을 삭제하세요.

  • 전처리 반영된 결과를 새로운 데이터프레임 변수명 df_del에 저장하세요.

df_del = df_na.drop(['Time_Departure', 'Time_Arrival'], axis=1)
df_del.head()

Distance Time_Driving Speed_Per_Hour Address1 Address2 Signaltype Weekday Hour Day
0 12914.0 1201.534058 38.692536 경기도 광명시 7 0 5 20
1 7483.0 823.817017 32.699980 서울특별시 영등포구 31 0 5 20
2 8087.0 526.710998 55.273575 경기도 김포시 6 0 0 20
3 10528.0 898.581970 42.178456 경기도 광주시 2 0 0 20
4 10636.0 957.758972 39.978326 경기도 안산시 상록구 28 0 0 20

9. 원-핫 인코딩(One-hot encoding)은 범주형 변수를 1과 0의 이진형 벡터로 변환하기 위하여 사용하는 방법입니다.

원-핫 인코딩으로 아래 조건에 해당하는 컬럼 데이터를 변환하세요.

  • 대상 데이터프레임: df_del

  • 원-핫 인코딩 대상: object 타입의 전체 컬럼

  • 활용 함수: pandas의 get_dummies

  • 해당 전처리가 반영된 결과를 데이터프레임 변수 df_preset에 저장해 주세요.

obj_cols = list(df_del.columns[df_del.dtypes=='object'])
df_preset = pd.get_dummies(df_del, columns=obj_cols, drop_first=True, dtype=int)    # drop_first는 해당 컬럼 제거 
df_preset.head()

Distance Time_Driving Speed_Per_Hour Signaltype Weekday Hour Day Address1_경기도 Address1_서울특별시 Address1_인천광역시 ... Address2_중구 Address2_중랑구 Address2_진천군 Address2_철원군 Address2_파주시 Address2_평택시 Address2_포천시 Address2_하남시 Address2_홍천군 Address2_화성시
0 12914.0 1201.534058 38.692536 7 0 5 20 1 0 0 ... 0 0 0 0 0 0 0 0 0 0
1 7483.0 823.817017 32.699980 31 0 5 20 0 1 0 ... 0 0 0 0 0 0 0 0 0 0
2 8087.0 526.710998 55.273575 6 0 0 20 1 0 0 ... 0 0 0 0 0 0 0 0 0 0
3 10528.0 898.581970 42.178456 2 0 0 20 1 0 0 ... 0 0 0 0 0 0 0 0 0 0
4 10636.0 957.758972 39.978326 28 0 0 20 1 0 0 ... 0 0 0 0 0 0 0 0 0 0

5 rows × 88 columns

10. 훈련과 검증 각각에 사용할 데이터셋을 분리하려고 합니다.

Time_Driving(실주행시간) 컬럼을 label값 y로, 나머지 컬럼을 feature값 X로 할당한 후 훈련데이터셋과 검증데이터셋으로 분리하세요.

  • 대상 데이터프레임: df_preset

  • 훈련과 검증 데이터셋 분리

    • 훈련 데이터셋 label: y_train, 훈련 데이터셋 Feature: X_train

    • 검증 데이터셋 label: y_valid, 검증 데이터셋 Feature: X_valid

    • 훈련 데이터셋과 검증데이터셋 비율은 80:20

    • random_state: 42

    • Scikit-learn의 train_test_split 함수를 활용하세요.

  • 스케일링 수행

    • sklearn.preprocessing의 MinMaxScaler 함수 사용

    • 훈련데이터셋의 Feature는 MinMaxScaler의 fit_transform 함수를 활용하여 X_train 변수로 할당

    • 검증데이터셋의 Feature는 MinMaxScaler의 transform 함수를 활용하여 X_valid 변수로 할당

# 여기에 답안코드를 작성하세요.
from sklearn.model_selection import train_test_split

target = 'Time_Driving'

x = df_preset.drop(target, axis=1)
y = df_preset[target]

X_train, X_valid, y_train, y_valid = train_test_split(x,y, test_size=0.2, random_state=42)
print(X_train.shape, X_valid.shape, y_train.shape, y_valid.shape)
(44344, 87) (11087, 87) (44344,) (11087,)
from sklearn.preprocessing import MinMaxScaler, StandardScaler, RobustScaler

scaler = MinMaxScaler()
X_train = scaler.fit_transform(X_train)
X_valid = scaler.transform(X_valid)

11. Time_Driving(실주행시간)을 예측하는 머신러닝 모델을 만들려고 합니다.

아래 가이드에 따라 다음 모델을 만들고 학습을 진행하세요.

  • 의사결정나무(Decisiontree)

    • 트리의 최대 깊이: 5로 설정

    • 노드를 분할하기 위한 최소한의 샘플 데이터 수(min_sample_split): 3으로 설정

    • random_state: 120으로 설정

    • 의사결정나무(decision tree) 모델을 dt 변수에 저장해주세요.

  • 랜덤포레스트(RandomForest)

    • 트리의 최대 깊이: 5로 설정

    • 노드를 분할하기 위한 최소한의 샘플 데이터 수(min_sample_split): 3으로 설정

    • random_state: 120으로 설정

    • 랜덤포레스트(RandomForest) 모델을 rf 변수에 저장해주세요.

  • 선형회쉬(LinearRegression)

    • 선형회쉬(LinearRegression)모델을 lr 변수에 저장해주세요.
  • K최근접(KNeighborsRegressor)

    • 가장 가까운 이웃의 'K'개의 값(n_neighbors): 5로 설정

    • weights를 'distance'로 설정 # distance와 uniform이 있음

    • K최근접(KNeighborsRegressor)모델을 kr 변수에 저장해주세요.

from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
from sklearn.linear_model import LinearRegression
from sklearn.neighbors import KNeighborsRegressor
from xgboost import XGBRegressor
from lightgbm import LGBMRegressor
dt = DecisionTreeRegressor(max_depth=5, min_samples_split=3, random_state=120)
rf = RandomForestRegressor(max_depth=5, min_samples_split=3, random_state=120)
lr = LinearRegression()
kr = KNeighborsRegressor(n_neighbors=5, weights='distance')

# XGBRegressor(max_depth=5, random_state=120)
# LGBMRegressor(random_state=120,verbose=-1)
dt.fit(X_train, y_train)
rf.fit(X_train, y_train)
lr.fit(X_train, y_train)
kr.fit(X_train, y_train)
KNeighborsRegressor(weights='distance')
In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.

12. 위 모델들의 성능을 평가하려고 합니다.

예측 결과의 mae(Mean Absolute Error)를 구하세요.

  • 성능 평가는 검증 데이터셋 (X_valid, y_valid)을 활용하세요.

  • 의사결정나무(Decisiontree) 모델

    • 11번 문제에서 만든 의사결정나무(decision tree) 모델로 y값을 예측(predict)하여 y_pred_dt에 저장하세요.

    • 검증 정답(y_valid)과 예측값(y_pred_dt)의 mae(Mean Absolute Error)를 구하고 dt_mae 변수에 저장하세요.

  • 랜덤포레스트(RandomForest) 모델

    • 11번 문제에서 만든 랜덤포레스트(RandomForest) 모델로 y값을 예측(predict)하여 y_pred_rf에 저장하세요.

    • 검증 정답(y_valid)과 예측값(y_pred_rf)의 mae(Mean Absolute Error)를 구하고 rf_mae 변수에 저장하세요.

  • 선형회쉬(LinearRegression) 모델

    • 11번 문제에서 만든 선형회쉬(LinearRegression) 모델로 y값을 예측(predict)하여 y_pred_lr에 저장하세요.

    • 검증 정답(y_valid)과 예측값(y_pred_lr)의 mae(Mean Absolute Error)를 구하고 lr_mae 변수에 저장하세요.

  • K최근접(KNeighborsRegressor) 모델

    • 11번 문제에서 만든 K최근접(KNeighborsRegressor) 모델로 y값을 예측(predict)하여 y_pred_kr에 저장하세요.

    • 검증 정답(y_valid)과 예측값(y_pred_kr)의 mae(Mean Absolute Error)를 구하고 kr_mae 변수에 저장하세요.

  • 훈련시킨 모델들에 대한 mae 성능평가 결과를 확인하여 가장 성능이 좋은 모델 이름을 답안12 변수에 저장하세요

    • 예. 답안12 = 'Decisiontree' 혹은 'RandomForest' 혹은 'LinearRegression' 혹은 'KNeighborsRegressor'
# 여기에 답안코드를 작성하세요.
from sklearn.metrics import mean_absolute_error

y_pred_dt = dt.predict(X_valid)
dt_mae = mean_absolute_error(y_valid, y_pred_dt)
print('dt MAE:', dt_mae)

y_pred_rf = rf.predict(X_valid)
rf_mae = mean_absolute_error(y_valid, y_pred_rf)
print('rf MAE:', rf_mae)

y_pred_lr = lr.predict(X_valid)
lr_mae = mean_absolute_error(y_valid, y_pred_lr)
print('lr MAE:', lr_mae)

y_pred_kr = kr.predict(X_valid)
kr_mae = mean_absolute_error(y_valid, y_pred_kr)
print('kr MAE:', kr_mae)
dt MAE: 113.87838566407876
rf MAE: 78.29883800097213
lr MAE: 159.31284010745017
kr MAE: 172.76675706558473
답안12 = 'RandomForest'

다음 문항을 풀기 전에 아래 코드를 실행하세요.

import tensorflow as tf
from tensorflow.keras.models import Sequential, load_model
from tensorflow.keras.layers import Dense, Activation, Dropout, BatchNormalization
from tensorflow.keras.callbacks import EarlyStopping, ModelCheckpoint
from tensorflow.keras.utils import to_categorical

tf.random.set_seed(1)

13. Time_Driving(실주행시간)을 예측하는 딥러닝 모델을 만들려고 합니다.

아래 가이드에 따라 모델링하고 학습을 진행하세요.

  • Tensoflow framework를 사용하여 딥러닝 모델을 만드세요.

  • 히든레이어(hidden layer) 2개이상으로 모델을 구성하세요.

  • dropout 비율 0.2로 Dropout 레이어 1개를 추가해 주세요.

  • 손실함수는 MSE(Mean Squared Error)를 사용하세요.

  • 하이퍼파라미터 epochs: 30, batch_size: 16으로 설정해주세요.

  • 각 에포크마다 loss와 metrics 평가하기 위한 데이터로 X_valid, y_valid 사용하세요.

  • 학습정보는 history 변수에 저장해주세요

# 여기에 답안코드를 작성하세요.

model = Sequential()

nfeatures = X_train.shape[1]
model.add(Dense(128, activation='relu', input_shape=(nfeatures,)))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.2))
model.add(Dense(16, activation='relu'))
model.add(Dense(1))

model.compile(optimizer='adam', loss='mse',metrics=['mae','mse'])
# es = EarlyStopping(monitor='val_loss', patience=4, mode='min', verbose=1)    # val_loss

history = model.fit(X_train, y_train, 
                    batch_size=16, 
                    epochs=30, 
                    # callbacks=[es],
                    validation_data=(X_valid, y_valid), 
                    verbose=1).history
Epoch 1/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 3s 806us/step - loss: 309804.2812 - mae: 370.9236 - mse: 309804.2812 - val_loss: 28187.5391 - val_mae: 92.1376 - val_mse: 28189.0566
Epoch 2/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 774us/step - loss: 25147.5566 - mae: 95.7952 - mse: 25147.5566 - val_loss: 8936.3135 - val_mae: 49.2001 - val_mse: 8936.9668
Epoch 3/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 762us/step - loss: 15727.2070 - mae: 80.9302 - mse: 15727.2070 - val_loss: 7153.5986 - val_mae: 49.3776 - val_mse: 7154.1050
Epoch 4/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 766us/step - loss: 13767.8145 - mae: 77.7364 - mse: 13767.8135 - val_loss: 5760.7490 - val_mae: 44.6385 - val_mse: 5761.1294
Epoch 5/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 768us/step - loss: 13224.4385 - mae: 75.8222 - mse: 13224.4385 - val_loss: 5476.8574 - val_mae: 47.4592 - val_mse: 5477.2188
Epoch 6/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 759us/step - loss: 12098.2217 - mae: 73.3539 - mse: 12098.2197 - val_loss: 4449.8999 - val_mae: 42.7461 - val_mse: 4450.1255
Epoch 7/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 776us/step - loss: 11212.9199 - mae: 71.3494 - mse: 11212.9180 - val_loss: 4321.3149 - val_mae: 39.1134 - val_mse: 4321.5962
Epoch 8/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 753us/step - loss: 10579.7598 - mae: 69.2064 - mse: 10579.7588 - val_loss: 3498.8406 - val_mae: 34.0166 - val_mse: 3499.0876
Epoch 9/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 775us/step - loss: 10459.2002 - mae: 68.7206 - mse: 10459.1992 - val_loss: 3115.0286 - val_mae: 32.6045 - val_mse: 3115.2590
Epoch 10/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 762us/step - loss: 10418.4668 - mae: 68.7253 - mse: 10418.4658 - val_loss: 3001.4302 - val_mae: 32.0881 - val_mse: 3001.6226
Epoch 11/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 773us/step - loss: 9562.0977 - mae: 65.9641 - mse: 9562.0977 - val_loss: 2365.8770 - val_mae: 27.8036 - val_mse: 2366.0261
Epoch 12/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 791us/step - loss: 9166.2686 - mae: 64.3275 - mse: 9166.2686 - val_loss: 2371.9211 - val_mae: 27.0647 - val_mse: 2372.0190
Epoch 13/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 764us/step - loss: 8216.6230 - mae: 61.3850 - mse: 8216.6230 - val_loss: 1842.8602 - val_mae: 21.0728 - val_mse: 1842.9597
Epoch 14/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 788us/step - loss: 8452.4033 - mae: 60.9496 - mse: 8452.4023 - val_loss: 2279.6941 - val_mae: 24.5831 - val_mse: 2279.8484
Epoch 15/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 784us/step - loss: 8001.3901 - mae: 59.4719 - mse: 8001.3901 - val_loss: 2166.8506 - val_mae: 27.6121 - val_mse: 2166.9995
Epoch 16/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 768us/step - loss: 7817.8589 - mae: 58.3812 - mse: 7817.8594 - val_loss: 2465.0615 - val_mae: 26.9165 - val_mse: 2465.2393
Epoch 17/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 768us/step - loss: 7617.8843 - mae: 58.1945 - mse: 7617.8848 - val_loss: 1833.2622 - val_mae: 22.9670 - val_mse: 1833.3771
Epoch 18/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 772us/step - loss: 7508.7886 - mae: 57.7626 - mse: 7508.7891 - val_loss: 2149.5752 - val_mae: 20.5471 - val_mse: 2149.7415
Epoch 19/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 763us/step - loss: 7721.0615 - mae: 57.0431 - mse: 7721.0615 - val_loss: 1790.2987 - val_mae: 20.7300 - val_mse: 1790.4213
Epoch 20/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 776us/step - loss: 6930.5020 - mae: 55.6358 - mse: 6930.5024 - val_loss: 2708.7141 - val_mae: 29.0652 - val_mse: 2708.9194
Epoch 21/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 758us/step - loss: 6974.1709 - mae: 55.2576 - mse: 6974.1709 - val_loss: 1705.5804 - val_mae: 18.3324 - val_mse: 1705.7006
Epoch 22/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 769us/step - loss: 6701.1748 - mae: 53.9437 - mse: 6701.1733 - val_loss: 1604.7039 - val_mae: 20.4941 - val_mse: 1604.8168
Epoch 23/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 768us/step - loss: 6427.9316 - mae: 52.9212 - mse: 6427.9316 - val_loss: 1599.0403 - val_mae: 18.6172 - val_mse: 1599.1486
Epoch 24/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 763us/step - loss: 6641.4287 - mae: 52.4476 - mse: 6641.4292 - val_loss: 1490.2405 - val_mae: 19.6476 - val_mse: 1490.3562
Epoch 25/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 763us/step - loss: 6403.9883 - mae: 50.9056 - mse: 6403.9883 - val_loss: 2258.5901 - val_mae: 27.6062 - val_mse: 2258.7112
Epoch 26/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 764us/step - loss: 6098.6777 - mae: 50.7176 - mse: 6098.6777 - val_loss: 1591.2561 - val_mae: 23.9564 - val_mse: 1591.3228
Epoch 27/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 766us/step - loss: 5871.2803 - mae: 49.2199 - mse: 5871.2798 - val_loss: 1717.0090 - val_mae: 19.1850 - val_mse: 1717.1366
Epoch 28/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 765us/step - loss: 5557.6890 - mae: 48.0485 - mse: 5557.6890 - val_loss: 1434.4492 - val_mae: 21.5791 - val_mse: 1434.5363
Epoch 29/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 760us/step - loss: 5434.4932 - mae: 46.7624 - mse: 5434.4932 - val_loss: 1204.4822 - val_mae: 17.3360 - val_mse: 1204.5559
Epoch 30/30
2772/2772 ━━━━━━━━━━━━━━━━━━━━ 2s 760us/step - loss: 5199.8042 - mae: 45.5365 - mse: 5199.8042 - val_loss: 1854.0695 - val_mae: 25.6789 - val_mse: 1854.1676

14. 위 딥러닝의 성능을 평가하려고 합니다.

Matplotlib 라이브러리를 활용해서 학습 mse와 검증 mse를 그래프로 표기하세요.

  • 1개의 그래프에 학습 loss와 검증 loss 2가지를 모두 표기하세요.

  • 위 2가지 각각의 범례를 'loss'와 'val_loss'로 표기하세요.

  • 그래프의 타이틀은 'Model Loss'로 표기하세요.

  • X축에는 'Epochs'라고 표시하고 Y축에는 "Loss'라고 표기하세요.

  • 1개의 그래프에 학습 mse와 검증 mse 2가지를 모두 표기하세요.

  • 위 2가지 각각의 범례를 'mse'와 'val_mse'로 표기하세요.

  • 그래프의 타이틀은 'Model MSE'로 표기하세요.

  • X축에는 'Epochs'라고 표시하고 Y축에는 "MSE'라고 표기하세요.

  • 위 딥러닝 모델에 대해 검증 정답(y_valid)과 예측값(y_pred_dl)의 mae(Mean Absolute Error)를 구하고 dl_mae 변수에 저장하세요.
# 함수로 만들어서 사용합시다.
def dl_history_plot(history):
    plt.figure(figsize=(16,4))
    plt.subplot(1,2,1)
    plt.plot(history['loss'], label='loss', marker = '.')
    plt.plot(history['val_loss'], label='val_loss', marker = '.')
    plt.ylabel('Loss')
    plt.xlabel('Epochs')
    plt.legend()
    plt.grid()

    plt.subplot(1,2,2)
    plt.plot(history['mse'], label='mse', marker = '.')
    plt.plot(history['val_mse'], label='val_mse', marker = '.')
    plt.ylabel('MSE')
    plt.xlabel('Epochs')
    plt.legend()
    plt.grid()


    plt.show()

dl_history_plot(history)
y_pred_dl = model.predict(X_valid, verbose=1)
dl_mae = mean_absolute_error(y_valid, y_pred_dl)
print('DL MAE:', dl_mae)
347/347 ━━━━━━━━━━━━━━━━━━━━ 0s 599us/step
DL MAE: 25.678871973968597

'Machine Learning' 카테고리의 다른 글

2.이진분류문제_2_대학진학  (0) 2024.06.02
2.이진분류문제_1_타이타닉  (0) 2024.06.02
1.회귀문제_3_따릉이  (0) 2024.06.02
1.회귀문제_2_보스턴  (0) 2024.06.02
1.회귀문제_1_오존  (0) 2024.06.02
Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.