전기차 가격 예측 해커톤: 데이터로 EV를 읽다!

데이콘 해커톤 | 알고리즘 | 정형 | 회귀 | EV | RMSE

  • moneyIcon 데이스쿨 프로 구독권
  • 1,313명 마감

 

[public: 1.0400] “전기차 가격 예측 모델: 최적화된 머신러닝 앙상블 접근”

2025.01.20 13:28 2,248 조회 language

코드 설명

이 코드는 전기차 가격 예측 문제를 해결하기 위해 머신러닝 모델 앙상블과 최적 가중치 탐색 기법을 활용하여 작성되었습니다. 다양한 모델을 조합하여 최적의 성능을 도출하는 데 중점을 두고 있으며, 주요 특징은 다음과 같습니다:
1. 데이터 전처리:
• 결측치 처리: 배터리 용량 결측치는 중앙값으로 채움.
• 파생 변수 추가: 에너지 효율 및 차량 나이를 계산하여 모델에 학습에 도움되는 특징 생성.
• 원-핫 인코딩: 범주형 데이터를 수치형 데이터로 변환하여 모델 입력 준비.
2. 다양한 머신러닝 모델 활용:
• 모델 목록:
• LightGBM
• XGBoost
• CatBoost
• Random Forest
• Extra Trees
• Gradient Boosting
• Ridge, Lasso, ElasticNet
• 각 모델은 하이퍼파라미터를 설정하여 최적화된 성능을 제공.
3. 최적 가중치 탐색:
• 앙상블 모델의 예측 성능을 극대화하기 위해 scipy.optimize.minimize를 사용하여 각 모델의 최적 가중치를 계산.
• 가중치 합이 1이 되도록 제약 조건을 적용하여 균형 있는 앙상블을 구성.
4. 결과 출력 및 저장:
• 테스트 데이터를 기반으로 최종 예측 값을 생성.
• 결과를 클리핑하여 타깃 값의 범위를 유지.
• 최종 결과를 제출 파일(predicted_submission.csv)로 저장.
5. 최적화된 앙상블 성능:
• Validation RMSE: 점수 기준 최적화된 결과 제공.
• 모델 성능 기여도 분석을 통해 효과적인 모델 선택 가능.

코드
로그인이 필요합니다
0 / 1000
NN_is_all_you_need
2025.01.21 15:14

삭제된 댓글입니다

Haeden
2025.02.04 16:10

안녕하세요. 앙상블 모델에 대해 이론적으로만 공부했었는데, 참고하기 좋은 코드 공유해주셔서 감사합니다.
한 가지 질문을 드리고 싶습니다.

4. 머신러닝 모델 정의 할 때, 
XGBoost, CatBoost, LightGBM 모델은 estimators 값을 1000으로 설정하고
Random Forest, Extra Trees, Gradient Boosting 값을 500으로 설정하셨는데
이렇게 결정하신 이유가 궁금해서요. :)

일반적으로 개별모델 사용할 때 default 값인지? 아니면 전반적인 학습속도를 고려한 값인지 궁금합니다!
좋은 코드 공유 감사합니다~ :)

YOONSK
2025.02.05 09:16

안녕하세요! 관심 가져주셔서 감사합니다. 😊
XGBoost, CatBoost, LightGBM의 n_estimators=1000과 Random Forest, Extra Trees, Gradient Boosting의 n_estimators=500을 설정한 이유는 모델별 특성과 학습 속도의 균형을 고려한 선택입니다.

1️⃣ XGBoost, CatBoost, LightGBM → n_estimators=1000
• 이 모델들은 부스팅(Boosting) 계열로, 트리를 순차적으로 생성하면서 이전 오차를 줄이는 방식이라 비교적 작은 learning rate(0.01)와 함께 더 많은 트리를 사용하면 성능 향상에 유리할 수 있습니다.
• 특히 LightGBM과 XGBoost는 내부적으로 빠른 학습 최적화가 되어 있어 n_estimators=1000을 사용해도 상대적으로 빠르게 훈련할 수 있습니다.

2️⃣ Random Forest, Extra Trees, Gradient Boosting → n_estimators=500
• Random Forest & Extra Trees는 배깅(Bagging) 계열로, 각 트리가 독립적으로 학습되므로 많은 트리를 사용할수록 계산량이 증가합니다.
일반적으로 500개 정도면 충분한 성능을 내면서 과적합을 방지할 수 있습니다.
• Gradient Boosting은 부스팅 계열이지만 속도가 상대적으로 느린 편이라 학습 시간을 고려해 500으로 설정했습니다.

결론적으로,
👉 부스팅 계열(XGBoost, CatBoost, LightGBM)은 성능 향상을 위해 1000
👉 배깅 계열(Random Forest, Extra Trees)과 속도 고려(Gradient Boosting)는 500

이렇게 설정한 것이고, 최적의 n_estimators 값은 데이터에 따라 다를 수 있어요

좋은 질문 감사합니다! 😊

YOONSK
2025.02.05 09:21

🔹 XGBoost (XGBRegressor)
• 기본값
• n_estimators=100 → (코드에서는 1000으로 증가)
• learning_rate=0.3 → (코드에서는 0.01로 감소)
• max_depth=6 → (코드에서는 8로 증가)
• 변경 이유
• 트리 개수를 늘리고 학습률을 줄이면 모델이 더 천천히 학습하며 일반화 성능이 좋아질 가능성이 있음.
• 깊이를 증가시키면 복잡한 패턴을 더 잘 학습할 수 있지만, 과적합 위험이 있음.
🔹 CatBoost (CatBoostRegressor)
• 기본값
• iterations=1000 → (기본값과 동일)
• learning_rate=0.03 → (코드에서는 0.01로 감소)
• depth=6 → (코드에서는 8로 증가)
• loss_function='RMSE' → (기본값은 'RMSE'로 동일)
• verbose=0 → (기본값은 1이지만, 코드에서는 출력을 끄기 위해 0으로 설정)
• 변경 이유
• 부스팅 모델에서 learning_rate=0.01로 설정하면 더 천천히 수렴하면서 성능이 좋아질 가능성이 있음.
• 깊이를 8로 늘려 더 복잡한 관계를 학습할 수 있도록 설정.
🔹 LightGBM (LGBMRegressor)
• 기본값
• n_estimators=100 → (코드에서는 1000으로 증가)
• learning_rate=0.1 → (코드에서는 0.01로 감소)
• max_depth=-1 (무제한) → (코드에서는 8로 제한)
•   변경 이유
• 트리 개수를 늘려 모델이 충분히 학습하도록 함.
• learning_rate를 작게 하여 일반화 성능을 높이고자 함.
• max_depth를 8로 제한하여 과적합을 방지.
🔹 Random Forest (RandomForestRegressor)
• 기본값
• n_estimators=100 → (코드에서는 500으로 증가)
• 변경 이유
• n_estimators=500으로 설정하면 성능이 안정적으로 올라감

YOONSK
2025.02.05 09:21

🔹 Extra Trees (ExtraTreesRegressor)
• 기본값
• n_estimators=100 → (코드에서는 500으로 증가)
•  변경 이유
• 많은 트리를 사용하면 모델의 안정성이 증가할 가능성이 있음.
🔹 Gradient Boosting (GradientBoostingRegressor)
• 기본값
• n_estimators=100 → (코드에서는 500으로 증가)
• learning_rate=0.1 → (코드에서는 0.05로 감소)
• 변경 이유
• n_estimators=500으로 설정하면 모델이 더 강력해질 가능성이 있음.
• learning_rate=0.05로 줄이면 좀 더 일반화 성능을 높일 수 있음.

YOONSK
2025.02.05 09:21

🔹 정리
✅ 기본값이 아닌 값들:
• n_estimators를 대부분 증가시켜 더 많은 트리를 학습하도록 설정함.
• learning_rate를 기본값보다 줄여서 더 천천히 학습하도록 함.
• max_depth를 부스팅 모델에서 조정하여 과적합을 방지함.

서시현
2025.02.28 16:43

[LightGBM] [Warning] No further splits with positive gain, best gain: -inf 
이거 뜨는 이유가 궁금해요

YOONSK
2025.02.28 18:01

이 경고 메시지는 LightGBM 모델을 학습할 때 발생할 수 있는 일반적인 경고입니다. 이 메시지는 특정 노드에서 더 이상 긍정적인 이득을 얻을 수 있는 분할이 없다는 것을 의미합니다.