초봉5센티미터

TIL 23. 머신러닝(회귀) 본문

교육/멋쟁이사자처럼 AI School 7기

TIL 23. 머신러닝(회귀)

삶은돼지고기 2022. 11. 7. 20:10
728x90

파생변수 만들거나 데이터 변형할때는 train데이터와 test데이터 둘다 적용해야함

7:3 이나 8:2 로 나누는 과정은 hold-out-validation 

- cross validation은 속도가 오래걸린다는 단점이 있기도 하지만 validation의 결과에 대한 신뢰가 중요할 때 사용. 예를 들어 사람의 생명을 다루는 암여부를 예측하는 모델을 만든다거나 하면 좀 더 신뢰가 있게 검증을 해야함.

- hold-out-validation 은 한번만 나눠서 학습하고 검증하기 때문에 빠르다는 장점이 있다. 하지만 신뢰가 떨어지는 단점이 있다.  hold-out-validation 은 당장 비즈니스에 적용해야 하는 문제에 빠르게 검증해보고 적용해 보기에 좋다


- 클래스를 예측할 때 True, False로 예측하기도 하지만 멀티클래스 일 때는 특정 클래스의 확률을 예측하기도 한다.
그래서 예시의 측정공식은 logloss라는 공식을 사용다 엔트로피와 비슷하지만 다르다


MAE
- 모델의 예측값과 실제 값 차이의 절대값 평균
- 절대값을 취하기 때문에 가장 직관적임

MSE
- 모델의 예측값과 실제값 차이의 면적의(제곱)합
- 제곱을 하기 때문에 특이치에 민감하다.

RMSE
- MSE에 루트를 씌운 값
- RMSE를 사용하면 지표를 실제 값과 유사한 단위로 다시 변환하는 것이기 때문에 MSE보다 해석이 더 쉽다.
- MAE보다 특이치에 Robust(강하다) 

RMSE: 오차가 클수록 가중치를 주게 됨(오차 제곱의 효과)
RMSLE: 오차가 작을수록 가중치를 주게 됨(로그의 효과)


캐글

도시 자전거 공유 시스템의 사용 예측

 

데이터셋 소개

 

* datetime - hourly date + timestamp
* season -  1 = spring, 2 = summer, 3 = fall, 4 = winter 
* holiday - whether the day is considered a holiday
* workingday - whether the day is neither a weekend nor holiday
* weather - 1: Clear, Few clouds, Partly cloudy, Partly cloudy
 2: Mist + Cloudy, Mist + Broken clouds, Mist + Few clouds, Mist
 3: Light Snow, Light Rain + Thunderstorm + Scattered clouds, Light Rain + Scattered clouds
 4: Heavy Rain + Ice Pallets + Thunderstorm + Mist, Snow + Fog 
* temp - temperature in Celsius
* atemp - "feels like" temperature in Celsius
* humidity - relative humidity
* windspeed - wind speed
* casual - number of non-registered user rentals initiated
* registered - number of registered user rentals initiated
* count - number of total rentals

출처: Bike Sharing Demand | Kaggle

 

라이브러리 로드

import pandas as pd
import numpy as np
import seaborn as sns
import matplotlib.pyplot as plt

데이터셋 로드

  • season 은 계절로 1,2,3,4로 ordinal encoding(순서가 있는 값)으로 인코딩이 되어 있다.
  • weather 는 1이면 맑은 날, 2는 흐린날, 3은 눈,비 오는 날, 4는 폭우, 폭설, 우박 내리는 날
  • temp - 섭씨 기온
  • atemp - 체감온도
train = pd.read_csv("data/bike/train.csv")
test = pd.read_csv("data/bike/test.csv")

결측치 확인

# 결측치 확인
# 결측치가 없다.
train.isnull().sum()
test.isnull().sum()

datetime      0
season        0
holiday       0
workingday    0
weather       0
temp          0
atemp         0
humidity      0
windspeed     0
dtype: int64

 

datetime을 연, 월, 일, 시, 분, 초의 파생변수로 변환하자

# 연,월,일,시,분,초를 피쳐로 사용하기 위해 파생변수 생성
train["datetime"] = pd.to_datetime(train["datetime"])
train["year"] = train["datetime"].dt.year
train["month"] = train["datetime"].dt.year
train["day"] = train["datetime"].dt.day
train["hour"] = train["datetime"].dt.hour
train["minute"] = train["datetime"].dt.minute
train["second"] = train["datetime"].dt.second

test["datetime"] = pd.to_datetime(test["datetime"])
test["year"] = test["datetime"].dt.year
test["month"] = test["datetime"].dt.year
test["day"] = test["datetime"].dt.day
test["hour"] = test["datetime"].dt.hour
test["minute"] = test["datetime"].dt.minute
test["second"] = test["datetime"].dt.second

train데이터에 해준것은 test에도 해줘야함

 

EDA

 

train.hist(figsize = (12,10), bins = 50);

 

test.hist(figsize = (12,10), bins = 50);

train과 test 데이터셋의 분포가 비슷하다는것을 확인할 수 있다. 

 

sns.scatterplot(data = train, x = "windspeed", y = "count")

windspeed는 구하고자하는 값(count)와 상관이 없는것을 확인가능하다.

 

humidity(습도)도 마찬가지로 count와 상관이 있어 보이지 않는다

 

 

 

기온과 체감온도의 관계를 알아보자

sns.scatterplot(data = train, x = "temp", y = "atemp")

 

둘은 높은 상관관계를 가지고 있다 (다중공선성)

그리고 atemp 11~12 구간에서 10개의 값이 잘못 기입된 것으로 예측할 수 있다

 

 

학습, 예측 데이터셋 만들기

# label_name : 정답값
label_name = "count"
label_name

예측하고자 하는 값 

 

# feature_names : 학습, 예측에 사용할 컬럼명(변수)
feature_names  = train.columns.tolist()
feature_names.remove(label_name)
feature_names.remove("datetime")
feature_names.remove("casual")
feature_names.remove("registered")
feature_names.remove("month")
feature_names.remove("day")
feature_names.remove("minute")
feature_names.remove("second")
feature_names.remove("atemp")
feature_names.remove("humidity")
feature_names.remove("windspeed")
feature_names

위의 EDA에서 count와의 상관이 없는 변수들 삭제

 

# 학습(훈련)에 사용할 데이터셋 예) 시험의 기출문제
X_train = train[feature_names]
print(X_train.shape)
X_train.head(2)
# 예측 데이터셋, 예) 실전 시험 문제
X_test = test[feature_names]
print(X_test.shape)
X_test.head(2)
# 학습(훈련)에 사용할 정답값 예) 기출문제의 정답
y_train = train[label_name]
print(y_train.shape)
y_train.head(2)

 

 

머신러닝 알고리즘

 

랜덤포레스트의 회귀를 사용하여 예측해보도록 하겠습니다.

from sklearn.ensemble import RandomForestRegressor

model = RandomForestRegressor(random_state = 42, n_jobs = -1)
model

하이퍼 파라미터는 별다르게 설정하지 않았습니다.

 

 

교차검증

# 모의고사를 풀어서 답을 구하는 과정과 유사합니다.
# cross_val_predict는 예측한 predict의 값을 반환하여 직접 계산해 볼 수 있다.
# 다른 cross_validate, cross_val_score는 스코어를 조각마다 직접 계산하여 반환해 준다.
from sklearn.model_selection import cross_val_predict


y_valid_pred = cross_val_predict(model, X_train, y_train, cv = 5, n_jobs = -1, verbose = 2)
y_valid_pred

 

평가하기(RMLSE)

from sklearn.metrics import mean_squared_log_error
rmlse = mean_squared_log_error(y_train, y_valid_pred) ** 0.5
rmlse

0.5101068831223765

 

 

학습과 예측

y_predict = model.fit(X_train,y_train).predict(X_test)
# 피처의 중요도
sns.barplot(x = model.feature_importances_, y = model.feature_names_in_)

* 본글은 멋쟁이사자처럼 ai 스쿨의 강의 내용과 자료를 참고하여 제작하였습니다.

Comments