1. bike 데이터셋
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
bike_df = pd.read_csv('/content/drive/MyDrive/머신러닝과 딥러닝/data/bike.csv')
bike_df
- 이전 데이터셋과 마찬가지로 필요한 모듈들을 import 해줍니다
sns.scatterplot(x='feels_like', y='count', data=bike_df, alpha=0.3)
- 이 코드는 Seaborn 라이브러리를 사용하여 산점도를 그리는 코드입니다
- sns.scatterplot() 를 통해 그래프에 데이터를 점으로 찍어서 시각화 할 수 있습니다
bike_df=bike_df.fillna(0)
- 데이터프레임 내에 있는 결측값을 0으로 변환해 줍니다
bike_df['year'] = bike_df['datetime'].dt.year
bike_df['month'] = bike_df['datetime'].dt.month
bike_df['hour'] = bike_df['datetime'].dt.hour
- 이후 데이터분석에 필요한 새로운 컬럼을 생성해서 데이터프레임에 넣어줍니다
bike_df['date'] = bike_df['datetime'].dt.date
bike_df.head()
- 'datetime' 컬럼은 object 타입 이기때문에 학습에 용이하게끔 하기위해 datetime 형태의 컬럼 'date' 를 만들어 줍니다
- 이후 다양한 과정을 통해 데이터를 정제해 줍니다
# date 컬럼을 바탕으로 함수를 이용해 기간에 맞는 데이터로 변경
def covid(date):
if str(date) < '2020-04-01':
return 'precovid'
elif str(date) < '2021-04-01':
return 'covid'
else:
return 'postcovid'
# 위의 함수를 바탕으로 covid 컬럼을 생성
bike_df['covid'] = bike_df['date'].apply(covid)
# month 컬럼을 바탕으로 함수를 이용해 지정한 변수에 맞는 데이터로 변경
winter = 12,1,2
spring = 3,4,5
summer = 6,7,8
fall = 9.10,11
def season(month):
if month in winter:
return 'winter'
elif month in spring:
return 'spring'
elif month in summer:
return 'summer'
elif month in fall:
return 'fall'
# 위의 함수를 바탕으로 season 컬럼을 생성
bike_df['season'] = bike_df['month'].apply(season)
# hour 컬럼을 바탕으로 함수를 이용해 지정한 변수에 맞는 데이터로 변경
night = 21,22,23,0,1,2,3,4
def day_night(hour):
if hour >= 5 and hour < 11:
return 'early morning'
elif hour >= 11 and hour < 13:
return 'late morning'
elif hour >= 13 and hour < 16:
return 'early afternoon'
elif hour >= 16 and hour < 17:
return 'late afternoon'
elif hour >= 17 and hour < 19:
return 'early evening'
elif hour >= 19 and hour < 21:
return 'late evening'
elif hour in night:
return 'night'
# 위의 함수를 바탕으로 day_night 컬럼을 생성
bike_df['day_night'] = bike_df['hour'].apply(day_night)
# 데이터 정제 후 기존의 컬럼들을 삭제
bike_df.drop(['datetime','month','date','hour'],axis=1, inplace=True)
bike_df.head()
# 원-핫-인코딩 진행
bike_df = pd.get_dummies(bike_df, columns=['weather_main','covid','season','day_night'])
bike_df.head()
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(bike_df.drop('count', axis=1), bike_df['count'], test_size=0.2, random_state=2023)
- 이렇게 데이터 정제가 완료되었으면 학습하고자 하는 변수들을 설정해서 학습을 진행해줍니다
- 종속변수는 count 컬럼, 독립변수는 count 컬럼을 제외한 나머지 컬럼으로 설정해 주고 비율을 8:2로 설정한 뒤 학습을 진행합니다
2. 의사 결정 나무(Decision Tree)
- 데이터를 분석하고 패턴을 파악하여 결정 규칙을 나무 주고로 나타낸 기계학습 알고리즘
- 간단하고 강력한 모델 중 하나로, 분류와 회귀 문제에 모두 사용
- 지니계수(지니 불순도, Gini Impurity) : 분류 문제에서 특정 노드의 불순도를 나타내는데 노드가 포함하는 클래스들이 혼잡되어 있는 정도를 나타냄
- 0에서 1까지의 값을 가지며, 0에 가까울 수록 노드의 값이 불순도가 없음을 의미
- 로그 연산이 없어 계산이 상대적으로 빠름
- 엔트로피 : 어떤 집합이나 데이터의 불확실성, 혼잡도를 나타내는데, 노드의 불순도를 측정하는데 활용
- 0에서 무한대까지의 값을 가지며 0에 가까울수록 노드의 값이 불순도가 없음을 의미
- 로그 연산이 포함되어 있어 계산이 복잡
- 오버피팅(과적합) : 학습데이터에서는 정확하나 테스트데이터에서는 성과가 나쁜 현상을 말함. 의사 결정 나무는 오버피팅이 매우 잘 일어남
- 오버피팅을 방지하는 방법
- 사후 가지치기 : 나무를 끝까지 돌린 후 밑에서부터 가지를 쳐나가는 방법
- 사전 가지치기 : 나무가 다 자라기 전에 알고리즘을 멈추는 방법
- 오버피팅을 방지하는 방법
from sklearn.tree import DecisionTreeRegressor
dtr = DecisionTreeRegressor(random_state=2023)
dtr.fit(X_train,y_train)
pred1 = dtr.predict(X_test)
- 학습을 하기 위해 회귀를 위한 함수를 import 해줍니다 이후 위에서 나누었던 데이터를 fit 을통해 학습 시켜준뒤 predict를 통해 나온 학습 결과값을 pred1의 변수에 넣어줍니다
from sklearn.metrics import mean_squared_error
mean_squared_error(y_test, pred1, squared=False)
- 이후 실제 결과와 학습 결과를 mean_squared_error를 통해 차이를 비교해 줍니다
3. 선형 회귀 vs 의사 결정 나무
from sklearn.linear_model import LinearRegression
lr = LinearRegression()
lr.fit(X_train, y_train)
pred2 = lr.predict(X_test)
mean_squared_error(y_test, pred2, squared=False)
# 의사 결정 나무 : 222.90547303762153
# 선형 회귀 : 224.5257704711731
222.90547303762153 - 224.5257704711731
# 값이 적을 수록 좋음, 이 데이터에서는 의사 결정 나무가 더 좋은 모듈
- 이전에 배웠던 LinearRegression 과 비교해봐도 DecisionTreeRegressor 가 지금 현재 데이터에서는 더 적합한 모듈이라는 것을 알수 있습니다
dtr = DecisionTreeRegressor(random_state=2023, max_depth=50, min_samples_leaf=30)
dtr.fit(X_train, y_train)
pred3 = dtr.predict(X_test)
mean_squared_error(y_test, pred3, squared=False)
# 의사 결정 나무 : 222.90547303762153
# 의사 결정나무(하이퍼 파라미터 튜닝) : 186.56448037541028
186.56448037541028 - 222.90547303762153
# 하이퍼 파라미터 튜닝을 통해 더 성능을 향상 시킨걸 볼 수 있음
4. DecisionTreeRegressor 의 구조