본문 바로가기
삼성 SDS Brightics

[삼성 SDS Brightics] 07 DACON 자율주행 센서의 안테나 성능 예측 AI 경진대회 후기_팀미션3탄

by 도은 2022. 9. 2.

.안녕하세요! Brightics 서포터즈 3기 

입니다.💙

지난 팀미션 2탄에서는

팀 분석 EDA와 데이터 전처리 그리고 분석 모델링에 대해 포스팅했었는데요!

오늘은 이어서 팀미션 3탄 모델링 적용 및 평가 진행할 예정입니다(*^o^*)

 

모델링 적용에 앞서,

지난 시간에는 제가 Brightics Studio에서 Python script 함수를 사용해

sklearn의 MultiOutputRegressor를 통해 모델링을 진행했는데요!

MultiOutputRegressor에 대해 궁금해하실 수도 있겠다는 생각이 들었어요.

그래서 오늘 포스팅에 대해 들어가기 전

MultiOutputRegressor에 대해 가볍게 설명해보도록 하겠습니다!

MultiOutputRegressor 개념

MultiOutputRegressor

여러 속성이 다수의 숫자형 데이터로 예측될 수 있는 다중출력회귀모델으로,

타겟 값(종속변수)이 여러 개일때 단일 모델로 여러 번 target을 fitting하여

다중 변수를 예측하는 함수입니다!

여러분.... 이게 무슨 말인가 싶으시죠?ㅎㅎ

저희 분석에 적용하여

예를 들어 말씀드리자면

저희가 사용하는 데이터는 56개의 독립변수 "X"를 활용해

14개의 종속변수 "Y"를 예측하는 것이 주 목적이었어요!

도합 70개의 변수를 종합적으로 생각해야 하는 모델인만큼

작성한 모델이 두 개 이상의 숫자 값을 예측해야하는 회귀 문제였답니다.

즉,예를 들어 작성한 단일 모델

MultiOutputRegressor를 이용한 LinearRegression으로

14개의 종속 변수를 예측해내야했죠!

그림으로는 위처럼 생각해볼 수 있어요.

민트색이 독립변수, 핑크색이 종속변수로 생각해주시면 될 것 같습니다.

주요 코드는

from sklearn.multioutput import MultiOutputRegressor

입니다.

이렇게 위와 같이 코드를 적어주면 MultiOutputRegressor를 활용하실 수 있어요.

출처: sklearn

하지만! 다중 종속 변수를 예측하는 모델이 MultiOutputRegressor만 있지는 않습니다.

위의 그림처럼 다중 변수를 위한 sklearn의 함수는 크게

Multiclass와 Multioutput

2가지로 나누어 볼 수 있습니다.

그렇다면, 왜 저희가 그 중 MultiOutputRegressor를 사용하셨는지 궁금하시겠죠?

출처: sklearn

위의 표를 보신다면, 그 질문에 대한 답을 해결하실 수 있으실 거에요!

먼저 저희가 target으로 하는 변수가 2개 이상이었고,

cardinality(관계수)가 연속적이었어요.

관계수란 feature 내의 값들의 수를 의미하는데,

저희 데이터 종속 변수가 continuous한 속성이었기 때문에

MultiOutputRegressoin을 선택했습니다.

그렇다면 다음으로, MultiOutputRegressor과 RegressorChain으로 가볼까요?

이름만 보신다면 어떤 차이가 있을 것 같나요?

뭔가 chain에 주목되지 않으세요??ㅎㅎ

답은 바로 상관관계에 있습니다!

MultiOutputRegressor는 target 당 단일 모델로 학습하는 만큼,

target의 상관관계(correlation) 정보를 고려하지 못합니다.

하지만, RegressorChain은 target 간의 상관관계를 고려할 수 있다는 장점이 있습니다.

엇 그렇다면, 당연히 RegressorChain를 사용해야 하는 것은 아닌가!

하는 생각이 드실 수도 있어요.

이는 target끼리의 종속성이 없다고 가정하면

그냥 한 번에 예측하는 MultiOutputRegressor를 사용하고,

만약 target끼리의 어떤 의존성이 있다고 가정하신다면

RegressorChain을 사용하시면 됩니다.

분석은 정확한 모델을 구현하는 것도 하나의 목적이지만

가용한 시간, 인력 등의 자원도 고려해야하기 때문이에요.

저희는 target된 종속변수 Y의 공정 흐름간의 의존성이 없다고 가정했고

빠른 시간 내에 결과를 내야했기 때문에

MultiOutputRegressor를 사용해서 모델링을 진행했어요!

자 드디어 MultiOutputRegressor에 대한 개념 설명이 끝났네요ㅎㅎ

설명이 가볍게 이해되셨다면 좋겠어요.

혹여나 더욱 자세히 알고 싶으시다면 하단의 링크에 방문해주세요^___^

<sklearn의 Multiclass and multioutput algorithms 설명>

https://scikit-learn.org/stable/modules/multiclass.html

<삼성 SDS의 Pre-built 모델; 공정 설비 제어를 위한 최적의 다중 공정 조건 예측>

https://www.brightics.ai/resources/pre-built-model/detail/113

 

모델링 오류 해결

저는 지난 포스팅에서 모델링 구현 업무를 담당했었어요.

각자 작성한 파트별로 팀원분께서 취합을 담당해주시기로 했는데,

모델 연결 부분에서 계속 오류가 뜬다고 하셔서

다같이 시도해봤는데요.

제가 짠 파이썬 코드이기도 하고,

기본 데이터에서는 정상 작동하는데!

왜 전처리 후 데이터에서는 오류가 나는 건지 너무 속상해서

제가 오류 해결 및 취합 엄무를 담당해보았습니다...!

기존 Flow

해결 Flow

두 가지 Flow를 비교해보시면 눈에 띄시는 점이​ 있으실 거에요!

지금부터 하나하나 설명해보겠습니다!!!

 

첫번째 오류: INPUT !=OUTPUT

가장 먼저 뜨는 오류였어요.

데이터를 가져올 수 없다.

후후 결론부터 말씀드리자면

해.결.했습니다 >__<

바로 PCA가 없어졌다는 점~

다른 팀원 분께서 PCA도 진행해주셨는데, output을 보니 기존 열+pca된 열이 함께 추가되어 있었어요!

또한 train에만 pca를 해주면, test의 열 구성이 달라지기 때문에

모델 학습이 어려웠던 문제였습니다.

따라서 저는 train의 pca를 삭제해주고,

그 전 함수인 normalization의 output 중

select column을 통해 선택된 #_standard열들을 input으로 설정해주었답니다.

문제 해결 완료!

두번째 오류: shape error

이번에는 위와 같은 오류가 뜨더라고요

열의 shape이 맞지 않다 라는 오류였어요.

그래서 사용되는 input 3가지를 살펴보았습니다.

기억나시나요??

input[0]은 train.csv

input[1]은 test.csv

input[2]은 sample_submission.csv 파일이었어요.

자 그렇다면 flow를 비교해보셨을 때, 눈치채주신 점이 있을까요??

바로바로

Add function 함수였어요!

 

다른 팀원분께서 train데이터에서 X_34~X_37를 평균낸

[분당 회전 수 평균]이라는 파생 변수를 만들어주셨는데요!

이는 test데이터에는 없던 열이기 때문에, 각 열의 수가 달라서

shape오류가 났던 거였어요!

그래서 저는 Add function 함수를 이용해

x_34567이라는 파생변수를 내는 함수를 추가

이 함수와 모델이 연결될 수 있도록 했어요ㅎㅎ

문제해결완료!

두 가지 오류를 해결하니까

이렇게 정상적으로 모델이 작동되더라구요ㅎㅎ

초록색이 너무나도 반가웠어요!

저는 오류를 해결 후 json을 추출해 팀원과 공유했습니다.

모델 평가

모델 평가가 추가된 Flow는 위와 같아요ㅎㅎ

저희가 참여하는 DACON에서 사용하는 평가 산식은

Normalized RMSE(NRMSE)이기에 이를 참고하여

모델평가를 진행해 주셨습니다.

다음으로, 모델 평가 과정에 대해 설명해주신 포스팅입니다 !

https://blog.naver.com/munsb2002/222862545384

 

최종결과

최종 결과는 하단과 같습니다~

다만, RandomForest 모델은 1시간을 돌렸는데도

결과가 나오지 않아서 중간에 중단했습니다ㅠㅠ

시간이 금이었기 때문에 어쩔 수 없던 선택이었어요... 흑흑

 
 

RMSE는 값이 작을수록 잘 예측한 것이기 때문에

가장 잘 예측한 모델은

약 22.1점의 GradientBoosting Regressor입니다!

느낀 점

Brightics 서포터즈 분들과 함께한 팀미션이었는데요!

사실 예상하지 못한 난관도 있었고(mutioutput....)

다같이 분석을 하자!가 초반의 목표였지만

개개인의 역량도 달라서

마지막에는 개별적으로 역할을 분담해서 미션을 진행할 수 밖에 없었어요

하지만! 오히려 효율이 더욱 좋았을 수도!!ㅎㅎ

각자 역할을 부여했기 때문에, 책임감도 생겼을 뿐더러

개인 일정에 맞추어 업무 순서를 정할 수 있어서 좋았습니다.

또한 오늘 말씀드린 MultiOutputRegressor를 사용한다면!

제조 공정에서의 설비 제어,

서버룸의 온도와 습도 예측,

특정 지역의 바람의 속도와 방향 예측 등

두 개 이상의 수치 변수를 예측해야하는 모델 구현시 다양하게 활용 가능하기 때문에

데이터의 특성 제한없이 회귀 예측 모델을 구현할 수 있다는 점~~~

Brightics Studio에 특정 함수가 없어도!

당황하지 않고

python script를 활용해 분석에 이용한다면

어떠한 분석도 가능하실 거에요ㅎㅎ

저희 팀미션을 통해 데이터의 난이도가 높고, 일반적인 모델이 아니라도

두려워하지 말고 어떤 주제라도 도전할 수 있다는 용기를

얻으셨으면 하는 바람입니다.

다음 포스팅은 팀 분석 4탄으로

팀 분석 미니 프로젝트 마무리/결과보고

분석 영상 기획서 작성​에 대해

자세히 소개해드리도록 하겠습니다.

추가적인 질문은 댓글로 부탁드려요!

다음주에 만나용@__@