Project/전세가 예측

[Project] 서울 전세가 예측(모델링)

씨주 2024. 3. 31. 23:20

모델을 선정하기 전 여러가지 회귀모델들을 비교해보았다.

 

 

📌 모델선정

from sklearn.linear_model import LinearRegression, ElasticNet, Lasso, Ridge
from sklearn.tree import DecisionTreeRegressor
from sklearn.ensemble import RandomForestRegressor
import xgboost as xgb
import lightgbm as lgb


reg = LinearRegression(n_jobs=-1)
ridge = Ridge(alpha=0.8, random_state=1)
lasso = Lasso(alpha = 0.01, random_state=1)
Enet = ElasticNet(alpha=0.03, l1_ratio=0.01, random_state=1)
DTree = DecisionTreeRegressor(max_depth=6, min_samples_split=10, min_samples_leaf=15, random_state=1)
rf = RandomForestRegressor(n_estimators=500, criterion='squared_error', max_depth=9, min_samples_split=50,
                           min_samples_leaf=5, random_state=1, n_jobs=-1)
model_xgb = xgb.XGBRegressor(n_estimators=500, max_depth=9, min_child_weight=5, gamma=0.1, n_jobs=-1)
model_lgb = lgb.LGBMRegressor(n_estimators=500, max_depth=9, min_child_weight=5, n_jobs=-1)

models = []
scores = []
for model in [reg, ridge, lasso, Enet, DTree, rf, model_xgb, model_lgb]:
    model_name, mean_score = print_rmse_score(model)
    models.append(model_name)
    scores.append(mean_score)
    
result_df = pd.DataFrame({'Model': models, 'Score': scores}).reset_index(drop=True)

 

비교기준은 RMSE로 선정했고 XGboost가 가장 좋은 성능을 보였지만 우리 팀은 LGBM으로 선정하였다.

다른 모델에 비해 LGBM과 XGboost는 큰 차이가 없다 판단하였고, 하이퍼파라미터 튜닝을 고려하여 속도나 메모리적으로 우수한 LGBM을 선정하였다. 

 

 

📌 LGBM 모델링

from lightgbm import LGBMRegressor
import lightgbm as lgb

X_features = df.iloc[:, :-1]
y_label = df.iloc[:, -1]
X_train, X_test, y_train, y_test = train_test_split(X_features, y_label, test_size=0.2, random_state=156)

model = LGBMRegressor(max_depth=10, random_state=11, verbose=-1)
model.fit(X_train, y_train)

 

 

📌 Feature importance

lgb.plot_importance(model, figsize=(10, 8), max_num_features=20)
plt.show()

연식, 교통, 학군, 건물용도(아파트)가 상위권을 차지하는 것을 볼 수 있다. 

프로젝트를 진행하며 예상했던 요소들이 중요도가 높은 것이 신기하기도 하고 즐거웠던 기억이 있다.

 

 

📌 하이퍼파라미터 튜닝 전, 후 비교

하이퍼파라미터 튜닝도 속도가 빠르다는 장점이 있는 RandomizedSearchCV를 사용하였다.

from sklearn.model_selection import RandomizedSearchCV

params = {
    'n_estimators' : [100, 500 , 1000] , # 반복 횟수
    'learning_rate' : [0.01 , 0.05 , 0.1 , 0.3] , # 러닝 메이트
    'lambda_l1' : [0 , 10 , 20 , 30 ,50] , # L1 정규화
    'lambda_l2' : [0 , 10 , 20 , 30 , 50] , # L2 정규화
    'max_depth' : [5 , 10 , 15 , 20] , # 최대 깊이
    'subsample' : [0.6 , 0.8 , 1] # 서브샘플 비율
}

model_2 = LGBMRegressor(random_state= 11) # 모델 객체 생성
rs = RandomizedSearchCV(model_2 , param_distributions= params , n_iter= 30, random_state= 11 , n_jobs= -1) # 랜덤 그리드 서치 객체 생성
rs.fit(X_train , y_train)
rs.best_params_

튜닝 전 / 후
튜닝 전 / 후

수치, 그래프를 보면 성능이 향상되었다는 것을 확인할 수 있다.

(튜닝으로 성능이 향상되는 것은 당연한 결과일 수 있지만 과적합은 항상 주의하자)

캐글대회를 보면 공격적으로 튜닝을 진행하는 것을 볼 수 있는데 첫 프로젝트다보니 그렇게 진행해보지 못한 것이 아쉽다.

 

 

📌 연식 전처리 방법 비교

[Project] 서울 전세가 예측(데이터 수집 및 전처리)(1)

 

[Project] 서울 전세가 예측(데이터 수집 및 전처리)(1)

세미프로젝트 주제를 전세가 예측으로 정하면서 어떤 데이터를 활용할지에 대해 먼저 고민했다.전세가에 영향을 주는 교육, 교통, 인프라 등이 자연스럽게 떠올랐고 얼마나 근처에 있는지 보다

heejudeveloper.tistory.com

집 연식에 대한 결측치를 처리했던 2가지 방법의 모델 성능을 비교해보았다.

연식 평균 컬럼 추가(전) / 연식 결측치 평균 대체(후)

드라마틱한 차이가 있었던 것은 아니지만 정확도가 좀 더 높은 연식 평균 컬럼을 추가한 데이터로 프로젝트를 진행했다.