pbj0812의 코딩 일기

[Machine Learning] XGBoost 를 이용한 집값 예측 본문

인공지능 & 머신러닝/Machine Learning

[Machine Learning] XGBoost 를 이용한 집값 예측

pbj0812 2021. 5. 6. 01:05

0. 목표

 - XGBoost 를 이용한 집값 예측

1. 실습

 1) 데이터 생성

  - randomGenerator : 데이터 길이, 최소값, 최대값을 입력하면 주어진 길이만큼 최소값, 최대값 범위에서 랜덤한 정수로 채워줌

  - root, yard, bathroom, livingroom, room 변수 생성

  - price에는 각 변수에 원하는 값을 매겨서 합산(정확한 가중치 적용)

import pandas as pd
import random

def randomGenerator(num_len, num_min, num_max):
    result = []
    for i in range(num_len):
        result.append(random.randint(num_min, num_max))
    return result
    
roof = randomGenerator(10000, 0, 1)
yard = randomGenerator(10000, 0, 1000)
bathroom = randomGenerator(10000, 1, 5)
livingroom = randomGenerator(10000, 0, 3)
room = randomGenerator(10000, 1, 20)

df = pd.DataFrame({'roof' : roof, 'yard' : yard, 'bathroom' : bathroom, 'livingroom' : livingroom, 'room' : room})

df['price'] = df['roof'] * 1000 + df['yard'] * 100 + df['bathroom'] * 500 + df['livingroom'] * 800 + df['room'] * 300

df.head()

 2) train, test 데이터 분류

  - price 를 y로 놓고 7:3 분류

x = df[['roof', 'yard', 'bathroom', 'livingroom', 'room']]
y = df['price']

from sklearn.model_selection import train_test_split

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size = 0.3)

 3) 모델 학습

  - RandomForest 사용

  - n_estimators : 생성할 트리 개수

from xgboost import XGBRegressor

model = XGBRegressor(n_estimators = 100)
model.fit(x_train, y_train)

y_pred = model.predict(x_test)

result = pd.DataFrame({'pred' : y_pred, 'real' : y_test})

result.head()

 4) 모델 평가

  - RMSE를 하면 터져버릴 거 같아서 MAE 사용

  - MAE score: 273.1585769856771

  - 얼마나 좋은건지 잘 모르겠음

from sklearn.metrics import mean_absolute_error

print('MAE score:', mean_absolute_error(y_test, y_pred))

 5) 모델 평가2

  - 오차를 실제값의 퍼센트로 나타냄

result['ratio(%)'] = abs((result['pred'] - result['real']) / result['real']) * 100

result.head()

  - 그것들의 평균

  - 0.8011145718055556(%)

import numpy as np

mean_ratio = np.mean(result['ratio(%)'])

print(mean_ratio)

 6) n_estimators 의 차이에 따른 결과 비교

  - n_estimators 가 클수록 값이 좋음

num = [1, 10, 100, 200]

for i in num:
    model = RandomForestClassifier(n_estimators = i)
    model.fit(x_train, y_train)
    
    y_pred = model.predict(x_test)
    
    percent = abs((y_pred - y_test) / y_test) * 100
    print(np.mean(percent))

2. XGBoost, RandomForest 시간, 성능 차이 비교

 1) RandomForest

from sklearn.ensemble import RandomForestClassifier
import time

num = [1, 10, 100, 200]

for i in num:
    model = RandomForestClassifier(n_estimators = i)
    
    start = time.time()
    model.fit(x_train, y_train)
    end = time.time()
    
    y_pred = model.predict(x_test)
    
    percent = abs((y_pred - y_test) / y_test) * 100
    print('Error : ', np.mean(percent), 'Time : ', end - start)

 2) XGBoost

from xgboost import XGBRegressor
import time

num = [1, 10, 100, 200]

for i in num:
    model = XGBRegressor(n_estimators = i)
    
    start = time.time()
    model.fit(x_train, y_train)
    end = time.time()
    
    y_pred = model.predict(x_test)
    
    percent = abs((y_pred - y_test) / y_test) * 100
    print('Error : ', np.mean(percent), 'Time : ', end - start)

3. 참고

 - XGBoost

Comments