0. ๋ค์ด๊ฐ๊ธฐ ์
- Data fields
- ID : ์ง์ ๊ตฌ๋ถํ๋ ๋ฒํธ
- date : ์ง์ ๊ตฌ๋งคํ ๋ ์ง
- price : ์ง์ ๊ฐ๊ฒฉ(Target variable)
- bedrooms : ์นจ์ค์ ์
- bathrooms : ํ์ฅ์ค์ ์
- sqft_living : ์ฃผ๊ฑฐ ๊ณต๊ฐ์ ํ๋ฐฉ ํผํธ(๋ฉด์ )
- sqft_lot : ๋ถ์ง์ ํ๋ฐฉ ํผํธ(๋ฉด์ )
- floors : ์ง์ ์ธต ์
- waterfront : ์ง์ ์ ๋ฐฉ์ ๊ฐ์ด ํ๋ฅด๋์ง ์ ๋ฌด (a.k.a. ๋ฆฌ๋ฒ๋ทฐ)
- view : ์ง์ด ์ผ๋ง๋ ์ข์ ๋ณด์ด๋์ง์ ์ ๋
- condition : ์ง์ ์ ๋ฐ์ ์ธ ์ํ
- grade : King County grading ์์คํ ๊ธฐ์ค์ผ๋ก ๋งค๊ธด ์ง์ ๋ฑ๊ธ
- sqft_above : ์งํ์ค์ ์ ์ธํ ํ๋ฐฉ ํผํธ(๋ฉด์ )
- sqft_basement : ์งํ์ค์ ํ๋ฐฉ ํผํธ(๋ฉด์ )
- yr_built : ์ง์ด์ง ๋ ๋
- yr_renovated : ์ง์ ์ฌ๊ฑด์ถํ ๋ ๋
- zipcode : ์ฐํธ๋ฒํธ
- lat : ์๋
- long : ๊ฒฝ๋
- sqft_living15 : 2015๋ ๊ธฐ์ค ์ฃผ๊ฑฐ ๊ณต๊ฐ์ ํ๋ฐฉ ํผํธ(๋ฉด์ , ์ง์ ์ฌ๊ฑด์ถํ๋ค๋ฉด, ๋ณํ๊ฐ ์์ ์ ์์)
- sqft_lot15 : 2015๋ ๊ธฐ์ค ๋ถ์ง์ ํ๋ฐฉ ํผํธ(๋ฉด์ , ์ง์ ์ฌ๊ฑด์ถํ๋ค๋ฉด, ๋ณํ๊ฐ ์์ ์ ์์)
# ๋ฐ์ดํฐ๋ ์บ๊ธ์์ ๋ฐ์ผ์
๋ ๋๊ณ ์ด ๋งํฌ์์ ๋ถ๋ฌ์๋ ๋ฉ๋๋ค.
import pandas as pd
df = pd.read_csv('https://ds-lecture-data.s3.ap-northeast-2.amazonaws.com/kc_house_data/kc_house_data.csv')
1. EDA
(๊ฐ ์ข ํต๊ณ์น ํ์ธ, ์ฌ๋ฌ plot์ ํตํ ์๊ฐํ ๋ฑ์ ์๋ตํ๊ฒ ์ต๋๋ค.)
๋จผ์
df.corr()['price'].sort_values(ascending=False)
์ ํตํด ์๊ด๊ณ์ ์์ 5๊ฐ๋ 'price', 'sqft_living', 'grade', 'sqft_above', 'sqft_living15', 'bathrooms' ์ธ ๊ฒ์ ํ์ ํด๋์์ต๋๋ค.
2. Feature Engineering
(๋น์ฅ ๋ ์ค๋ฅด๋ ๋ฐฉ๋ฒ์ ์์ด, ์ผ๋จ 'id'์ 'date'์ ์ ์ธํ ๋ณ์๋ค๋ก ๋ค์คํ๊ท๋ฅผ ์งํํ์์ต๋๋ค.)
3. Modeling
3-1-1. id ๋ฐ date๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ณ์์ ๋ํด์ ๋ค์คํ๊ท
target = 'price'
features = ['bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors',
'waterfront', 'view', 'condition', 'grade', 'sqft_above',
'sqft_basement', 'yr_built', 'yr_renovated', 'lat', 'long',
'sqft_living15', 'sqft_lot15', 'zipcode']
y_train = df_train[target]
X_train = df_train[features]
y_test = df_test[target]
X_test = df_test[features]
์ ๊ฐ์ ์กฐ๊ฑด์ผ๋ก ์ ํํ๊ท ์ธ๋ฑ์ฑ ํ, ๋ชจ๋ธ ํผํ ์ ์งํํ์์ต๋๋ค.
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 44334905831.3, MAE : 129983.7, RMSE : 210558.6, R2 : 0.7(0.6751740573558591) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 39685983731.2, MAE : 124068.5, RMSE : 199213.4, R2 : 0.7 ์ ๋๋ค.
ํ๊ท๊ณ์๋ก ๋ชจ๋ธ์ ์ค๋ช ํ๋ ๋ถ๋ถ์ ์ผ๋จ ๋์ด๊ฐ๊ฒ ์ต๋๋ค.(๋ณ์๊ฐ ๋๋ฌด ๋ง์ ์๋ฏธ๋ฅผ ํ์ ํ๊ธฐ ์ด๋ ค์ธ ๊ฑฐ๋ผ ์๊ฐ)
3-1-2. id ๋ฐ date๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ณ์์ ๋ํด์ ๋ค์คํ๊ท(๊ทธ๋ฐ๋ฐ ์ด์ ๋ฌด์์ ํ์คํ๋ฅผ ๊ณ๋ค์ธ)
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit(X_train).transform(X_train)
X_test_scaled = scaler.fit(X_test).transform(X_test)
์์ ๊ฐ์ด ํผ์ณ์ ์ ํ์คํ ์ ์ฒ๋ฆฌ๋ฅผ ์งํ ํ ๋ชจ๋ธ ํผํ ์ ์งํํ์์ต๋๋ค.
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 41358447199.6, MAE : 131365.1, RMSE : 203367.8, R2 : 0.7(0.6858104110180232) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 39899513851.1, MAE : 123577.7, RMSE : 199748.6, R2 : 0.7 ์ ๋๋ค.
์ผ๋จ, ๋ฌด์์ ๋ณ์๋ค์ ๋จ์๋ฅผ ๋ง์ถฐ๋ณด์๋๋ฐ, ํ
์คํธ ๋ฐ์ดํฐ์ ๋ํ score๊ฐ ์ฝ 0.01 ์ฆ๊ฐํ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
์๊ฐ๋ณด๋ค ํ์คํ ์ ์ฒ๋ฆฌ๊ฐ ๋ฏธ๋นํ๋ค ํ๋จํ์ฌ ์ผ๋จ์ ๋ณ์์ ๋ํ ๋ณํ๋ง ์ฃผ๋ฉฐ ๋ชจ๋ธ๋งํด๋ณด์์ต๋๋ค.
3-2. ์๊ด๊ณ์ ์์ 5๊ฐ๋ก ๋ค์คํ๊ท(ํ์คํX)
# price์ ์๊ด๊ณ์๊ฐ ๋์(0.5 ์ด์) ํน์ฑ์ 'sqft_living', 'grade', 'sqft_above', 'sqft_living15', 'bathrooms' ์
๋๋ค.
target = 'price'
features = ['sqft_living', 'grade', 'sqft_above', 'sqft_living15', 'bathrooms']
y_train = df_train[target]
X_train = df_train[features]
y_test = df_test[target]
X_test = df_test[features]
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 63247102520.8, MAE : 166621.4, RMSE : 251489.8, R2 : 0.5(0.5195278717932403) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 60420427179.7, MAE : 159247.2, RMSE : 245805.7, R2 : 0.5 ์ ๋๋ค.
์์์ ํ์ง๋ง ์ด์ ๋ณด๋ค ๋ณ์๊ฐ ์ค์ด๋๋ score๊ฐ ๋จ์ด์ง๋ ๋ชจ์ต์ ๋ณด์ ๋๋ค.
3-3. EDA๋ฅผ ํตํด ์๋์ ๊ฐ์ ๊ต์ฅํ ์ฃผ๊ด์ ์ธ ๊ฐ์ ์ ํตํด ๋ค์คํ๊ท
์์ธํ EDA๋ ์๋ตํ์ง๋ง, ์ด๊ฒ์ ๊ฒ ๊ทธ๋ ค๋ณด๊ณ ํต๊ณ์น๋ฅผ ๋ณด๋ฉด์ ์๋์ ๊ฐ์ ๊ฐ์ ์ ํตํด ๋ช๊ฐ์ง ๋ณ์๋ฅผ drop ํ ์งํํด๋ณด์์ต๋๋ค.
- sqft ๋ณ์๋ค ์ค sqft_living์ sqft_above์ sqft_basement๋ฅผ ๋ํ ๊ฐ์ด๊ณ ์๊ด๊ณ์ ์ ์งํ์ ์ํฅ์ด ์ ์ผ๋ฏ๋ก basement๋ ์ ์ธ์์ผฐ์ต๋๋ค.
- ๋ํ sqft15 ๋ณ์๋ค์ ๊ฒฝ์ฐ, 15๋ ๋๋ฅผ ๊ธฐ์ค์ผ๋ก ์ฐ ๊ฐ๋ค์ด๊ณ train์ ์์์ ๊ฐ๊ฒฉ์ 14๋ ๋ ๊ธฐ์ค์ด๊ธฐ์ ์ ์ธ์์ผ๋ณด์์ต๋๋ค.
target = 'price'
features = ['bedrooms', 'bathrooms', 'sqft_living', 'sqft_lot', 'floors',
'grade', 'sqft_above', 'lat', 'long', 'view', 'condition', 'waterfront', 'zipcode']
y_train = df_train[target]
X_train = df_train[features]
y_test = df_test[target]
X_test = df_test[features]
์์ ๋ณ์๋ค๋ก๋ง ๋ชจ๋ธ๋ง์ ์งํํ์๊ณ
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 47966313586.4, MAE : 136276.1, RMSE : 219012.1, R2 : 0.6(0.6499013670241869) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 42738317364.2, MAE : 130068.3, RMSE : 206732.5, R2 : 0.7 ์ ๋๋ค.
์ด๊ฒ๋ ํ๋จํ๊ธฐ ๋ค์ ์ ๋งคํฉ๋๋ค. ๋ณ์๋ฅผ 3๊ฐ ์ค์ธ ๊ฒ์น๊ณ ๋ ๊ทธ๋๋ score๊ฐ ๋ง์ด ์๋จ์ด์ง๊ฑด๊ฐ ์ถ๊ธฐ๋ ํฉ๋๋ค.
3-1-3. id ๋ฐ date๋ฅผ ์ ์ธํ ๋ชจ๋ ๋ณ์์ ๋ํด์ ๋ค์คํ๊ท(ํ๋ฐ, ์ด๋ฒ์ train data์ ๋น์จ์ ๋๋ ค๋ณธ)
์ฒ์ ์งํํ 3-1-1์์ ์ด๋ฒ์ ๊ธฐ์กด train๊ณผ test๋ฅผ ๋๋ด๋ ๊ธฐ๊ฐ '2015-01-01'์ '2015-03-15'๋ก ๋๋ ค์ train set์ ๋น์จ์ 67.7%(๊ธฐ์กด)์์ 81.4%(๊ธฐ๊ฐ ๋๋ฆฐ ํ)๋ก ํ๋ณดํ ํ ์งํํด๋ณด์์ต๋๋ค.
df_train = df[df['date'] < pd.to_datetime('2015-03-15')]
df_test = df.drop(df_train.index)
print(df_train.shape[0] / df.shape[0] * 100) # 81.41396381807246
์ดํ ๋ชจ๋ธ๋ง ์งํํ ๊ฒฐ๊ณผ๋
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 44334905831.3, MAE : 129983.7, RMSE : 210558.6, R2 : 0.7(0.67640644518824) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 39685983731.2, MAE : 124068.5, RMSE : 199213.4, R2 : 0.7 ์ ๋๋ค.
๊ธฐ์กด๋ณด๋ค ์ฝ 0.005 ์ ๋ score๊ฐ ์ฆ๊ฐํ์ต๋๋ค.
3-4-1. ์ตํ์ ๋ณด๋ฃจ, '์๋ผ ๋ชจ๋ฅด๊ฒ ๋ค.' date๋ ์ซ์ํ์ผ๋ก ๋ฐ๊พธ๊ณ , date๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋๋๋ ๊ฒ์ด ์๋ train_test_split์ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ์ ๋ง๋ค์ด ๋ณด์์ต๋๋ค.
# date๋ฅผ ์ซ์๋ก ๋ฐ๊ฟ์ค๋๋ค.
df['date'] = pd.to_numeric(df['date'])
# ์๋ก์ด train, test set์ ๋ง๋ค๊ธฐ ์ํด ์๋์ ๊ฐ์ด X์ y๋ฅผ ์ง์ ํฉ๋๋ค.
X = df.drop(['price', 'id'], axis=1)
y = df['price']
# ์๋์ ๊ฐ์ด train, test set์ ๋ง๋ค์ด์ฃผ์์ต๋๋ค.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
๋ง์ฐฌ๊ฐ์ง๋ก ๋ชจ๋ธ๋ง์ ์งํํ๋ฉด
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 68087426000.4, MAE : 167000.7, RMSE : 260935.7, R2 : 0.5(0.5448324932597781) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 59062183895.9, MAE : 161677.9, RMSE : 243027.1, R2 : 0.5 ์ ๋๋ค.
์ด๋ฐ...... date๋ฅผ ์ถ๊ฐํ๊ธฐ์ ๋ญ๊ฐ ๋ ํฐ ๊ฐ์ด ๋์ฌ๊ฑฐ๋ผ ์๊ฐํ๋๋ฐ, ๋ ์์ ๊ฐ์ด ๋์์ต๋๋ค.
๊ทธ๋ฌ๋ค ๋ฌธ๋ date๋ ์ซ์ํ์ผ๋ก ๋ฐ๊พธ๋ฉด ํผ์์ scale์ด ๋๋ฌด ์ปค์ ๊ทธ๋ฐ๊ฑด ์๋๊น ์ถ์ด ์ฌ๊ธฐ์ ๋ค์ ํ๋ฒ ํ์คํ๋ฅผ ํด๋ณด์์ต๋๋ค.
3-4-2. ์์ ๋ฐฉ์์ ํ์คํ
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit(X_train).transform(X_train)
X_test_scaled = scaler.fit(X_test).transform(X_test)
๋ง์ฐฌ๊ฐ์ง๋ก ํ์คํ ์ ์ฒ๋ฆฌ ๊ณผ์ ์ ๊ฑฐ์น ํ ๋ชจ๋ธ๋ง์ ํ์์ต๋๋ค.
ํ ์คํธ ๋ฐ์ดํฐ์ MSE : 44479631979.7, MAE : 124595.4, RMSE : 210901.9, R2 : 0.7(0.7026516586368019) ์ ๋๋ค.
ํ๋ จ ๋ฐ์ดํฐ์ MSE : 39093340103.0, MAE : 124646.5, RMSE : 197720.4, R2 : 0.7 ์ ๋๋ค.
์ด๊ฒ ๋ง๋์ง ์ ํํ ๋ชจ๋ฅด์ง๋ง ๊ทธ๋๋ ๋ฐ์ฌ๋ฆผ ์ํ๊ณ test set์ ๋ํด 0.7์ด ๋๋ score๊ฐ ๋์์ต๋๋ค!
ํ๊ท๊ณ์ ๋ฐ ๊ณผ๋/๊ณผ์ ์ ํฉ์ ๊ณ ๋ คํ๋ ๋ถ๋ถ์ ์ถํ ๋ ์ ๋ฐ์ดํธํ๋๋ก ํ๊ฒ ์ต๋๋ค..!
'๐ฟ Data > ์ด๋ชจ์ ๋ชจ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
Ridge regression, ๋ชจ๋ธ ์ฑ๊ณผ ํ๊ฐ ์งํ, OneHotencoding, feature selection (0) | 2021.12.23 |
---|---|
์๋ก์ด ํน์ฑ(ํน์ฑ๊ณตํ), ์ด์์น, Scaler, ๋ชจ๋ธ ์ฑ๋ฅ ํฅ์ (0) | 2021.12.23 |
Simple Linear Regression(๋จ์์ ํํ๊ท) (0) | 2021.12.17 |
๋ฒ ์ด์ง์ ์์ ํ์ด(Bayesian Problem example) (0) | 2021.12.10 |
ํฐ ์์ ๋ฒ์น, ์ค์ฌ๊ทนํ์ ๋ฆฌ ์ฝ๋๋ก ๊ตฌํ (0) | 2021.12.10 |