티스토리 뷰

파이썬

[기계학습]랜덤 포레스트

크롬볼쯔 2018. 4. 5. 23:16

최근 기계 학습과 관련한 프로젝트를 진행하며 얻게된 지식들을 공유하고자 합니다.


먼저 최근에 사용하고 있는 랜덤 포레스트에 대해서 설명드리고자 합니다. 위키에서 쉽고(?) 자세하게 설명이 되어 있으므로 여기서는 간단히 장단점만 설명하고자 합니다.


위키 url입니다.

https://ko.wikipedia.org/wiki/%EB%9E%9C%EB%8D%A4_%ED%8F%AC%EB%A0%88%EC%8A%A4%ED%8A%B8



랜덤 포레스트의 장점은 


1. 딥러닝과 비교했을 때 사람이 직관적으로 이해하기 쉽습니다.

 딥러닝(심층심경망)의 경우, 결국 컴퓨터에게 알아서 좋은 결과가 나오도록 튜닝해달라고 맡기는 방식이므로, 결과의 accuracy가 높다 하여도 왜 높은지 설명하기가 어렵습니다. 이는 신뢰와 관련되어 있습니다. 

 고객에게 '고객님. 고객님은 a 행동을 하셨고, b행동을 하셨기 때문에 이와 관련된 c물건을 추천해드립니다.' 라는 명쾌한 설명과 함께 추천이 이루어진다면, 듣는 사람에게 신뢰를 줄 수 있습니다.

 반면 딥러닝의 경우 '고객님. 잘은 모르는데 컴퓨터가 만들어줬어요. 설명은 못하겠지만 이게 고객님께 어울리는 최고의 물건입니다.' 라는 말을 한다면, 듣는 사람도 약간 속는 느낌이 들 수 있습니다. 

  

2. 코딩이 쉽습니다.

 파이썬에서는 scikit-learn 을 활용하면 6-7줄이면 코딩을 할 수 있습니다. 게다가 범주형 자료는 pd.get_dummies와 같은 함수를 통해 한 번에 원핫코딩으로 변환할 수 있습니다. 


3. 성능이 우수합니다.

 딥러닝이 성능이 우수하다고 하나 많은 데이터가 있는 경우이고, 데이터가 적은 경우에는 오히려 랜덤 포레스트가 더 좋은 성능을 발휘하기도 합니다.


4. classification과 regression이 모두 가능합니다.


랜덤 포레스트의 단점은 클레스가 많은 경우에 사용시 성능이 좋지 않습니다.

또한 데이터가 적은 경우에도 성능이 좋지 않습니다.


그리고 파이썬으로 랜덤 포레스트를 사용할 때는 단점이 존재합니다. 바로 원핫코딩부분인데요. 범주데이터는 모두 원핫코딩으로 변환해야한다는 단점이 있습니다.

(저는 더미코딩으로 배웠으나 IT쪽에서는 원핫코딩으로 부르는 것 같습니다. )


예를 들면 다음과 같습니다.


빨강, 파랑, 노랑이라는 색을 의미하는 자료가 테이블 형태로 존재한다면 아마도


 컬럼명

 color

 1

 red

 2

 blue

 3

 yellow

위와 같은 형태로 존재할 것입니다.


R로 랜덤 포레스트를 사용하고자 하는 경우. 각각의 value를 factor로 인식합니다.

WEKA에서는 nominal variables로 선택하면 됩니다.


파이썬은... scikit-learn를 사용해야 합니다. 문제는 scikit-learn에서는 모든 데이터를 숫자로 입력해야한다는 점입니다.


뭐야 그럼 red를 1로 blue를 2로 yellow를 3으로 입력하면 되는거 아니야?


라고 생각하실 수 있겠지만, 그리한다면 scikit-learn에서는 연속형 자료로 인식하여

yellow는 blue나 red보다 높다 로 받아들입니다. 그 결과, 퍼포먼스는 형편없이 떨어지게 됩니다.


pandas의 get_dummies 함수를 사용해서 원핫으로 변환하면 다음과 같이 데이터가 변합니다.

 컬럼명

color 

 red

 blue

 yellow

 1

 red

 1

 0

 0

 2

 blue

 0

 1

 0

 3

 yellow

 0

 0

 1


위와 같이 변경후, color 컬럼만 제거한 후, 학습에 활용하면 연속형 자료로 인식하는 문제는 해결이 됩니다. 


하지만 두번째 문제가 기다리고 있습니다.


바로 메모리(정확히 말하면 RAM) 문제입니다.


위처럼 소규모의 데이터인 경우, 큰 문제는 없습니다. 단 제가 요즘에 다루고 있는 자료는 범주만 4,200개에 달합니다. 

요컨데 1*1 데이터 프레임으로 표현가능한 것을

1*4,200 으로 변경해서 다루어야 한다는 겁니다. 

그런 데이터가 10만개 있는 경우 데이터는 100,000 * 4,200 이라는 어마무지한 크기의 형태로 변합니다. 


이런 데이터를 읽을 때마다 컴퓨터는 저에게 살려달라고 요동을 칩니다.(제 컴퓨터의 램 메모리는 16GB입니다.) 


실제로 학습에 사용할 때는 여러 속성을 가진 하나의 feature만 사용하는 것이 아니라 다속성을 가진 여러 feature들을 사용하게 됩니다.


쇼핑몰을 예로 들자면 쇼핑몰에서 들어가서 메뉴를 살펴보면 제공하는 전자제품, 의류, 등등 카테고리가 매우 많습니다. 하위로까지 내려가면 200~300여개의 카테고리가 있다고 가정하고,  성별이 여자이고 20대인 고객이 어떤 물건을 살지 안살지를 예측한다면 


 컬럼명

 카테고리

 성별

 나이

 value

 전자,의류...

 남/여

 1~99

 컬럼수

 300

 2

 범주화에 따라 다르지만 10으로 나누면 10개


300+2+10 = > 312개의 컬럼으로 늘어납니다.

학습에 필요한 데이터는 

300(카테고리별)*2(성별)*10(나이범주별)*30(최소30명에 대한 데이터) 

= 180,000 개가 필요합니다.


지금까지만 해도 180,000*312 크기를 가진 데이터 프레임이 되는데요.

성능을 더 높이기 위해 feature를 추가해야하는 변수들이 있다면.


데이터 프레임 크기 = (180,000*추가할feature수*속성수)*312 


Memory out.. 이라는 문구를 보시게 될 겁니다.



언젠가는 scikit-learn 버전업이 되면서 이러한 문제가 해결되지 않을까 하고 기대하며

오늘 포스팅을 마칩니다.







댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함