GIL's LAB

회귀 모델 성능 비교 본문

데이터사이언스/머신러닝

회귀 모델 성능 비교

GIL~ 2022. 12. 21. 14:18

이번 포스팅에서는 32개 데이터에 대해 회귀 모델을 적용했을 때의 성능을 바탕으로 어느 상황에서 어떤 모델을 써야하는지에 대한 인사이트를 정리해보겠습니다.

단, 어디까지나 32개 데이터에 대한 실험 결과일 뿐이므로 결과를 맹신하지는 않았으면 좋겠습니다.

 

사용 데이터

사용한 데이터는 KEEL에서 수집한 32개 회귀 데이터 셋으로 그 정보는 다음과 같습니다. 

 

사용 모델

사용한 회귀 모델은 11개로 sklearn, xgboost, lightgbm의 클래스를 이용해 만들었습니다.

from sklearn.ensemble import RandomForestRegressor as RFR
from sklearn.ensemble import GradientBoostingRegressor as GBR
from sklearn.linear_model import ElasticNet as EN
from sklearn.svm import SVR
from sklearn.linear_model import BayesianRidge as BR
from sklearn.linear_model import LinearRegression as LR
from xgboost.sklearn import XGBRegressor as XGBR
from lightgbm import LGBMRegressor as LGBR
from sklearn.tree import DecisionTreeRegressor as DTR
from sklearn.neighbors import KNeighborsRegressor as KNN
from sklearn.neural_network import MLPRegressor as MLP

신경망과 같이 임의성을 갖는 모델에 대해서는 시드를 모두 41로 고정했습니다. 

또한, 모든 하이퍼 파라미터는 디폴트를 사용했습니다.

model_list = [RFR(random_state = 41),
              GBR(random_state = 41),
              EN(random_state = 41),
              SVR(),
              BR(),
              LR(),
              XGBR(random_state = 41),
              LGBR(random_state = 41),
              DTR(random_state = 41),
              KNN(),
              MLP(random_state = 41)]

 

실험 방법

실험 방법은 간단합니다. 각 데이터에 대해 12개 회귀 모델을 5겹 교차 검증을 통해 평가합니다. 이때 평가 기준은 negative MAE를 사용했습니다. 또한 데이터마다 MAE의 분포가 크게 다를 수 있으므로, 데이터마다 MAE에 대한 표준화를 수행하여 그 결과를 z-score에 저장했습니다. 여기서부터는 이렇게 계산한 z-score를 편의상 성능이라 부르겠습니다.

from sklearn.model_selection import cross_val_score
i = 0
result = []
total_score_list = []
for X, y in data_list:
    print("{}/{}번째 data".format(i, len(data_list)))
    score_list = []
    for model in model_list:
        score = -cross_val_score(model, X, y, cv = 5, scoring = "neg_mean_absolute_error").mean()
        record = [file_list[i], get_name(model), score]        
        result.append(record)
        score_list.append(score)
        
    score_list = np.array(score_list)
    score_list = (score_list - np.mean(score_list)) / np.std(score_list)
    
    total_score_list += list(score_list)
    i += 1 
    
result = pd.DataFrame(result, columns = ["file", "model", "score"])
result['z-score'] = total_score_list
result['z-score'] = -result['z-score']

 

 

실험 결과

모델별 평균 성능

모델별 평균 성능은 다음과 같습니다.

평균을 기준으로 보면 LGBMRegressor, GradientBoostingRegressor, RandomForestRegressor가 각각 1, 2, 3등으로 우수한 성능을 보였습니다. XGBRegressor 성능도 5등임을 감안하면, 트리 기반의 앙상블들이 상위권을 차지함을 알 수 있습니다.

평균 성능은 0.095209부터 0.342160까지 분포해있는데, 11개 모델 중 8개가 0.2919를 넘습니다. 

즉, 하위권의 점수가 굉장히 안좋았다라고 할 수 있습니다. 하위권을 차지한 모델은 ElasticNet와 MLPRegressor입니다.

두 모델 자체가 안좋다기보다 하이퍼 파라미터 튜닝을 하지 않으면 좋은 성능을 기대하기 어려운 모델이라 이러한 결과가 나온 것이 아닐까 짐작해봅니다. 

 

 

모델별 성능 편차

모델별 성능의 표준편차는 다음과 같습니다. 

KNeighborsRegressor와 XGBRegressor가 편차가 가장 적은 모델임을 알 수 있습니다.

다시 말해, 성능이 제법 안정적으로 나온다고 볼 수 있습니다. 쉽게 말하면 평타는 치는 모델들이다...라고 할 수 있죠 (평균도 높았으니 말이죠).

 

편차가 큰 모델은 ElasticNet과 MLPRegressor였는데, 위에서 살펴본 결과와 마찬가지로 튜닝하지 않았을 때 너무 저조한 성능이 나와서 이러한 결과가 나온 것 아닐까라고 생각해볼 수 있습니다.

 

 

Comments