์์ํ๋ฉฐ
๋ฌด๋ ค 6๋
์ ์ Kaggle ๋ํ๋ก ์ฌ๋ผ์จ ์์ ๊ฑฐ ์์ ์์ธก ํ๋ก์ ํธ!
๋ฐ์ดํฐ ๋ถ์ ์ญ๋ ํ
์คํธ๋ฅผ ๋๋นํ๊ธฐ ์ํด ๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ Kaggle ๋ํ ๋ถํฐ ์ฐ์ตํด๋ณด๊ธฐ๋ก ํ๋ค.
๋์ ์ด๋ฌํ ์ฐ์ต์ด ์ข๊ฒ ์์ฉํ์ฌ ์ฝํ
์ ๊ผญ ํฉ๊ฒฉํ๊ธธ ๋ฐ๋ผ๋ฉด์ ์์ํ๋ ๊ณต๋ถ๋ฆฌ๋ทฐ start ~ !
1. ํ๋ก์ ํธ ์ค๋ช
www.kaggle.com/c/bike-sharing-demand/
์์ฑํด D.C ์ Capital Bikeshare ํ๋ก๊ทธ๋จ์์ ์์ ๊ฑฐ ๋์ฌ ์์๋ฅผ ์์ธกํ๊ธฐ ์ํ ํ๋ก์ ํธ์ด๋ค. ๊ณผ๊ฑฐ ์ฌ์ฉ ํจํด์ ๋ ์จ ๋ฐ์ดํฐ์ ๊ฒฐํฉํ์ฌ ์์ ์์ธก์ ์ํํด ๋ณธ๋ค.
2. ํ๋ก์ ํธ ๋ชฉํ
ํน์ ์๊ฐ๋์ ์ผ๋ง๋ ๋ง์ ์ฌ๋๋ค์ด ์์ ๊ฑฐ๋ฅผ ๋์ฌํ๋์ง ์์ธกํ๋ค.
3. ๋ฐ์ดํฐ ์ค๋ช
train.csv / test.csv / SampleSubmission.csv ์ธ ๊ฐ์ง์ ํ์ผ์ด ์ฃผ์ด์ง๋ค. train์ ๋ง๊ทธ๋๋ก ํ์ต๋ฐ์ดํฐ, test ๋ฐ์ดํฐ, ๊ทธ๋ฆฌ๊ณ ์ต์ข ์ ์ถ ํ์์ด ๋ด๊ฒจ์๋ Sample ํ์ผ์ด๋ค.
๋ฐ์ดํฐ๋ ์๋์ ๊ฐ์ด ์ฃผ์ด์ง๋ค.
Columns ๋ช | ๋ฐ์ดํฐ ๋ด์ฉ |
Datetime | ์๊ฐ (YYYY-MM-DD 00:00:00) |
Season | ๋ด(1) ์ฌ๋ฆ(2) ๊ฐ์(3) ๊ฒจ์ธ(4) |
Holiday | ๊ณตํด์ผ(1) ๊ทธ์ธ(0) |
Workingday | ๊ทผ๋ฌด์ผ(1) ๊ทธ์ธ(0) |
Weather | ์์ฃผ๊นจ๋ํ๋ ์จ(1) ์ฝ๊ฐ์ ์๊ฐ์ ๊ตฌ๋ฆ(2) ์ฝ๊ฐ์ ๋,๋น(3) ์์ฃผ๋ง์๋น์ ์ฐ๋ฐ(4) |
Temp | ์จ๋(์ญ์จ๋ก ์ฃผ์ด์ง) |
Atemp | ์ฒด๊ฐ์จ๋(์ญ์จ๋ก ์ฃผ์ด์ง) |
Humidity | ์ต๋ |
Windspeed | ํ์ |
Casual | ๋นํ์์ ์์ ๊ฑฐ ๋์ฌ๋ |
Registered | ํ์์ ์์ ๊ฑฐ ๋์ฌ๋ |
Count | ์ด ์์ ๊ฑฐ ๋์ฌ๋ (๋นํ์+ํ์) |
4. Library Import / Data Check
4.1 Library Import
์ฐ์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํ๊ธฐ ์ํ Library๋ฅผ import ํด์ค๋ค.
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
import datetime as dt
import scipy
4.2 Data ๋ถ๋ฌ์ค๊ธฐ
train ๋ฐ์ดํฐ์ test ๋ฐ์ดํฐ๋ฅผ ๋ถ๋ฌ์จ๋ค.
train = pd.read_csv("tain.csv")
test = pd.read_csv("test.csv")
submission = pd.read_csv("SampleSubmission.csv")
4.3 ๋ฐ์ดํฐ ํ์ธ
์ด์ ๋ฐ์ดํฐ์ ์๊น์๋ฅผ ์ดํด๋ณด์.
train.columns
test.columns
train ๊ณผ test ์ ์ปฌ๋ผ์ ์ฐจ์ด๊ฐ ๋ณด์ธ๋ค. train ๋ฐ์ดํฐ์ casual, registered, count ๋ณ์๊ฐ ์์ง๋ง, test ๋ณ์์๋ ์๋ค. ๋ฐ๋ผ์ ์ฐ๋ฆฌ๊ฐ ์์ธกํด์ผํ ๋ณ์๋ Count๋ผ๊ณ ์ ์ ์๋ค. (Count ๋ณ์ = Casual + Registered ๋ผ๊ณ ๋ช ์๋์ด ์์๊ธฐ ๋๋ฌธ์ ์ต์ข ์ ์ธ ๊ฒฐ๊ณผ๊ฐ์ ๋ณด์ ํ Count ๊ฐ ์ฐ์์ ์ ์์์๋น)
train.head()
test.head()
submission.head()
train data ์ test data ๋ ์์ ๊ฐ์ด ์๊ฒผ๊ณ , submission์ ์๋์ฒ๋ผ ์๊ฒผ๋ค. sample submission์์ ๋ณด์ด๋ฏ count๋ฅผ ์์ธกํ๋ฉด๋๋ค๊ณ Label์ ๋กํ๋ ๋ช ์ํด์ค๋ค~
๋ฐ์ดํฐ์ datetime์ ๋ ์ง๋ก ์ธ์ํด์ฃผ๊ธฐ ์ํด์ ํ๊ฐ์ง์ ๊ณผ์ ์ ๊ฑฐ์ณค๋ค. pandas์ to_datetime ์ ํ์ฉํ์ฌ datetime ์ปฌ๋ผ์ ๋ ์ง๋ก ์ธ์ํ๊ฒ๋ ํํ๋ฅผ ๋ฐ๊พธ์ด ์ฃผ์๋ค.
train['datetime'] = pd.to_datetime(train['datetime'])
test['datetime'] = pd.to_datetime(test['datetime'])
info()๋ฅผ ์ถ๋ ฅํด๋ณด๋, datetime ํํ๋ก ์ ๋ฐ๋์๊ณ , ๋๋จธ์ง ๋ฐ์ดํฐ๋ค์ ํํ๋ ํ์ธ์ด ๊ฐ๋ฅํ๋ค. ๋๋จธ์ง ๋ณ์๋ ์ ๋ถ ์ ์ ํน์ float ํํ๋ก ๊ตฌ์ฑ๋์ด์๋ ๊ฒ์ ๋ณผ ์์๋ค.
ํนํ weather, season ๋ฑ๊ณผ ๊ฐ์ด ๋๋ถ๋ถ์ ๋ณ์๋ '์ฐ์'์ ์๋ฏธํ๋ ์ซ์๊ฐ ์๋ '๊ทธ๋ ๋ค, ์๋๋ค'๋ฅผ ์๋ฏธํ๋ ๋ฒ์ฃผํ ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ์ถํ ํ ๋ณํ์ด ํ์ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๋ค.
train.info()
test.info()
์ด์ ๋ฐ์ดํฐ์ shape์ ํ์ธํด ๋ณด๊ฒ ๋ค.
print(train.shape)
print(test.shape)
-- ๊ฒฐ๊ณผ
# (10886 12)
# (6493, 9)
4.4 ๋ฐ์ดํฐ EDA ์งํ
์์ ๋ฐ์ดํฐ์ shape, dtype ๋ฑ์ ์ดํด๋ณด์๋ค. ์ด๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ์ฐจ๊ทผ์ฐจ๊ทผ EDA๋ฅผ ์งํํด๋ณด๋ ค๊ณ ํ๋ค. ๋ฐ์ดํฐ๋ฅผ ์๊ฐํ ํด๋ณต๋ณด๊ณ , null ๊ฐ์ ์ฒ๋ฆฌํ๋ ๋ฑ ๋ชจ๋ธ๋ง์ ์ํ ์ฌ์ ์ค๋น๋ฅผ ์์ํด๋ณด๊ฒ ๋ค.
4.4.1 ๊ธฐ์ค๋ณ ์์ ๊ฑฐ ์์๋ ํ์ธํด๋ณด๊ธฐ (์๊ฐํ)
ํ์ฌ ๋ฐ์ดํฐ ๋ ์ง๋ yyyy-mm-dd 00:00:00 ํํ์ด๋ค. ์ด๋ฅผ ๋ ,์,์ผ,์,๋ถ,์ด๋ก ๋๋์ด ์ฐ๋๋ณ, ์๋ณ.... ์ ์์ ๊ฑฐ ์์๋์ด ์ด๋ป๊ฒ ๋ณํํ๋์ง ์ฐ์ ์ ์ผ๋ก ํ์ธํด๋ณด๊ฒ ๋ค.
์ฃผ ๋จ์๋ก๋ ํ์ธํด๋ณด๊ธฐ์ํด datetime ํจํค์ง์์ ์ง์ํ๋ dayofweek๋ ์ถ๋ ฅํด๋ณด์๋ค.
train['year'] = train['datetime'].dt.year
train['month'] = train['datetime'].dt.month
train['day'] = train['datetime'].dt.day
train['hour'] = train['datetime'].dt.hour
train['minute'] = train['datetime'].dt.minute
train['second'] = train['datetime'].dt.second
# dayofweek ๋ ์์ผ์ ๊ฐ์ ธ์ค๋ ๋ง
#์(0) ํ(1) ์(2) ๋ชฉ(3) ๊ธ(4) ํ (5) ์ผ(6)
train['dayofweek'] = train['datetime'].dt.dayofweek
test['year'] = test['datetime'].dt.year
test['month'] = test['datetime'].dt.month
test['day'] = test['datetime'].dt.day
test['hour'] = test['datetime'].dt.hour
test['minute'] = test['datetime'].dt.minute
test['second'] = test['datetime'].dt.second
# dayofweek ๋ ์์ผ์ ๊ฐ์ ธ์ค๋ ๋ง
#์(0) ํ(1) ์(2) ๋ชฉ(3) ๊ธ(4) ํ (5) ์ผ(6)
test['dayofweek'] = test['datetime'].dt.dayofweek
(1) year ๋ณ ์์ ๊ฑฐ ์์๋
sns.barplot(data = train, x = 'year', y = 'count')
- ๋ ๋๊ฐ ์ฆ๊ฐํจ์ ๋ฐ๋ผ ๊ฐ์๊ธฐ ์์๋์ด ์ฆ๊ฐํ๋ค. ํ์ง๋ง ๋จ ๋๊ฐ์ year๋ง ์กด์ฌํ๊ธฐ ๋๋ฌธ์ ์ง์์ ์ผ๋ก ์์๊ฐ ์ฆ๊ฐํ๋์ง์ ๋ํ ์ฌ๋ถ๋ ์ ์ ์๊ณ , ๋จ์ง ํด๋น ์์ ๊ฑฐ ๋์ฌ ํ์ฌ๊ฐ ์ฑ์ฅํ๋ค or ์์ ๊ฑฐ ์์๊ฐ ๋์๋ค. ๊น์ง๋ง ์ ์ ์๋ค.
- 2012๋ ์ ๊ฐ์๊ธฐ ์์ ๊ฑฐ๊ฐ ๋์ ํํด์ , 2013๋ ์๋ ์ค์ด๋ค์๋,,, ๋์ด๋ ์๋ ์๋ค๋ ๊ฒ!
- ์ด์ฉ๋ ์ฃผ์ด์ง ๋ฐ์ดํฐ ๋ด์์๋ ๋ถ๋ช ํ ๋ ๋๋ณ๋ก ์์๋์ ์ฐจ์ด๊ฐ ์กด์ฌํจ์ ์ ์ ์๋ค. ๋ฐ๋ผ์ ์์ธกํ๋๋ฐ year๋ณ์๋ฅผ ์ฌ์ฉํ ์๋ ์๊ฒ ๋ค.
(2) month ๋ณ ์์ ๊ฑฐ ์์๋
sns.barplot(data = train, x = 'month', y = 'count')
- ๋น๊ต์ 12, 1, 2์์ ์์ ๊ฑฐ ์์๋์ด ์ ๋ค
- 6, 7, 8์์ ์์ ๊ฑฐ ์์๋์ด ๊ฐ์ฅ ๋ง์์ ์ ์ ์๋ค. ๋ฐ๋ผ์ month ๋ณ์๋ ์์ธก์ ์ฌ์ฉํ ์ ์๊ฒ ๋ค.
(3) day ๋ณ ์์ ๊ฑฐ ์์๋
sns.barplot(data = train, x = 'day', y = 'count')
- day๋ณ๋ก ์์ ๊ฑฐ ์์๋์ด ๋ฌ๋ผ์ง์ ์ ์์๋ค.
- ํ์ง๋ง ๋ช ๋ฐฑํ ์ฐจ์ด๊ฐ ์๊ธฐ ๋๋ฌธ์ ๋ณ์์์ ์ ๊ฑฐํ๊ฑฐ๋ ์ ๊ฑฐํ์ง ์๊ฑฐ๋์ ๋ํ ์ ํ์ ๋์ค์ ํด๋ณด๊ฒ ๋ค.
(4) season (๊ณ์ ๋ณ)
sns.barplot(data = train, x = 'season', y = 'count')
- ์๋ณ๋ก ์ถ๋ ฅํ์ ๋ ๋ถ๋ช , 12,1,2์(๊ฒจ์ธ)์ ๊ฐ์ฅ ์์๋์ด ์ ์๋๋ฐ, ์ season ๊ทธ๋ํ์๋ ๋ค๋ฅด๊ฒ ๋์๋ค. ๋ฐ๋ผ์ season์ ๋๋๋ ๊ฒฝ๊ณ๊ฐ ๋ค๋ฆ์ ์ ์ ์์๋ค.
print(train[train['season'] == 1].month.unique()
print(train[train['season'] == 2].month.unique()
print(train[train['season'] == 3].month.unique()
print(train[train['season'] == 4].month.unique()
- ์ด์จ๋ ๊ณ์ ์ ๋ฐ๋ผ ์์๋์ ์ฐจ์ด๊ฐ ์กด์ฌํ๊ธฐ์, season๋ ์์ธกํ๋๋ฐ ์ฌ์ฉํ ์ ์๊ฒ ๋ค.
(5) ์๊ฐ๋๋ณ point plot
fig, (ax1) = plt.subplot(1,1)
fig.set_size_inches(20, 5) # ๊ฐ๋ก,์ธ๋ก
sns.pointplot(data = train, x = 'hour', y = 'count', ax = ax1)
- ์๊ฐ๋๋ณ๋ก ๋ณด์์๋, 8์ , 17์๊ฒฝ์ ๊ฐ์ฅ ์์ ๊ฑฐ ์์๋์ด ๋ง๋ค. (์ถ, ํด๊ทผ์๊ฐ์์ ์ ์ ์๋ค.)
(6) workingday (์นดํ ๊ณ ๋ฆฌํ) , ์๊ฐ๋๋ณ๋ก point plot ํ์ธ
fig, (ax1) = plt.subplot(1,1)
fig.set_Size_inches(20, 5)
#seaborn์์ ์นดํ
๊ณ ๋ฆฌํ ๋ฐ์ดํฐ๋ฅผ ๊ณ ๋ คํ ๊ทธ๋ํ๋ฅผ ์ถ๋ ฅํ๊ณ ์ถ์ผ๋ฉด, hue๋ณ์๋ฅผ ์ถ๊ฐํด์ค๋ค.
#๋ฐ๋ผ์ ์๊ฐ๋๋ณ๋ก holiday == 1์ผ๋, holiday =- 0 ์ผ๋๋ก ์ถ๋ ฅ๋๋ค.
sns.pointplot(data = train, x = 'hour', y = 'count', hue = 'workingday', ax = ax1)
- 1: ๊ทผ๋ฌด์ผ / 0: ๊ทผ๋ฌด์ผ ์๋ ๋
- ๊ทผ๋ฌด์ผ์๋ ์ถํด๊ทผ ์๊ฐ์ ์์๋์ด ๊ธ์ฆํ๊ณ , ๊ทผ๋ฌด์ผ์ด ์๋ ๋์๋ ์คํ์๊ฐ๋์ ์์๋์ด ์ฆ๊ฐํ๋ ๊ฒ์ ์ ์ ์๋ค. ๋ฐ๋ผ์ holiday ๋ณ์๋ ์์ธก์ ์ํฅ์ ์ค ๊ฒ์ด๋ผ๊ณ ํ๋จํ๋ค.
(7) holiday (์นดํ ๊ณ ๋ฆฌํ), ์๊ฐ๋๋ณ๋ก point plot ํ์ธ
fig, ax1 = plt.subplot(1,1)
fig.set_size_inches(20, 5)
sns.pointplot(data = train, x = 'hour', y = 'count', hue = 'holiday', ax = ax1)
- 1: ํด์ผ / 0: ํด์ผ์ด ์๋๋
- ํด์ผ์ด ์๋๋๋ ์ถ,ํด๊ทผ์๊ฐ๋์ ์์ ๊ฑฐ์ ์์๊ฐ ์ฆ๊ฐํ๊ณ , ํด์ผ์ผ ๋๋ ์คํ ์๊ฐ๋์ ์ฆ๊ฐํ๋ค. ๋ฐ๋ผ์ holiday ๋ณ์๋ ์์ธกํ๋๋ฐ ์ฌ์ฉํด๋ณด๋ ค๊ณ ํ๋ค.
(8) weather (์นดํ ๊ณ ๋ฆฌํ), ์๊ฐ๋๋ณ๋ก point plot ํ์ธ
fig, ax1 = plt.subplot(1,1)
fig.set_size_inches(20, 5)
sns.pointplot(data = train, x = 'hour', y = 'count', hue = 'weather', ax = ax1)
- ์์ฃผ๊นจ๋ํ๋ ์จ(1) ์ฝ๊ฐ์ ์๊ฐ์ ๊ตฌ๋ฆ(2) ์ฝ๊ฐ์ ๋,๋น(3) ์์ฃผ๋ง์๋น์ ์ฐ๋ฐ(4)
- 1,2๋ฒ๋ ์จ > 3๋ฒ๋ ์จ > 4๋ฒ๋ ์จ๋ ๋ฐ์ดํฐ๊ฐ ๊ฑฐ์ ์์
(9) dayofweek (์นดํ ๊ณ ๋ฆฌํ), ์๊ฐ๋๋ณ๋ก point plot ํ์ธ
fig, ax1 = plt.subplot(1,1)
fig.set_size_inches(20, 5)
sns.pointplot(data = train, x = 'hour', y = 'count', hue = ' dayofweek', ax = ax1)
- dayofweek ์ ๋ชจ๋ ์์์ ๋น์ทํ๊ฒ ๋ํ๋์ง๋ง ์์ธก์๋ ์ฌ์ฉํด๋ณด๋๋ก ํ๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก year, month, day, hour, weather, holiday, workingday, dayofweek, season์ ์ถํ์ ์์ธก์ ํ์ฉํด๋ณด๋๋ก ํ๋ค.
4.4.2 ๋ณ์๋ผ๋ฆฌ์ ์๊ด๊ด๊ณ
corr_data = [['datetime', 'season', 'holiday', 'weather', 'temp', 'atemp', 'humidity', 'windspeed']]
colormap = plt.cm.PuBu
sns.heatmap(corr_data.corr(),
, linewidths = 0.1
, square = True
, annot = True
, cmap = colormap)
- temp์ atemp์ ์๊ด๊ด๊ณ๊ฐ ๋งค์ฐ ๋์์, ๋ค์ค๊ณต์ ์ฑ์ด ์์ฌ๋๋ค. ๋ฐ๋ผ์ temp ๋ณ์ ํ๋๋ง ์ฌ์ฉํ ๊ฒ์ด๋ค.
4.4.3 ์จ๋, ์ต๋, ๋ฐ๋์ธ๊ธฐ์ ๋ํด์ ์ดํด๋ณด๊ธฐ
์์ ์นดํ
๊ณ ๋ฆฌํ ๋ณ์์ ๋ํด์ ์ดํด๋ณด์์ผ๋, ์ด์ ์ฐ์ํ ๋ณ์๋ฅผ ์ดํด๋ณด๋๋ก ํ๋ค.
Temp, Humidity, Windspeed ์ ๊ฐ ๋ถํฌ๋ฅผ ๋ณด๊ธฐ ์ํด ๊ฐ๊ฐ scatter plot์ ๊ทธ๋ ค๋ณธ๋ค.
fig, (ax1, ax2, ax3) = plt.subplots(ncols = 3, figsize=(12,5))
sns.scatterplot(data = train, x = 'windspeed', y = 'count', ax = ax1)
sns.scatterplot(data = train, x = 'temp', y = 'count', ax = ax2)
sns.scatterplot(data = train, x = 'humidity', y = 'count', ax = ax3)
์ฐจ๋ก๋๋ก ๋ฐ๋์ธ๊ธฐ, ์จ๋, ์ต๋์ ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๋ณผ ์ ์๋ค. ์๋ ์ฌ๊ธฐ์ ๋๋ ๋ณ๋ค๋ฅธ ์ด์ํ ์ ์ ์ฐพ์ง ๋ชปํ์ง๋ง, HONG_YP๋์ ๋ธ๋ก๊ทธ๋ฅผ ๋ณด๊ณ '์!!!' ํ๋ ์์ฒญ๋ ์ธ์ฌ์ดํธ๋ฅผ ์ป๊ฒ๋๋ค. ์ด๋๋ฌธ์ ์ค์ ๋ก ์บ๊ธ์ ์ ์๊ฐ ์์นํ๋ ๊ฒ์ ๋ณผ ์ ์์๋ค.
HONG_YP ๋๊ป์ ์บ์นํ์ ์ธ์ฌ์ดํธ๋ ๋ฐ๋ก, '๋ฐ๋ ์ธ๊ธฐ๊ฐ 0์ธ ๊ฒฝ์ฐ๋ ๊ฑฐ์ ์์ง ์๋?' ๋ผ๋ ์ ์ด์๋ค. ๋ฐ์ดํฐ ๋ถํฌ๋ฅผ ๋ณด๋ฉด, windspeed ๋ณ์์ 0์ ๊ฐ์ด ์๋นํ ๋ง์ด ์กด์ฌํ๋ค.
len(train[train['windspeed']==0])
# ๊ฒฐ๊ณผ : 1313
์ค์ ๋ก ์ถ๋ ฅํด๋ณด๋ windspeed์ 0 ๊ฐ์ด ์๋ ๊ฒ์ 1313๊ฐ ์๊ณ , 10000์ฌ๊ฐ์ ๋ฐ์ดํฐ์ค 1313๊ฐ๋ฉด ์๋นํ ๋ง์ ๋ถ๋ถ์ ์ฐจ์งํ๋ค๊ณ ์๊ฐํ ์ ์๋ค. ๋ฐ๋ผ์ windspeed๊ฐ 0 ์ธ ๊ฒ์ ๋์ฒดํ๋ feature engineering ๊ณผ์ ์ด ํ๋ ๋ ํ์ํ๋ค.
5. Feature Engineering
์ธ ๊ฐ์ง์ ๋จ๊ณ๋ก ์งํํ๋ ค๊ณ ํ๋ค. ๋ฐ์ดํฐ์ ์๋์ ์ฒจ๋๋ฅผ ์ดํด๋ณด๊ณ ์กฐ์ ํด ์ค๊ฒ์ด๊ณ , IQR๋ฐฉ๋ฒ์ผ๋ก ์ด์์น๋ฅผ ์ ๊ฑฐํด ์ค ํ, ์์ ์ธ๊ธํ๋ windspeed ์ ๋ํ feature engineering์ ์งํํ ๊ฒ์ด๋ค.
5.1 ์ด์์น ์ ๊ฑฐ
5.1.1 ์ฐ์ํ ๋ณ์์ ๋ํ Boxplot ์์ฑ ๋ฐ ์ด์์น ํ์ธ
์ด์์น ์ ๊ฑฐ๋ฅผ ์ํด box plot์ ๋จผ์ ์์ฑํด ๋ณด๊ฒ ๋ค. ์นดํ ๊ณ ๋ฆฌํ ๋ณ์๋ง๊ณ ์ฐ์ํ ๋ณ์์ ๋ํด์ ์งํํด๋ณด์๋ค.
fig, (ax1, ax2, ax3, ax4, ax5, ax6) = plt.subplots(nrows = 6, figsize = (12,10))
sns.boxplot(data = train, x = 'windspeed', ax = ax1)
sns.boxplot(data = train, x = 'humidity', ax = ax2)
sns.boxplot(data = train, x = 'temp', ax = ax3)
sns.boxplot(data = train, x = 'casual', ax = ax4)
sns.boxplot(data = train, x = 'registered', ax = ax5)
sns.boxplot(data = train, x = 'count', ax = ax6)
5.1.2 IQR ๋ฐฉ์์ ์ฌ์ฉํ ์ด์์น ์ ๊ฑฐ
IQR๋ฐฉ์์ 4๋ถ์ ๊ฐ๋ ์ผ๋ก ์ถ๋ฐํ๋ค. ์ ์ฒด ๋ฐ์ดํฐ๋ฅผ ์ค๋ฆ์ฐจ์์ผ๋ก ์ ๋ฆฌํ ํ, ์ ํํ 4๋ฑ๋ถํ๋ค. (25%, 50%, 75%, 100%) ์ฌ๊ธฐ์ 75%์ 25% ์ง์ ์ ๊ฐ์ ์ฐจ์ด๋ฅผ IQR์ด๋ผ๊ณ ๋ถ๋ฅด๊ณ , ๊ทธ ์ด์๊ณผ ์ดํ์ ํด๋นํ๋ ๊ฐ์ ์ด์์น๋ผ๊ณ ํ๋จํ๋ ๋ฐฉ์์ด๋ค. (IQR ์ค๋ช : hwi-doc.tistory.com/entry/IQR-%EB%B0%A9%EC%8B%9D%EC%9D%84-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%9D%B4%EC%83%81%EC%B9%98-%EB%8D%B0%EC%9D%B4%ED%84%B0Outlier-%EC%A0%9C%EA%B1%B0 ์ฐธ๊ณ )
์ด์์น ์ ๊ฑฐ๋ฅผ ์ํ ํจ์๋ฅผ ์์ฑํด๋ณด๊ฒ ๋ค. ํด๋น ์ฝ๋๋ HONG_YP๋์ ๋ธ๋ก๊ทธ์ ์๋ ์ฝ๋๋ฅผ ๊ทธ๋๋ก ์ฌ์ฉํ๋ค! (๋งจ ์๋ ๋งํฌ ์ฒจ๋ถ)
from collections import Counter
def detect_outliers(data, n, cols):
outliser_indices = []
for col in cols:
Q1 = np.percentile(data[col], 25)
Q3 = np.percentile(data[col], 75)
IQR = Q3 - Q1
outlier_step = 1.5 * IQR
outlier_list_col = data[(data[col] < Q1 - outlier_step) | (data[col] > Q3 + outliser_step)].index
outlier_indices.extend(outlier_list_col)
outlier_indices = Counter(outlier_indices)
multiple_outliers = list(k for k, v in outlier_indices.items() if v > n)
return multiple_outliers
Outliers_to_drop = detect_outliers(train, 2, ["temp", "atemp", "casual", "registered", "humidity", "windspeed", "count"]
์ด์์น drop ํ๊ธฐ ์ data ํ์ธ
train.shape
์ด์์น drop ์คํ!
train = train.drop(Outliers_to_drop, axis = 0).reset_index(drop = True)
train.shape
์์ฃผ ์กฐ๊ธ์ด์ง๋ง, ์ด์์น๊ฐ ์ ๊ฑฐ๋์์ ํ์ธํ ์ ์๋ค.
5.2 ์๋(skewness)์ ์ฒจ๋(kurtosis) ํ์ธ
๋ฐ์ดํฐ ๋ถ์์์์ ์๋์ ์ฒจ๋๋ ์ค์ํ๋ค. ๊ฐ๋จํ๊ฒ ์ ๋ฆฌํ์๋ฉด, ์๋์ ๊ฐ๊ณ , ์๋์ ์ฒจ๋์ ์์น๋ฅผ ๋ณด๊ณ ๋ฐ์ดํฐ์ ์น์ฐ์นจ ์ ๋๋ฅผ ์ ์ ์๊ธฐ ๋๋ฌธ์ด๋ค.
- ์๋
- ๋ฐ์ดํฐ์ ๋ถํฌ๊ฐ ํ์ชฝ์ผ๋ก ์ ๋ฆฐ๊ฒ์ ์๋ฏธ
- skew์ ์์น๊ฐ -2~+2 ์ ๋๊ฐ ๋์ด์ผ ์น์ฐ์นจ์ด ์๋ ๋ฐ์ดํฐ
- -2์ดํ๋ ์ผ์ชฝ์ผ๋ก ์ ๋ฆฐ ๋ฐ์ดํฐ (negative) +2 ์ด์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ๋ฆฐ ๋ฐ์ดํฐ(positive)
- positive์ผ๊ฒฝ์ฐ ๋ณํ๋ฐฉ๋ฒ : square root, cube, log(๋ฐ10)
- negative์ผ๊ฒฝ์ฐ ๋ณํ๋ฐฉ๋ฒ : square, cube root, logarithmic(๋ฐ2์ธlog)
- ์ฒจ๋
- ๋ถํฌ์ ๋พฐ์กฑํจ์ด๋ ํํํจ์ ๊ด๋ จ๋ ๊ฒ์ด ์๋๋ผ ๋ถํฌ์ tail์ ๋ํ ๋ชจ๋ ๊ฒ
- ํ์ชฝ ๊ผฌ๋ฆฌ๋ถ๋ถ์ ๊ทน๊ฐ๊ณผ ๋ค๋ฅธ์ชฝ ๊ผฌ๋ฆฌ์ ๊ทน๊ฐ๊ณผ์ ์ฐจ์ด๋ฅผ ๋ณด์ฌ์ค
- ์์๋ผ์ด์ด๋ฅผ ์ฐพ์ ๋ ์ฃผ๋ก ์ฌ์ฉ
- ์ฒจ๋๊ฐ ๋๋ค -> ์์๋ผ์ด์ด๊ฐ ๋ง์ด ์๋ค
(1) ์๋์ ์ฒจ๋๋ฅผ ์๊ฐํํด์ ์ดํด๋ณด๊ธฐ
๊ฐ์ฅ ๊ธฐ๋ณธ์ ์ธ ํ์คํ ๊ทธ๋จ (distplot)์ ๊ทธ๋ ค์ ๋ฐ์ดํฐ๋ฅผ ํ์ธํด ๋ณด๊ฒ ๋ค.
fig, ax = plt.subplot(1,1, figsize = (10, 6))
graph = sns.distplot(train['count'],
, color = 'b;
, label = 'Skewness:{.2f}'.format(train['count'].skew())
, ax = ax)
graph = graph.legend(loc = 'best')
print('skewness(์๋): %f' %train['count'].skew())
print('kurtosis(์ฒจ๋): %f' %train['count'].kurt())
๊ฒฐ๋ก ์ ์ผ๋ก ์์น์์ผ๋ก๋ ์๋์ ์ฒจ๋์ ๋ฌธ์ ๊ฐ ์๊ฒ ์ถ๋ ฅ๋๋ค. ํ์ง๋ง ๋ฐ์ดํฐ์ ํ์คํ ๊ทธ๋จ์ ๋ณด์ํ๋, count ๊ฐ 0์ ๊ต์ฅํ ๋ง์ด ์น์ฐ์ณ์ ์๋ ๊ฒ์ ํ์ธ ํ ์ ์๋ค. ์ด๋ Log scaling์ ํตํด ์ ๊ทํ ์์ผ์ฃผ๋๋ก ํ์.
(์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์, y๊ฐ์ธ count ๊ฐ์ log๋ฅผ ์ทจํด์ฃผ์์ผ๋, ๋ง์ง๋ง์ ๋์จ ์์ธก๊ฒฐ๊ณผ๊ฐ์๋ ๋ค์ log๋ฅผ ์ทจํด์ฃผ์ด์ผ ์๋ ์ํ๋ ๊ฐ์ด ๋์จ๋ค!!!!)
(2) count๊ฐ์ log๋ฅผ ์ทจํด์ฃผ์ด ์ ๊ทํ ํด์ฃผ๊ธฐ
#lambda ๋ฅผ ์ฌ์ฉํด์ ๋ก๊ทธ๋ฅผ ์ทจํด์ค count๊ฐ์ count_log ์ปฌ๋ผ์ผ๋ก ์์ฑํด์ฃผ์
train['count_log'] = train['count'].map(lambda i:np.log(i) if i > 0 else 0)
fig, ax = plt.subplots(1,1, figsize = (10, 6))
graph = sns.distplot(train['count_log']
, color = 'b'
, label = 'skewness: {:2f}'.format(train['count_log'].skew())
, ax = ax)
graph = graph.legend(loc = 'best')
print("skewness(์๋): %f" %train['count_log'].skew())
print("kurtosis(์ฒจ๋): %f" %train['count_log'].kurt())
#ํ์์๋ count๊ฐ ์์ ์ฃผ๊ธฐ
train.drop('count', axis = 1, inplace = True)
์๋์ ์ฒจ๋์ ์์น๋ ๊ด์ฐฎ๊ฒ ๋์๊ณ , ๋ฐ์ดํฐ๊ฐ 0 ํ๋์๋ง ์น์ฐ์ณ์ ธ ์๋ ๊ฒ์ด ๊ฐ์ ๋ ๊ฒ์ ํ์ธํ ์ ์๋ค. ๋ฐ๋ผ์ count_log ๊ฐ์ ์์ธก์ ํ์ฉํ ๊ฒ์ด๊ณ , ๋์ค์ ๋ค์ log๋ฅผ ์ทจํด์ฃผ๋๋ก ํ์.
5.3 windspeed = 0 ๋์ฒด๊ฐ ์ฐพ๊ธฐ
์์ ์ธ๊ธํ๋ ๊ฒ์ฒ๋ผ, ํ์์ด 0์ผ๋๊ฐ ๊ฑฐ์ ์๋ ๊ฒ์ ๊ณ ๋ คํ์ฌ windspeed ๊ฐ์ ๋์ฒดํด์ฃผ๊ธฐ๋ก ํ๋ค.
<< ๊ฒฐ์ธก๊ฐ ์ฒ๋ฆฌ ๋ฐฉ๋ฒ>>
- ๊ฒฐ์ธก๊ฐ์ ์ ๋ฐฉํฅ ํน์ ๋ท ๋ฐฉํฅ์ผ๋ก ์ฑ์ฐ๊ธฐ
- ๊ฒฐ์ธก๊ฐ์ ๋ณ์๋ณ ํ๊ท ์ผ๋ก ์ฑ์ฐ๊ธฐ
- ๊ฒฐ์ธก๊ฐ์ ๊ฐ์ง ๋ฐ์ดํฐ๋ฅผ ์ญ์ ํ๊ธฐ
- ๊ฒฐ์ธก๊ฐ์ 0 ์ด๋, ์์ ๋ค๋ฅธ ๊ฐ์ผ๋ก (-999) ๋์ฒดํ๊ธฐ
- ๊ฒฐ์ธก๊ฐ์ ์์ธก๋ ๊ฐ์ผ๋ก ๋์ฒดํ๊ธฐ (๋จธ์ ๋ฌ๋์ ๋๋ ค์)
์๋ฌด๋๋ windspeed๊ฐ null๊ฐ์ธ ๊ฒฝ์ฐ๋ฅผ 0์ผ๋ก ์ฒ๋ฆฌํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํ๊ธฐ์, ๊ฒฐ์ธก์น๋ฅผ ์ฑ์ฐ๋ ๋ฐฉ๋ฒ์ค์ ํ๋์ ๋ฐฉ๋ฒ์ธ ์์ธก๋ ๊ฐ์ผ๋ก ๋์ฒดํ๋ ๋ฐฉ๋ฒ์ผ๋ก 0์ ๋ฐ๊พธ์ด์ฃผ๋ ค๊ณ ํ๋ค.
- RandomForest ๋ฅผ ํ์ฉํ์ฌ ์์ธก๊ฐ์ผ๋กwindspeed = 0.0 ๊ฐ์ ๋์ฒดํ๊ธฐ
from sklearn.ensemble import RandomForestClassifier
def predict_windspeed(data):
wind0 = data.loc[data['windspeed'] == 0]
windnot0 = data.loc[data['windspeed'] != 0]
#ํ์์ด ๋ ์จ๋ณ์์ด๊ธฐ ๋๋ฌธ์ ๋ ์จ๋ณ์๋ฅผ ํ์ฉํด์ windspeed๋ฅผ ์์ธกํด์ค ๊ฒ
col = ['season', 'weather', 'temp', 'humidity', 'atemp', 'day']
windnot0['windspeed'] = windnot0['windspeed'].astype('str')
rf = RandomForestClassifier()
#windspeed๊ฐ 0์ด ์๋ ์ปฌ๋ผ์ผ๋ก fit ํด์ค
#model.fit(X_train, y_train)
rf.fit(windnot0[col], windnot0['windspeed'])
#windspeed๊ฐ 0์ธ ๋ถ๋ถ์ ์์ธก
#model.predict(X_test)
pred_wind0 = rf.predict(X = wind0[col])
#wind0์ windspeed ๊ฐ์ pred_wind0์ผ๋ก ๋ฐ๊ฟ์ฃผ๊ณ
wind0['windspeed'] = pred_wind0
#windnot0๊ณผ wind0์ ํฉ์ณ์ค๋ค
data = windnot0.append(wind0)
data['windspeed'] = data['windspeed'].astype('float')
data.reset_index(inplace = True)
data.drop("index", inplace = True, axis = 1)
return data
train = predict_windspeed(train)
test = predict_windspeed(test)
- windspeed 0์ธ ๊ฐ ์กด์ฌ์ฌ๋ถ ํ์ธ
train[train['windspeed'] == 0.0]
- train๊ณผ test์ windspeed ๊ฐ ์๊ฐํ
fig, (ax1, ax2) = plt.subplots(2,1)
fig.set_size_inches(20,15)
#๊ฐฏ์๋ฅผ ์ธ์ผํ๋ countplot
sns.countplot(data = train, x = 'windspeed', ax = ax1)
sns.countplot(data = test, x = 'windspeed', ax = ax2)
windspeed์ ๊ฐ์์ 0.0 ์ด ์ฌ๋ผ์ง ๊ฒ์ ํ์ธํ ์ ์๋ค.
5.4 one-hot encoding ๋ฒ์ฃผํ ๋ณ์ ์ฒ๋ฆฌ
Season | ๋ด(1) ์ฌ๋ฆ(2) ๊ฐ์(3) ๊ฒจ์ธ(4) |
Holiday | ๊ณตํด์ผ(1) ๊ทธ์ธ(0) |
Workingday | ๊ทผ๋ฌด์ผ(1) ๊ทธ์ธ(0) |
Weather | ์์ฃผ๊นจ๋ํ๋ ์จ(1) ์ฝ๊ฐ์ ์๊ฐ์ ๊ตฌ๋ฆ(2) ์ฝ๊ฐ์ ๋,๋น(3) ์์ฃผ๋ง์๋น์ ์ฐ๋ฐ(4) |
ํด๋น ๋ณ์๋ ์ซ์๋ก ๋ ๊ฐ์ด '์์น'๋ฅผ ์๋ฏธํ์ง ์๋๋ค. ๋ฐ๋ผ์ ์ํซ์ธ์ฝ๋ฉ์ผ๋ก ๋ฒ์ฃผํ ๋ณ์๋ฅผ ์ฒ๋ฆฌํด์ฃผ์๋ค.
#prefix ๋, ๋ณ์ ์์ฑ๋ช
์์ weather_1 ์ด๋ฐ์์ผ๋ก ์์ฑ๋๊ฒ ํ๋ ๊ฒ
train['weather'] = pd.get_dummies(train, columns = ['weather'], prefix = 'weather')
test['weather'] = pd.get_dummies(test, columns = ['weather'], prefeix = 'weather')
train['season'] = pd.get_dummies(train, columns = ['season'], prefix = 'season')
test['season'] = pd.get_dummies(test, columns = ['season'], prefix = 'season')
train = pd.get_dummies(train, columns = ['holiday'], prefix = 'holiday')
test = pd.get_dummies(test, columns = ['holiday'], prefix = 'holiday')
train.columns
test.columns
6. Modeling
6.1 train์ ์ฌ์ฉ๋ ๋ณ์๋ฅผ ์ ํํ์
์์ columns ๋ด์ญ์ ๋ณด๊ณ dropํ ์ปฌ๋ผ์ ์ ํํด์ฃผ์๋ค.
#submission์ ํํ๋ฅผ ์ดํด๋ณด์์ ๋, datetime์ ๊ธฐ์ค์ผ๋ก ์์ธก๊ฐ์ ์ ์๋ค.
#๋ฐ๋ผ์ test์ datetime์ ๋ฏธ๋์ submission ์ ์ํด์ ๋ฐ๋ก ์ ์ฅํด๋๊ธฐ๋ก ํ๋ค.
test_datetime = test['datetime']
train.drop(['datetime', 'workingday', 'atemp', 'registered', 'casual', 'minute', 'second'], axis = 1, inplace = True)
test.drop(['datetime', 'workingday', 'atemp', 'minute', 'second'], axis = 1, inplace = True)
์ผ๋จ workingday๋ holiday ์ ๋๋ฌด ๋น์ทํ ์์์ ๋๊ณ ์์ด์ workiingday๋ฅผ ์ญ์ ํด์ฃผ๊ธฐ๋ก ํ๋ค. ๋ temp์ atemp์ ์๊ด๊ด๊ณ๊ฐ ๋งค์ฐ ๋์ ๋ค์ค๊ณต์ ์ฑ์ด ์์ฌ๋๊ธฐ ๋๋ฌธ์, atemp ๋ณ์๋ฅผ ์ญ์ ํด ์ฃผ์๋ค. year, month, day ๋ฑ ์๊ฐ์ ๋ํ ๋ณ์๊ฐ ๋ฐ๋ก ์กด์ฌํ๊ธฐ๋๋ฌธ์ datetime ๋ ์ญ์ ํด์ฃผ๊ณ , ์ด๋จ์, ๋ถ๋จ์์ ๋ฐ๋ฅธ ์์ ๊ฑฐ ์์๋์ ๋ณํ๋ ์๊ธฐ ์ฝ์ง ์๋ค๊ณ ํ๋จํ์ฌ ์์ ์ฃผ์๋ค. ๋ฐ๋ผ์ ์ต์ข ์ ์ผ๋ก ์ ์ ํ๊ฒ๋ ์ปฌ๋ผ์ ์๋์ ๊ฐ๋ค.
train.columns
test.columns
6.2 Gradient Boosting ๋ชจ๋ธ ํ์ต
6.2.1 ๋ฐ์ดํฐ์ ๋ถํ
from sklearn.model_selection import train_test_split
from sklearn import metrics
#๋ฐ์ดํฐํ๋ ์ ํํ๊ฐ ์๋ array ํํ์ฌ์ผํ๊ธฐ๋๋ฌธ์ values๋ฅผ ์ทจํด์ค
x_train = train.drop('count_log', axis = 1).values
target_label = train['count_log'].values
x_test = test.values
# train : val = 0.8 : 0.2 ๋ก split
x_train, x_val, y_train, y_val = train_test_split(x_train, target_label, test_size = 0.2, random_state = 2000)
๋ฐฐ์ด ํํ๋ก ๋ฐ์ดํฐ๊ฐ ์ ๋๋์ด ์ง๊ฒ์ ํ์ธํ ์ ์๋ค.
6.2.2 ๋ชจ๋ธ๋ง ๋ฐ ํ์ต
gradient boosting ๋ชจ๋ธ์ ์ฌ์ฉํ๊ธฐ๋ก ํ๋ค. ์ด ๋ชจ๋ธ์ ์ฅ๋จ์ , ์ ์ ํํ๊ฒ ๋์๋์ง ๋ฑ์ ๋ํ ์์ธํ ํฌ์คํ ์ ์ถํ์ ์ด์ด๋๊ฐ๋๋ก ํ๊ฒ ๋ค.
from sklearn.ensemble import GradientBoostingRegressor
regressor = GradientBoostingRegressor(n_estimators = 2000
, learning_rate = 0.05
, max_depth = 5
, min_samples_leaf = 15
, min_samples_split = 10
, random_state = 42)
#model.fit(x, y)
regressor.fit(x_train, y_train)
ํ๋ผ๋ฏธํฐ ํ๋์ ํตํด ๋ ์ ํฉํ ๋งค๊ฐ๋ณ์ ๊ฐ์ ์ฐพ์์ฃผ๋ ๊ฒ์ด ์ข๊ฒ ์ง๋ง, ๋ฐ์ดํฐ ์ญ๋ ํ ์คํธ ์ํ ํน์ฑ์ 2์๊ฐ์ผ๋ก ์๊ฐ์ด ํ์ ๋์ด ์๊ธฐ์ ์์ง์ ์ฐ์ตํ์ง ์์๋ค. ํ์ง๋ง ์ถํ ํด๋น ๋ชจ๋ธ์ gridsearch ๋ฅผ ์ฌ์ฉํ์ฌ ํ๋ผ๋ฏธํฐ ํ๋์ ํด๋ณผ ์์ ์ด๋ค.
6.2.3 ๋ชจ๋ธ ์ฑ๋ฅ ํ๊ฐ
๊ฐ๋จํ๊ฒ accuracy๋ฅผ ์ถ๋ ฅํด๋ณด์๋ค. ๋ง์ฝ ํด๋น ๊ณผ์ ์์ ์ค๋ฒํผํ ์ด ๋ฐ์ํ๋ค๋ฉด, learning_rate๋ max_depth(ํธ๋ฆฌ์ ๊น์ด)๋ฅผ ์๊ฒ ์์ ํด์ ์งํํด๋ณด๋๋ก ํด๋ณด์. ์ง๊ธ์ test๊ฐ ๋ ์ ํ๋๊ฐ ๋๊ธด ํ์ง๋ง ์ฐจ์ด๊ฐ ํฌ์ง ์๊ธฐ์ ๊ทธ๋ฅ ์งํํ๊ฒ ๋ค.
score_train = regressor.score(x_train, y_train)
score_val = regressor.score(x_val, y_val)
print("train score: %f" %score_train)
print("validation score: %f" %score_val)
7. ์์ธก ๋ฐ submission.csv ์์ฑ
7.1 ์์ธก
์์ ๋ง๋ regressor ๋ชจ๋ธ์ x_test ๋ฐ์ดํฐ๋ฅผ ๋ฃ์ด ์์ธก์ ์ํํด ๋ณด๊ฒ ๋ค.
pred = regressor.predict(x_test)
7.2 ์ ์ถ ํ์ผ ์์ฑ
๋ํ์์ ์ ๋ก๋ํด์ค submission ํ์ผ์ ๋ณด๋ฉด, ์๋์ ๊ฐ์ด ์๊ฒผ๋ค.
sample = pd.read_csv("SampleSubmission.csv")
sample.head()
์ด ํํ์ ๋๊ฐ์ด ๋ง๋ ํ ์ ์ถํด์ผ ํ๋ค.
์ด๋ฐ์ train๊ณผ test์์ ์ฌ์ฉํ ๋ณ์๋ฅผ ์ถ๋ ค๋ด๋ ๊ณผ์ ์์, test ํ์ผ์์์ datetime์ test_datetime ๋ณ์์ ์ ์ฅํด๋์ ๊ฒ์ ๊ธฐ์ตํ ๊ฒ์ด๋ค.
๋ฐ๋ผ์ ์๋ก์ด ๋ฐ์ดํฐํ๋ ์์ ์์ฑํ๊ณ , ๊ฑฐ๊ธฐ์ test_datetime ๊ณผ, ์์ธกํ ๊ฒฐ๊ณผ๊ฐ์ธ pred๋ฅผ ๋ฃ์ด์ค๋ค.
submission = pd.DataFrame()
submission['datetime'] = test_datetime
submission['count_log'] = pred
์ฌ๊ธฐ์ ๊ฐ์ฅ ์ค์ํ ๊ฒ์, count_log ๋ผ๋ ์ ์ด๋ค. ์ด๋ ๊ทธ๋ฅ count๋ก ํด์ ์ ์ถํด๋ฒ๋ฆฌ๋ฉด...๋์ฐํ๋ค..๋ชจ๋ ๊ฒ ๋ฌผ๊ฑฐํ..
์ด๋ฐ์ count์ log๋ฅผ ์ทจํด์ ์ ๊ทํ ์์ผ์ค ๊ฒ์ ๊ผฌ์ค์ค์ฅ ๊ธฐ์ตํ์.
๋ฐ๋ผ์ ๋ง์ง๋ง์ผ๋ก count_log์ ๋ค์ log๋ฅผ ์ทจํด, ์๋์ ๊ฐ์ ์ฐพ์์ค๋ค.
submission['count'] = np.exp(submission['count_log'])
submission.drop('count_log', axis = 1, inplace = True)
submission.head()
submission.to_csv("Bike.csv", index = False)
8. kaggle์ ์ ์ถ
www.kaggle.com/c/bike-sharing-demand/submissions
์ ์ํด์ ๋ก๊ทธ์ธ ํ, Late submission์ ๋ค์ด๊ฐ์ ํ์ผ์ ๋๋๊ทธํ์ฌ ์ ๋ก๋ ํ ํ, ๋ฐ๋ก ํ๊ฐ๋ฐ์ ์ ์๋ค.
๋ฐฉ๊ธ ์ ์ถํ ํ์ผ์ ์ ์๋ฅผ ๋ณด๋ฉด, 0.41826์ผ๋ก ์ฐ์ ๋์๋ค. ํ์ฌ ๋ํ๊ฐ ๋ง๊ฐ๋์ด ์์๋ ๋ณผ ์ ์๋ค. ๋ณธ ๋ํ ์ ์ ์ธก์ ๋ฐฉ์์ RMSE ๊ธฐ์ค์ผ๋ก, ์ ์๊ฐ ๋ฎ์์ผ ์ข์ ๊ฒ์ด๋ค. ํ์ง๋ง ๋ด๊ฐ ๋ชจ๋ธ๋งํ ๊ฒ์ 0.41 ์ ๋๋ก ์ ํํ 426๋ฑ ์ ๋ ํ๊ฒ ๋ค. ... ํํ.... ๋ชจ๋ธ์ ๋ค๋ฅธ ๋ชจ๋ธ์ ์ฌ์ฉํ๊ฑฐ๋, ํ์๋ณ์๋ฅผ ์์ฑํ๋ ๋ฑ ํผ์ณ์ ๋ํ ์๊ฐ์ ์ข ๋ ๊น๊ฒ ํด๋ณธ๋ค๋ฉด ์ ์๋ ํฌ๊ฒ ํฅ์ํ ์ ์์ง ์์๊น ์ถ๋ค.
๋ง์น๋ฉฐ....
๋ฐ์ดํฐ ๋ถ์ ์ญ๋ ํ
์คํธ๋ฅผ ์น๋ค์ผ ํ๊ธฐ ๋๋ฌธ์, ๋ฐ์ดํฐ๋ฅผ ์ดํด๋ณด๋ ๋ฒ, EDA ํ๊ณ ๋ชจ๋ธ๋งํ๋ ๋ฒ๊น์ง ์ญ ๊ณต๋ถํด๋ณด์๋ค. ์๋ง์ ํ๋ก์ ํธ๋ฅผ ์งํํด๋ณด๋ฉด์ ์ฐธ๊ณ ์๋ฃ(๊ฐ ๊ตฌ๊ธ, ์ฑ
๋ฑ) ์์ด ํผ์ ๋จธ์ ๋ฌ๋์ ๋ค๋ค๋ณธ์ ์ด ์๋๋ฐ...
์ํ์์๋ ์ฐธ๊ณ ์๋ฃ ์์ด ์ค์ง ๋ ํผ๋ฐ์ค์ ์์งํ์ฌ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๊ณ , ๋ชจ๋ธ๋งํด์ผํ๋ค๋ ๋ถ๋ด๊ฐ์ด ๋๋ฌด๋๋ฌด ํฌ๋ค. ์ค์ ๋ก ๋ด๊ฐ ์๋ ๋ชจ๋ธ ์ง์ ๋ฑ์ ์ ์จ๋จน์ง ๋ชปํ ๊น๋ด ๊ฑฑ์ ์ด ์์ ๋ค ใ
ใ
์ง๊ธ ์ดํ ๋จ์๋๋ฐ, ์ต์ ์ ๋คํด์ ๋ชจ๋ธ๋ง๊ณผ ํผ์ณ ์์ง๋์ด๋ง ๋ฐฉ๋ฒ์ ๋ํด ์ตํ ํ, ์ํ์์ ๋ฌด์ฌํ ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์์ผ๋ฉด ์ข๊ฒ ๋ค!!!
์ธ์์.... AI๋ฅผ ์๋ค๋ฃจ๋ ์ฌ๋์ด ๋๋ฌด ๋ง๋ค สฬฅ_สฬฅ
์ ๊ทธ๋ฆฌ๊ณ , ์ด ๊ธ์ ์์ฑํ๋๋ฐ ๊ฐ๊ฐํ ๊ธ์์ ๋ฑ์ฅํ๋ฏ์ด, HONG_YP๋์ ๋ธ๋ก๊ทธ ๋ฅผ ๋ง์ด ์ฐธ๊ณ ํ๋ค. windspeed ๋ณ์๋ฅผ ๊ฐ๊ณ ์ ๋ ๊ฒ ์๊ฐํ ์ ์์๋ค๋ ๊ฒ๊ณผ, ์๋์ ์ฒจ๋๋ฅผ ๊ณ ๋ คํด์ count๋ฅผ ์ ๊ทํ ์์ผ์ฃผ๋ ๋ฑ... ์์ง ํผ์ณ ์์ง๋์ด๋ง์ ๋ํด์ ๋ฐฐ์ธ ์ ์ด ์ฐธ ๋ง์ ๊ฒ ๊ฐ๋ค. ๋ ํผ์ ์ค์ค๋ก ๋ฐ์ดํฐ๋ก๋ถํฐ ์ธ์ฌ์ดํธ๋ฅผ ๋ฝ์๋ด๋ ๊ทธ๋ ๊น์ง ๋ ์ด์ฌํ ๋ง์ ์ฌ๋์ ์๋ฃ๋ฅผ ์ฐพ์๋ณด๊ณ ๊ณต๋ถํด๋ด์ผ๊ฒ ๋ค๋ ๋ค์ง์ด ์๊ฒผ๋ค!
hong-yp-ml-records.tistory.com/77?category=823206