PROBLEM
Problem info
competition
San Francisco Crime Classification (Kaggle)
Theme
Multi-Class Classification
metric
multi-class log loss
Notes
- 1934년~1963년 샌프란시스코 지역에서 발생한 범죄 데이터로, 주어진 시간과 장소에서 발생한 범죄의 종류를 예측하는 다중 분류 문제입니다
- target이 되는 범죄 유형은 총 39개로 test셋 데이터 정보를 활용하여 각 범죄에 대한 발생 예측에 대한 확률을 최종적으로 제출하면 되겠습니다
- 변수는 Dates(범죄발생시각), Category(종속변수, 범죄유형), Descript(범죄설명), DayOfWeek(요일), PdDistrict(관할지역명), Resolution(범죄해결여부), Address(범죄발생장소), X(경도), Y(위도)로 이루어져 있습니다. 결측은 없고, 중복은 있습니다.
- 어느덧 5주차로 분류의 마지막 장입니다. 지금껏 해왔던 시간정보, 공간정보를 모두 활용 할 수 있는 문제로 보입니다.
- 1주차(따릉이)에서 시간 정보 활용한 피쳐 엔지니어링, 결측 처리, 데이터 인코딩을,
- 2주차(타이타닉우주선)에서 EDA, imputer, scaler, automl tool을,
- 3주차(제주도로)에서 target encoder, 공간 정보 활용한 피쳐 엔지니어링을,
- 4주차(엘리스사이트)에서 CountVectorizer, 시퀀셜 데이터 처리, 교차검증(TimeSeriesSplit)을 다뤘습니다.
- 한달간 다양한 분야를 다뤄 볼 수 있었던 것 같아 의미 있는 시간이었던 것 같습니다! 다들 바쁘신데 잘 준비해 주셔서 감사합니다👍🏻
- 5주차는 성능에 구애받지 말고 자유롭게 평소에 못해본 새로운 시도를 해보는 주차였으면 좋겠습니다!
refer
Review
- 5주차의 multi class classification 문제이다. 범죄 사건의 데이터가 주어지고 범죄 종류를 분류하는 문제다. 사실 4주차 세션을 내가 담당했을때 선정하려던 문제이기도 했으나, 데이터 칼럼이 몇 개 안되어 넘겼었다.
- target, id를 제외한 8개의 feature가 존재한다. 특이점은, test에는 존재하지 않는 feature가 2개 있다는 것이다.
- 사건 발생일, 요일, 담당 서, 주소, 좌표 값 등이 주어진다.
- 사건에 대해 보다 상세한 descript, resolution feature가 train에만 주어진다.
- 우선 test에 없는 feature는 당장 의미가 없으므로 제외하고 전처리를 진행했다. 사건 일시에서 년도, 월, 시각 feature를 뽑아냈다.
- 이후 target 값에 label encoding을 진행하고 cardinality 100 이하에 대해선 one-hot, 나머지는 label encoding 진행했다.
- MI feature selection 진행했으나 결과값에 차이를 확인하진 못했다.
- 대부분이 categorical feature이므로 catboost를 사용해보았다. encoding을 진행하지 않은 상태로 catboost를 돌려보고, 자체적으로 encoding 한 후 catboost와 xgboost에 돌려봤다.
- 가장 결과가 좋은것은 encoding 한 후 catboost에 적용한 것이다. 그러나 경우 간에 큰 성능 차이가 있진 않았다.
- 'Descript'를 활용할 방안으로, 두 개의 모델을 활용하는 아이디어가 있었다. 하나는 X -> D, 다른 하나는 D -> y로 가는 모델을 짜는 것이다. D -> y의 경우 상세한 Descript에서 category로 가는 것이라 높은 상관관계가 있을 것이라 생각했고, X -> D가 X -> y보다 성능이 더 좋을 수 있다 생각했다. (D의 cardinality가 크므로)
- D -> y는 예상대로 모델 성능이 매우 뛰어났으나, D의 cardinality가 800을 넘어서는지라 X -> D의 모델 학습에 과부하가 걸려 에러가 났다. 한 스터디원분이 이에 대해 차라리 신경망을 구성했다면 엄청난 성능을 보였을 것이라 첨언했다.
- 좌표 값이 주어졌으므로 지도에 직접 그려보는 스터디원분, 커널이 많았다. 나는 귀찮아서 생략했는데, 꽤 좋은 라이브러리를 소개해주셔서 다음부터 시도해보려한다.
- Descript가 test에도 존재했다면 문자열 파싱 등으로 다양한 시도가 나왔을 것 같은데, 이 부분에서 조금 아쉬웠다.
스터디 논의 내용
- multiprocessing library → python process-based parallelism library
-
아래 링크 참고함 & 예시
How to share pandas DataFrame object between processes?
from multiprocessing import *
manager = Manager()
ns = manager.Namespace()
ns.df = df_result
n_jobs = 10
def put_result(i_job):
i_start = int(i_job * len(preds)/n_jobs)
i_end = int((i_job + 1) * len(preds)/n_jobs)
for i in range(i_start, i_end):
ns.df.iloc[i][preds[i]] = 1
procs = [Process(target=put_result, args=[i]) for i in range(n_jobs)]
for proc in procs:
proc.start()
for proc in procs:
proc.join()
df_result = ns.df
- coordinate data → feature engineering?
- folium → geometric visualization library folium 이용해서 더 예쁘게 범죄spot 그리기 Folium and Other Visualization. Models, etc.
folium tutorial
Topic
'해석 가능한 ML'을 주제로 'LIME', 'SHAP'의 두 가지 방법론을 다뤘다.
Code
Github