칼로리 소모량 예측 AI 해커톤

알고리즘 | 정형 | 회귀 | 헬스 | RMSE

  • moneyIcon 상금 : 인증서
  • 670명 마감

 

[Private 15등 - 0.30463] PolynomialFeatures, MaxAbs, AutoML

2023.04.24 12:23 912 조회 language

특성 공학을 처리한 뒤, Pycaret을 사용하여 여러 가지 모델들(['Decision Tree', 'Linear', 'Random Forest', 'Extra Trees', 'LightGBM', 'Xgboost', 'CatBoost']을 중심으로)을 비교했을 때는 눈에 띌 만큼 성능이 좋은 모델은 딱히 없었으나, AutoML에서 자동으로 생성된 ensemble-stacked 모델을 통해 0.4까지의 점수를 얻을 수 있었습니다. 좀 더 좋은 성능을 위해 고뇌하던 도중 '설빙더아이스'님께서 공유해 주신 sklearn의 PolynomialFeatures을 활용하여 Pycaret으로 비교해보니 Linear모델에서 가장 좋은 성능을 보였습니다. 자세한 이유는 잘 모르겠으나 PolynomialFeatures이 오히려 비선형성을 개선해버린 것과 동시에 특성 공학으로 발생했던 다중공선성의 영향을 비교적 덜 받는 것 같습니다. 이에 따라 AutoML에서 Linear의 좋은 성능으로 ensemble-stacked 모델의 성능 또한 향상되어 0.3 ~ 0.29라는 매우 유의미한 결과를 관측할 수 있었습니다. 이것 외에도 글이 많이 길어질 만큼 다른 방법들을 시도해 보았으나 제대로 활용하지 못했던 탓에 성능 향상에 도움이 되지는 않았습니다. 
궁극적으로, 이번 대회는 매우 한정된 데이터 내에서 PolynomialFeatures을 사용하여 어느 정도의 성능을 개선할 수 있었던, 제가 알지 못했던 특성 공학의 또 다른 방법을 배울 수 있었던 좋은 기회였습니다.

코드
로그인이 필요합니다
0 / 1000
통닭먹으러
2023.04.24 15:11

안녕하세요. 코드 공유해주셔서 감사합니다. 몇 가지 여쭙고 싶은 내용이 있습니다.
1. PolynomialFeatures 생성과 scale 처리 순서
저또한 polynomialfeatures생성과 scale 처리를 둘 다 진행하였는데, 어떤 순서대로 진행해야 올바른지 정확히 알지 못하고 진행하였습니다. 구글 서치에서 대부분(제가 보았던 글은 전부) scaler를 적용하고 polynomialfeatures를 생성하였는데 선생님께서는 순서를 반대로 하셨더라구요. 혹시 해당 부분에 대해 이유가 있으신가요?

2. 특성 생성
저도 작업을 진행 할 때 주어진 데이터의 특성 수가 정확한 예측을 하기에는 적은 수라고 생각하였고, 주어진 데이터를 토대로 bmi나 운동 강도 bmr 등의 새로운 특성을 기존 데이터로 조합하여 만들었습니다. 그런데 이럴 경우 기존 각각의 독립 변수들의 독립성이 보장되지 못하는 (다중공선성) 문제가 발생한다고 알고 있으며 이로인해 모델 학습 시 각각의 독립 변수에 영향을 주는 가중치들이 정확하게 학습되지 않을 수 있다고 알고 있습니다. 때문에 몇몇 특성을 생성하는게 정말 회귀 예측에서 효과적인지 궁금합니다.

국밥장인김국밥
2023.04.24 16:14

안녕하세요! 우선 PolynomialFeatures  > Scaler 순으로 처리한 것은 Pycaret에서의 모델 비교를 하며 PolynomialFeatures  > Scaler 경우가 Scaler  > PolynomialFeatures 경우보다 성능이 미세하게 좋았거나 완전히 뒤떨어지는 성능이 관측되었기 때문이었습니다. 저도 구글링을 하며 그 순서에 대해서 의문이 있었으나, 이번 대회에서는 제가 진행한 코드에 일반화하여 진행하는 것이 오히려 좋지 않았습니다.
두 번째로, 특성 생성(파생변수)에 관한 것입니다. 대회의 초반에는 기존의 데이터를 이용하여 BMR_per_duration이라는 한 가지 특성을 생성하여 모델에 넣었을 때 성능이 향상되어 그 기세를 몰아 여러 가지 특성들을 생성했습니다. 얘기하신 것처럼, 기존 데이터 셋을 이용한 특성 공학은 다중공선성으로 인해 오히려 특성 공학이 예측을 방해하는 경향을 보였습니다. 저 또한 이 점에 대해 굉장히 고심했습니다. 6500 행, 8~9 열이라는 매우 소량의 데이터에서 파생 변수를 만드는 것과 만들지 않는 것 사이에서 그만 정신을 잃을 뻔했습니다. 하지만 PolynomialFeatures을 통해서 성능 향상을 시켰습니다. 더 정확하게 말한다면 저는 다중공선성을 해결하지 못했으나, PolynomialFeatures을 통해 비선형성을 개선한 것이 효과적이었다고 생각합니다. 제가 AutoML을 돌렸을 때 성능 향상이 비약적으로 이루어진 것은 'LinearRegression'에서의 꽤나 좋은 예측을 만들었던 덕분이었습니다.
글이 많이 길어졌습니다. 마지막으로 요약하자면 첫 번째로 주신 질문의 경우 논리성이나 원리보다는 다양한 상황을 실험을 했을 때 PolynomialFeatures  > Scaler 순서가 유의미했습니다. 두 번째 질문에는 매우 강력한 비선형성의 개선은 다중공선성으로 인한 성능 저하의 영향력을 넘어서 회귀 예측에서의 성능이 좋아진 대회였다고 생각합니다.

국밥장인김국밥
2023.04.24 16:10

삭제된 댓글입니다

국밥장인김국밥
2023.04.24 16:11

+) 특성을 생성하는 것은 상황에 따라 달라진다고 봅니다. 따라서, 파생변수 생성 후 상관관계를 보고 특성 선택 혹은 삭제를 하거나 사이킷런이나 다른 라이브러리를 활용하여 특성 선택을 하는 방법을 사용하는 것이 필요하다고 생각합니다. 또한 데이터 셋이 적을 경우(10000rows미만)에는 그렇지 않을 경우보다 좀 더 효과적일 수 있다고 생각합니다.

국밥장인김국밥
2023.04.24 16:10

제 답변이 질문을 주신 것에 비해 많이 미흡하지만 조금이라도 도움이 되셨으면 좋겠습니다. 

통닭먹으러
2023.04.24 16:14

감사합니다. 덕분에 진행하며 궁금했던 부분들을 어떤 방식으로 해결해 나아가야되는지 방향이 좀 잡히는 것 같습니다.
첫 데이콘이라 진행 과정에서 많이 미숙했고 결과에 대해 실망이 많이 컸는데 다음번에는 더 좋은 결과가 나올 수 있을 것 같다는 기대감이 드네요 ㅎㅎ
좋은 말씀 감사합니다.

통닭먹으러
2023.04.24 16:18

아 더불어 분석 과정에서 하나만 더 여쭙고 싶습니다. ㅎㅎ

전처리 과정과 모델 학습 과정을 진행하다 보니 결국 성능에 따라 전처리와 모델을 결정하게 되는데, 이때 전에 진행한 전처리 방식 또는 모델이 더 높은 성능을 내는 경우가 많았습니다.

다만, 전처리를 과정을 하나 진행 또는 수정할 때마다 모든 과정을 각각의 코드로 따로 저장하기 힘든데 과거부터 지금까지 진행한 전처리와 모델 학습 과정을 저장? 또는 기록하는 팁이 있을까요?

실제 처음 진행했던 전처리가 가장 성능이 좋았었는데 나중에 해당 부분으로 다시 돌아가려 했더니, 이 변수에 로그 스케일을 취했던가, 이 순서대로 전처리를 진행했던가.. 하면서 다시 돌아가는데 시간이 많이 걸렸어서여.. ㅜ.ㅜ

국밥장인김국밥
2023.04.24 16:34

저는 진행 중인 코드에 변경할 사항이 있다면 그 코드를 복사한 사본에 수정하는 편이기는 합니다. 많이 번거로울 수는 있으나 가장 확실한 방법이라... 만약 코랩을 사용하신다면 좀 더 수월하게 정리하실 수 있습니다... (이미 몇 번 날려봤습니다...)
어쨌든, 수정 전의 코드를 남겨두는 게 가장 좋을 거라 생각해여!