time: 분 -> 시간 데이터로 변환
velocity: km/h
distance: km
데이터는 필자의 달리기 기록이다.
time = [30.25, 29.58, 29.55, 29.58, 29.23, 29.47, 29.36, 29.14, 29.19, 29.43, 29.13, 28.53, 28.40, 28.48, 29.26, 28.23, 28.13, 28.56, 27.30, 28.47, 28.46, 28.40, 27.56, 32.51, 28.23, 27.53]
velocity = [9.9, 10.3, 10.1, 10.1, 10.3, 10.2, 10.2, 10.4, 10.4, 10.2, 10.4, 10.5, 10.6, 10.5, 10.3, 10.7, 10.8, 10.5, 11.6, 10.5, 10.5, 10.6, 10.8, 11.0, 10.7, 10.8]
distance = [5.02, 5.13, 5.05, 5.07, 5.06, 5.06, 5.06, 5.07, 5.11, 5.07, 5.09, 5.05, 5.07, 5.08, 5.08, 5.07, 5.08, 5.06, 5.32, 5.03, 5.06, 5.07, 5.07, 6.06, 5.06, 5.05]
time = list(map(lambda x:x/60, time))
import pandas as pd
df = pd.DataFrame(data={'time':time, 'velocity': velocity, 'distance': distance})
print(f'평균 속도: {round(df["velocity"].mean(),3)} km/h')
print(f'평균 시간: {round(df["time"].mean()*60,3)} 분')
print(f'평균 거리: {round(df["distance"].mean(),3)} km')
data = df.loc[:, ['velocity', 'distance']]
target = df.loc[:, 'time']
from sklearn.model_selection import train_test_split
train_input, test_input, train_target, test_target = train_test_split(data, target, test_size=0.1, random_state=42)
from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)
from sklearn.linear_model import LinearRegression, Ridge, Lasso
lr = LinearRegression()
lr.fit(train_scaled, train_target)
print(lr.score(train_scaled, train_target)) # 0.9830353012835237
print(lr.score(test_scaled, test_target)) # 0.9365784355928449
ridge = Ridge(alpha=0.001)
ridge.fit(train_scaled, train_target)
print(ridge.score(train_scaled, train_target)) # 0.9830352947233254
print(ridge.score(test_scaled, test_target)) # 0.9365638050344715
lasso = Lasso(alpha=0.001)
lasso.fit(train_scaled, train_target)
print(lasso.score(train_scaled, train_target)) # 0.9698052319138503
print(lasso.score(test_scaled, test_target)) # 0.8943645663879424
Linear | Ridge | Lasso | |
---|---|---|---|
Train score | 0.983 | 0.983 | 0.969 |
Test score | 0.936 | 0.936 | 0.894 |
Lasso의 score 값이 낮게 나온다.
from tensorflow import keras
import tensorflow
tensorflow.random.set_seed(42)
model = keras.Sequential()
model.add(keras.layers.Dense(1, activation='relu', input_shape=(2,)))
model.summary()
model.compile(optimizer='adam', loss='mse')
model.fit(train_scaled, train_target, epochs=2000)
loss 값이 0.003으로 model의 성능이 굉장히 뛰어나다는 것을 알 있다.
model.evaluate(test_input, test_target) # 0.003601787844672799
표준화된 속도,거리의 평균 및 거리 데이터에 이상치 값(10km)를 추가
mean_velocity = train_scaled.mean(axis=0)[0]
mean_distance = train_scaled.mean(axis=0)[1]
print(mean_velocity, mean_distance)
import numpy as np
arr = np.append(df['distance'].to_numpy(), 10)
std_arr = (arr - np.mean(arr, axis=0)) / np.std(arr, axis=0)
print(std_arr[-1])
# 입력값: [평균 속도: 10.496 km/h, 거리: 10km]
print(f'linear predict: {lr.predict([[mean_velocity, std_arr[-1]]])}')
print(f'ridge predict: {ridge.predict([[mean_velocity, std_arr[-1]]])}')
print(f'lasso predict: {lasso.predict([[mean_velocity, std_arr[-1]]])}')
print(f'tensorflow predict:{model.predict([[mean_velocity, std_arr[-1]]], verbose=0)[0]}')
Linear predict: [34.33335078]
Ridge predict: [34.33293002]
Lasso predict: [33.7596829]
DNN predict:[34.33335]
평균적으로 34분 정도를 예측하고 있는데 첫번 째 데이터를 보면
df.loc[0,:]
time 0.504167(30.25)
velocity 9.900000
distance 5.020000
5.02km를 달리는데 30분이 걸렸다는 것을 알 수 있다.
10km를 34분에 달린다는 것은 불가능하다는 것을 알 수 있고, 모델들이 이상치 값을 제대로 대처하지 못하고 있다는 사실을 알 수 있다.