미국 NYC Airbnb 목록(2019)
프로젝트 목적: 가격 예측(price)
제공 데이터(3개): train.csv, test.csv, y_test(최종 채점용)
평가 방식: MSE (평균제곱오차/ 실제 값과 예측 값 차이 ->제곱해 평균)
<참고> : 6. 지도학습(회귀) 노드의 6-8. 평가(회귀) 스텝에서 복습하실 수 있습니다.
데이터 출처 바로가기 / License CC0: Public Domain
# 라이브러리
import pandas as pd
# 데이터 불러오기
train = pd.read_csv('/aiffel/data/train.csv')
test = pd.read_csv('/aiffel/data/test.csv')
# 데이터 크기
train.shape, test.shape
# 데이터 샘플
display(train.head(2))
display(test.head(2))
# 데이터 타입
train.info()
# 결측치(train)
train.isnull().sum()
# 결측치(test)
test.isnull().sum()
# target(hist)
train['price'].hist(bins=100)
# target(describe)
train['price'].describe()
# 피처(host_id)
train['host_id'].value_counts()
# 결측치 컬럼 삭제(last_review) : 'last_review' 는 날짜형식으로 되어있어서 그냥 삭제
train = train.drop('last_review', axis=1)
test = test.drop('last_review', axis=1)
# 결측치 채우기 : 'reviews_per_month' 결측치는 0으로 채우기
train['reviews_per_month'] = train['reviews_per_month'].fillna(0)
test['reviews_per_month'] = test['reviews_per_month'].fillna(0)
# 결측치 확인
train.isnull().sum()
# 가격 값 복사
target = train['price']
train = train.drop('price', axis=1)
# 수치형 피처 선택
cols = [
'host_id',
'latitude',
'longitude',
'minimum_nights',
'number_of_reviews',
'reviews_per_month',
'calculated_host_listings_count',
'availability_365'
]
train = train[cols]
test = test[cols]
# 검증 데이터 분리
from sklearn.model_selection import train_test_split
X_train, X_val, y_train, y_val = train_test_split(train, target, test_size=0.2, random_state=2022)
X_train.shape, X_val.shape, y_train.shape, y_val.shape
((31292, 8), (7824, 8), (31292,), (7824,))
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
model = LinearRegression()
model.fit(X_train, y_train)
pred = model.predict(X_val)
mean_squared_error(y_val, pred)
32000.4623726053
from sklearn.linear_model import Ridge
model = Ridge()
model.fit(X_train, y_train)
pred = model.predict(X_val)
mean_squared_error(y_val, pred)
32002.921365825365
from sklearn.linear_model import Lasso
model = Lasso()
model.fit(X_train, y_train)
pred = model.predict(X_val)
mean_squared_error(y_val, pred)
32695.606216284894
from sklearn.linear_model import ElasticNet
model = ElasticNet()
model.fit(X_train, y_train)
pred = model.predict(X_val)
mean_squared_error(y_val, pred)
33521.06875602843
from sklearn.ensemble import RandomForestRegressor
model = RandomForestRegressor()
model.fit(X_train, y_train)
pred = model.predict(X_val)
mean_squared_error(y_val, pred)
32227.609332579243
from xgboost import XGBRegressor
model = XGBRegressor()
model.fit(X_train, y_train)
pred = model.predict(X_val)
mean_squared_error(y_val, pred)
31838.531510528188
# test 데이터 예측 및 평가
y_test = pd.read_csv('/aiffel/data/y_test.csv')
# Xgboost
pred = model.predict(test)
mean_squared_error(y_test, pred)
# baseline score(mse 51xxx) 보다 점수가 낮게 나오도록 도전해 보세요!
print("나의 점수는 (MSE #[[YOURE CODE]])입니다.")