본문 바로가기

머신러닝/[기타]

머신러닝 개발의 과정

저 같은 경우에는 머신러닝을 공부하기 시작한지 약 9개월 정도가 되었는데, 운이 좋게도 공모전 2개와 기업 협력 프로그램 1개에 참여해보았습니다. 그렇게 팀을 구성하여 프로그램을 진행할 때마다 느꼈던 점은, 머신러닝을 진행하는 코드는 왠만하면 어영부영 누구든 짤 수 있지만, 어떤 방향성의 코드를 개발해나가야하는가는 굉장히 어려워했다는 점입니다. 그러던 중 발견했던 아래의 내용들이, 개인적으로는 방향성을 잡아나갈 때 항상 좋은 힌트가 되었던 것 같아, 공유하고자 합니다.

1. 데이터에 대한 탐색

- 첫째로 법적 허용에 관한 문제입니다.

데이터를 수집하다보면 정말 다양한 종류의 데이터가 존재합니다. 공공기관에서 제공하는 데이터, 인스타그램 등의 SNS에서 스크래핑해올 수 있는 데이터, 네이버 검색 기록 데이터, 뉴스 데이터, 비영리단체 데이터 등... 이런 데이터가 개인 연구용으로 쓰이는 것까지 법적으로 금지하는 경우는 거의 없습니다. 그러나 사업화되어 이득을 취할 목적으로 데이터가 사용될어야 할 경우에는 반드시 법적인 문제를 확인(또는 라이센스를 확인)해야하는 과정이 필요합니다. 기업에 취직하여 데이터를 막 긁어모아 성공적인 모델을 만들었는데, 마지막에 법적인 문제가 걸려 손해를 보는 상황은 발생해서 안될 것입니다.

- 둘째로 데이터 접근에 관한 문제입니다.

데이터를 수집하다보면, 한 곳에서 깔끔히 정리된 데이터셋을 구하는 것은 하늘의 별따기입니다. 실제 데이터를 구할 때는 한 기업내에서도 여러 부서로 나뉘어 관리되고 있을 가능성이 높고, 각기마다 보안 규정이 다를 수 있습니다. 가령 제가 A 프로그램을 진행할 때, 각 지역 부서에 해당 데이터를 개인 연구용으로 받을 수 있겠느냐 물었는데 지역별로 다른 답변이 나왔습니다. 물론 전화를 받았던 담당자가 규정에 대해 잘못 이해한 경우도 있을 수 있습니다만, 실제 규정 자체가 다른 경우도 분명 있습니다.

- 셋째로 데이터 이해에 관한 문제입니다.

사실 데이터라는 것은 그것의 진정한 의미가 뭐냐- 하는 이해과정없이도 단순히 어떤 정도로만 인지한 상태로 사용될 수 있습니다. 그러니까 캐글에서 만나는 데이터셋은 보안상의 이유로, 해당 특성이 범주형인지 수치형인지, 해시처리된 값인지도 모르는 채 공개되는 경우가 있습니다만, 그럼에도 불구하고 머신러닝의 결과는 꽤나 잘 나오는 상황이 벌어집니다. 그러나 데이터의 의미에 대한 이해는 2가지 측면에서 중요합니다.

  • 해석가능한 모델의 구축: 특히나 의학관련 모델에서 중요한 문제입니다. 예를 들어, 이 사람은 비록 암에 걸렸지만 높은 확률로 생존할 것이다- 라는 것을 결론을 모델이 내놓았는데, 개발자도 의학 관련 전문의도 왜?라는 질문에 대한 답은 내놓지 못한다면, 아무리 정확도가 높은 모델이라 할지라도, 실용화되기는 힘들 것입니다.
  • 직관력 상승: 흔히 데이터 사이언티스트의 3가지 요건이라하면, 컴퓨터 공학, 수학, 그리고 도메인 지식을 꼽습니다. 직관력 상승은 도메인 지식과 관련한 측면입니다. 데이터의 의미를 잘 이해한다면, 알고있던 지식과 검색을 최대한 활용하여, 조금 더 직관적인 특성 공학(Feature Engineering)을 가능케합니다. 간단한 예시는 캐글/타이타닉의 Sibsp(함께 탑승한 형제,자매 또는 배우자의 수)와 Parch(함께 탑승한 부모, 아이의 수)를 결합하여 Family(가족)이라는 특성을 찾는 경우입니다. 물론 데이터의 의미를 파악하는 것은 쉽지않을 수 있습니다. 가령 특성명이 GRAG_PPK_NEW2라면, 이것의 의미를 파악하기 위해 수십 개의 엑셀 파일에서 힌트를 얻거나, 관련 부서에 일하는 이에게 질문을 하거나 등의 과정이 필요할 수 있습니다.

- 넷째로 데이터 정제에 관한 문제입니다.

우리가 마침내 데이터를 수집했더라도, 이것은 대개 지저분합니다. 때문에 모델에 적용하기 이전에, 우리는 이 데이터를 적당한 형식(Format,Type)으로 변환하는 과정이 필요합니다. 그리고 사실 이러한 데이터 정제과정이 머신러닝 프로젝트를 진행할 때 가장 오랜 시간을 차지합니다. 또한 같은 데이터셋이라도 해당 과정을 어떻게 처리했느냐에 따라 최종 모델의 정확도에 큰 영향을 끼칠 수 있습니다.

- 다섯째로 명확한 문제 정의에 관한 문제입니다.

개인적으로 가장 중요하며, 개발 과정의 모든 것을 꿰뚫는 핵심이라 생각합니다. 고등학생 시절 언어 과목을 공부할 때, 언어의 기술이라는 책에서는 이 한가지 문장만은 절대적으로 기억하라 했습니다. '발문을 똑바로 읽어라' 간단하게 발문은, 그냥 문제입니다. 많은 사람들이 그렇지 않은것을 찾는 문제를 그런 것을 찾는 문제로 잘못 읽고 실수로 틀린 경험이 있을 것입니다. 질문을 똑바로 이해하지 못한 것은, 자신에게 주어진 문제를 제대로 정의하지 못한 것이고, 문제가 무엇인지도 모르면서 풀이를 적어나가는 것은 있을 수도, 있어서도 안되는 일입니다. 가장 기본적인 것이지만, 그렇기에 자신이 아는 척한 것은 아닌지 항상 돌아봐야합니다. 특히나 머신러닝의 문제는 복잡하게 엉켜있는 경우가 많으며, 한 사람이 모든 코드를 진행하는 것이 아닌 팀원과의 협력으로 진행되기에, 자신을 포함한 모든 팀원들이 문제를 똑바로 정의하고 있는지, 서로 소통하는 과정이 반드시 필요합니다. 단 한사람이라도 문제에 대한 이해를 하지 못한다면, 다시 처음 단계로 돌아가야할 지 모릅니다.

2. 알고리즘에 대한 탐색

머신러닝 프로젝트를 진행할 때 가장 큰 고민 중 하나는 단연 어떤 모델을 선택해야 하는가일 것입니다. 머신러닝은 크게 분류(Classification), 회귀(Regression), 군집화(Clustering), 차원축소(Dimentionality reduction)이라는 4가지 목적으로 나뉘는데요. 이에 대한 답으로 파이썬 머신러닝의 사이킷런 패키지 에서는 아래의 가이드라인들을 제공하고 있습니다. 사실 그림이 정말 잘 설명되어 있기 때문에 그냥 한 번 읽어보시고, 추후 다시 한번 찾아보시면, 개발의 방향성에 큰 도움이 될 것 같습니다.

 

출처: scikit-learn.org, @chris_bour, districtdatalabs.silvrback

'머신러닝 > [기타]' 카테고리의 다른 글

데이터 스케일링(Data Scaling)  (2) 2020.03.16
특이값 분해(Singular Vector Decomposition, SVD)  (0) 2020.03.13
특성 선택(Feature Selection)  (0) 2020.03.09
분류 성능평가  (0) 2020.03.08
결측치(Missing Value) 처리  (2) 2020.03.06