회귀 맛보기

CSH_tech·2023년 9월 8일
0

데이터셋

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')

train, test split

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)

standardization

from sklearn.preprocessing import StandardScaler
ss = StandardScaler()
ss.fit(train_input)
train_scaled = ss.transform(train_input)
test_scaled = ss.transform(test_input)

Linear

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 = 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 = 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

머신러닝 결과

LinearRidgeLasso
Train score0.9830.9830.969
Test score0.9360.9360.894

Lasso의 score 값이 낮게 나온다.

DNN 모델 구현

  • layer는 1개의 층으로 구성했다
  • input 값은 2개의 특성을 가지고 있으므로, input_shape=(2,)
  • 1개의 perceptron
  • Activation function: ReLU
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()

모델 학습

  • optimizer: adam
  • loss: mean_squared_error
  • epoch: 2000
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분에 달린다는 것은 불가능하다는 것을 알 수 있고, 모델들이 이상치 값을 제대로 대처하지 못하고 있다는 사실을 알 수 있다.

profile
개발 초보자

0개의 댓글