Machine Learning

[AI class w6d5] Week6 과제 ML Basics 실습

makeitworth 2021. 6. 7. 13:05

어떤 데이터셋을 주고 예측하는 과제였다.

kaggle 대회가 아닌, 다른 곳에서 한(아마도 인도?) 데이터셋이었는데, 검색해보니, 아무래도 대회에 참가했던 인도 분들이 많이 있어서 인지 github에 코드가 꽤 올라와 있기는 했다.

그러나 강사님께서 따로 데이터를 좀 만지셨는지, 데이터셋이 완전히 같지는 않았고, 무엇보다 대회에서 요구한 지표가 다른지 이미 올라와 있는 노트북들은 대부분 classifier로 문제를 해결했는데, 이번 과제는 평가지표를 MAE로 하라고 했다.

참고 : 모델 성능 평가지표

 

예측해야 하는 값은 delivery time 이었는데, time이기 때문에 연속적인 변수이고, 평가지표도 MAE로 요구하였기 때문에 과제는 회귀모델로 분석하였다.

그런데 실제 y label의 value를 살펴보면, 연속적인 결과가 아니라 30, 60, 90 등등의 7개 정도의 정해진 정수 값이었고, 따라서 이를 label encoding 한 다음 분류 모델을 돌린 것이다.

 

어째튼 이번 과제에서 내가 고민한 지점들은 이것이다.

 

1. 한 컬럼에 multiple values가 들어간 categorical variable

이 데이터 셋의 'Cuisines' 컬럼의 경우 'Fast Food, dessert, coffee' 이런 식으로 여러 개의 값이 들어갈 수 있다.

한 개일 수도, 여러 개일 수도 있고, 값의 제한도 없다. 

이런 형태의 변수는 어떻게 처리해야할까?

나는

쉼표로 쪼개서 가장 갯수 많았던 경우를 기준으로 컬럼을 모두 만들고 하나씩의 value를 만들고

1) 각 컬럼 별로 라벨 인코딩

2) 전체를 합쳐서 count vectorizer(원핫인코딩처럼)

하는 방법을 사용해 봤는데, 생각보다 score 차가 크지 않았다.

시간이 넉넉히 있었다면, 음식을 장르로 나눠서 categorization하는 방법도 생각해봤지만 하나의 row에서 여러 개의 value들이  전혀 장르가 달라 보이는 경우도 있었기 때문에 (Indian과 coffee 처럼) 시도해보지 않았다. 

 

2. 연속 변수 들에서 결측치가 많았다. 심하면 20% 가까이까지. 결측치를 어떻게 처리할 것인가?

-> 1에 너무 집중하느라 2는 그냥 중간값으로 떼려 넣어 버렸는데, 여기서 모델 성능이 떨어지게 된 것 같다. 더 좋은 성과를 보인 다른 친구에게 물어보니, 결측치를 그렇게 일률적으로 채우지 않고, 다른 변수를 활용해서 차별적으로 채웠다고 했다.

 

3. 손실함수

과제에서 MAE 뿐 아니라 추가로

under-prediction / over-prediction 개념을 이야기하면서 

1) under-prediction ratio 지표도 제출하시오 (under-prediction의 비율이 낮으면 좋음)

2) under-prediction 되었을 때가 over-prediction 되었을 때 보다 소비자 만족도가 2배 더 낮다

라는 description이 있었다.

 

나는 그래서 randomized의 scoring 파라미터에 내가 직접 2번 조건에 맞게 정의한 함수를 넣어서 계산해 보았으나, 기본적인 모델이 성능이 좋은 편이 아니었기 때문에 드라마틱한 결과의 차이는 낫지 못했다.

https://scikit-learn.org/stable/modules/model_evaluation.html#scoring-parameter