모델을 선정하기 전 여러가지 회귀모델들을 비교해보았다.
📌 모델선정
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)
집 연식에 대한 결측치를 처리했던 2가지 방법의 모델 성능을 비교해보았다.
드라마틱한 차이가 있었던 것은 아니지만 정확도가 좀 더 높은 연식 평균 컬럼을 추가한 데이터로 프로젝트를 진행했다.
'Project > 전세가 예측' 카테고리의 다른 글
[Project] 서울 전세가 예측(시각화) (0) | 2024.04.01 |
---|---|
[Project] 서울 전세가 예측(인코딩) (0) | 2024.03.30 |
[Project] 서울 전세가 예측(데이터 수집 및 전처리)(2) (0) | 2024.03.28 |
[Project] 서울 전세가 예측(데이터 수집 및 전처리)(1) (0) | 2024.03.27 |