미시건 대학교의 Data Science Specialization 과정은, 이름 그대로, 데이터사이언스에 대하여 폭넓게 가르친다. 데이터 전처리와 시각화부터 머신러닝을 활용하여 모델을 설계하는 작업까지 모두 배울 수 있는 수업이었는데, 개인적으로 정말 많은 것을 얻어갈 수 있었던 Specialization 과정 중 하나였다.

 

 매 코스마다 내주는 높은 난이도의 코딩 과제는, 수업 내용으로는 모자라서, 직접 추가 자료와 라이브러리 Documentation 들을 인터넷에서 찾아서 해결해야 했다. 이러한 과정은 꽤 힘들었지만, 지금 돌아와서 보면 이때 배운 내용들이 어렵게 배운만큼 정말 큰 도움이 된다고 느낀다. 또한, 일부 과제의 경우는 정해진 해답이 없이, 자신이 주제를 정하여 데이터 분석 과제를 수행한 후, 수업을 듣는 수강생들끼리 서로의 과제물을 채점하는 peer review형식으로 채점이 되었는데, 같은 문제를 가지고 다양한 방법으로 접근하는 열정적인 학생들을 보면서, 많은 아이디어를 얻음과 동시에, 큰 동기부여가 되었다.

 

 이 수업을 수강하면서 느낀점을 크게 세가지로 요약할 수 있을 것 같다.

 

 첫번째는, 데이터분석에서 절대로 빼놓을 수 없는 Python 의 pandas 라이브러리와 matplotlib 라이브러리를 제대로 이해하고 배웠다는 점이다. pandas 라이브러리는 쉽게 이야기하면 마이크로소프트의 엑셀과 비슷한 녀석이라고 생각하면 된다. 데이터를 열과 행으로 구성된 깔끔한 표의 형태로 나타낼 수 있도록 도와줄 뿐만 아니라, 프로그래밍 언어로 가능한 모든 연산을 데이터에 쉽게 적용할 수 있도록 해주고, 데이터를 자르고 합치는 모든 번거로운 작업들을 코드 몇줄로 끝나도록 해주는 마법같은 라이브러리다.

 마이크로소프트 엑셀의 경우는, 데이터를 입력하는 것은 편해도, 사실, 원하는 값을 얻기 위해, 데이터를 조작(manipulation) 하기에는 매우 무겁고 비효율적인 도구이다. 간단한 예시로, 엑셀은 데이터 행의 수가 몇 만줄만 되어도, 프로그램이 굉장히 무거워 질 뿐만아니라, 두 개의 엑셀 파일을 특정 컬럼의 데이터를 기준으로 교집합인 데이터 행만 합치거나, 특정 컬럼의 데이터만 추출해서 가공한 후, 새로운 컬럼을 생성하고 싶을 때, 이를 쉽게 할 수 있는 마땅한 방법이 거의 없다. 반면에, pandas 의 경우는 데이터의 행이 수백만 줄이 되더라도 성능 저하가 거의 없고, 아무리 복잡한 데이터 조작(manipulation)이더라도 코드 몇 줄만 작성하면 작업을 쉽게 끝낼 수 있다. 더군다나 pandas를 이용하면 엑셀파일도 읽어들일 수 있고, 작업한 내용을 엑셀파일로 저장할 수 있기까지 하니, 엑셀 노가다 경험이 많았던 나로서는 충격이 아닐수가 없었다.

 matplotlib의 경우는, 데이터를 바탕으로 차트와 플롯을 그려주는 라이브러리로, 엑셀에서 표를 바탕으로 차트를 그리는 것을 생각하면 이해가 쉬울 것이다. pandas와도 찰떡궁합으로, 데이터 전처리가 올바르게 되었는지 시각화 하거나, 결과물의 시각화를 통해 타인의 이해를 돕는데에 매우 유용한 라이브러리 중 하나이다.

 

 두번째는, Feature Engineering의 중요성에 대해 다시 한번 깨달았다는 점이다. Feature Engineering 이란, 수집한 데이터를 가공하는 과정에서, 데이터의 특성을 이해한 후, 유의미한 데이터를 골라내고, 머신러닝 모델에 집어넣을 수 있도록 재단하는 작업이다. 이 과정은 머신러닝 모델 뿐만아니라, 데이터 그 자체에 대한 깊이있는 이해를 필요로 한다.

 

 간단한 예로, 집 값을 예측하는 머신러닝 모델을 만든다고 생각해 보자. 우리가 갖고있는 데이터에는 집의 넓이(제곱미터), 방의 개수(숫자), 집의 종류('아파트'or'단독주택'or'오피스텔'), 집의 위치(주소),  총 4가지 값이 있다고 가정하자. 그럼 이 데이터들을 어떻게 활용하여야 할까?

 

 기본적으로 머신러닝 모델에 데이터를 투입하기 위해서는, 투입되는 데이터의 사칙연산이 가능해야만 한다. 집의 넓이와 방의 개수의 경우는 numeric value(숫자값)로서, 더하고 빼고, 곱하고 나누는 것이 가능하여 머신러닝 모델에 투입될 수 있다. 그러나 categorical value(종류값)인 집의 종류는 '아파트 + 단독주택' 이 아무런 의미가 없는 것처럼 일반적인 연산이 불가능하여 별도의 처리가 필요하다. 뿐만아니라, 집의 주소는 심지어 그냥글자이다. 글자를 어떻게 유의미한 값으로 변환해서 머신러닝 모델에 활용할 수 있을까?

 방법은 여러가지가 있겠지만, categorical value인 집의 종류의 경우는 one-hot encoding을 이용하면 집의 종류값을 여러개의 컬럼으로 쪼갠 숫자값으로 변환시킬 수 있다. 예시의 경우에는 '아파트' 를 (1,0,0) '단독주택' 을 (0,1,0), '오피스텔'을 (0,0,1) 로 변환하면, 사칙연산 및 비교가 가능해 지기 때문에, 머신러닝 모델에 투입할 수 있게 될 것이다.

 마지막으로 주소값의 경우는 글자이기 때문에, 이를 그대로 활용할수는 없다. 따라서, 주소값을 수치화하기 위해서, 주소에 해당되는 우편번호 값이나 경도값과 위도값을 주소값 대신 사용하여, 머신러닝 모델에 집어넣으면 될 것이다.

 하지만 아직 모든 것이 끝난 것은 아니다. 이대로 학습을 하게 되면, feature 간의 scale(범위)이 다르기 때문에, 학습 정확도가 떨어지거나, 학습이 오래걸릴 수 있다. 예를 들어, 집의 넓이의 값은 대부분 10~150 정도 범위의 숫자일 것이다. 반면에 방의 개수는 1~5 정도의 범위안에 들어가는 숫자가 대부분일 텐데, 이런 경우, 모델이 학습을 하는 과정에서 방의 개수 보다는 집의 넓이의 값에 더 큰 영향을 받을 가능성이 높아진다. 따라서, 이를 방지하기 위해 Feature Scaling혹은 Normalization과 같은 작업이 필요하게 된다.

 이러한 특성들 때문에, Feature Engineering 과정은 분석자의 도메인지식이 매우 중요한 역할을 하는 부분 중 하나이다. 기업의 회계정보를 담고 있는 재무제표를 다룬다고 생각해보자. 관련 지식이 없다면, 재무제표에서 어떤 수치가 유의미한 수치인지 골라내는 데에도 어려움을 겪을 것이다. 또한, 유의미한 수치를 골라낸 이후에도, 만약 feature 자체가 feature들 간의 상관성을 갖고 있는 경우, 무작정 Feature Scaling을 해버리면 데이터가 내포하는 의미가 훼손되기 때문에 많은 고민을 해야한다. 더군다나 시계열 데이터가 섞여있는 경우에는, Data Leakage가 일어나지 않도록 유의해야 하는데, 이러한 모든 과정들이 머신러닝, 딥러닝 모델을 만들고 학습시키는 것보다 더 많은 노력과 시간을 필요로 한다는 점을 깨달을 수 있었다.

 

 마지막으로 느낀점은, 머신러닝과 딥러닝은 데이터사이언스의 일부분일뿐이라는 것이다. 아무리 알파고가 사람보다 바둑을 잘두고, 인공지능 왓슨이 의사보다 암을 잘 찾아내도, 컴퓨터는 아직까지도 계산기일 뿐이다. 머신러닝 알고리즘은 수십년 전부터 존재해왔었던 것들이며, 현대에 들어서 인터넷의 등장으로 데이터의 수집이 용이해지고, 컴퓨터의 성능이 비약적으로 발전하면서 상용화가 가능하게 되자, 마치 없었던 것이 처음 발견된 것처럼 인식되는 것이다. 

 즉, 컴퓨터는 추론을 할 수 없다. 추론을 하는 것처럼 흉내내는 것일 뿐이다. 그리고 흉내내는 방법은 인간이 하나하나 데이터를 주입시켜 가르쳐 주어야만 한다. 예를 들어보자. 어린아이, 혹은 심지어, 강아지들도 컵이 책상위에서 떨어지면 피하는 시늉을 한다. 왜그럴까? 컵이 공중에 뜨게 되면 떨어진다고 누군가에게 교육을 받아서 인지하는 것일까? 아니다. 여러번의 관찰을 통해 자연스럽게 사물은 공중에 뜨면 떨어진다는 것을 은연중에 깨닫는 것이다. 즉, 중력의 개념을 자연스레 이해하게 된다. 그리고 이러한 개념을 한번 깨닫게 되면 컵뿐만이 아니라 사과, 펜, 휴대폰 등 다른 물건들도 책상을 이탈하면 똑같이 떨어진다는 것을 알게 된다. 그러나 컴퓨터는 아니다. 컵이 책상에서 이탈하면 떨어진다는 사실을 10만번의 예시를 주입시켜 학습시키고 나면, 컴퓨터도 컵이 떨어질 것이라는 것은 사람만큼 정확하게 예측할 수 있다. 그러나, 컵이아닌 사과 혹은 휴대폰이 떨어지는 경우에는 전혀 답을 내놓지 못하게 된다. 

 이를 극복하기 위해 최근, Transfer Learning(전이학습)을 통해 미리학습된 딥러닝 모델을 다른분야에도 적용할 수 있도록 알고리즘에 대한 연구가 계속 되고 있지만, 아직까지 자연어처리 분야를 제외하면, Transfer Learning은 굉장히 제한적인 것이 현실이다. 즉, 사람은 하나를 가르쳐 주면 열을 알지만, 컴퓨터는 하나를 가르쳐주면 하나만 안다.

 따라서, 여러가지 태스크에 대한 머신러닝 모델을 설계할 때 가장 중요한 것은 바로 데이터의 수집과, 처리이다. 앞서 말했던 것과 같이, 데이터를 어떻게 수집하느냐, 어떻게 유의미한 feature 들을 추출, 가공하느냐가 머신러닝과 딥러닝만큼이나 중요하다는 것을 몸소 깨달을 수 있었다.

 

 

 

 

 

블로그 이미지

찰리와마약공장

,