랜덤 포레스트

  • 집단 학습을 기반으로 고정밀 분류, 회귀, 클러스터링 구형
  • 학습 데이터로 다수의 의사결정 트리를 생성
  • 무작위 샘플링과 다수의 의사결정 트리

결정트리

  • 분류와 회귀 모두 가능한 지도 학습 모델
  • 예/아니오 질문을 이어가며 학습
  • 한 번의 분기 때마다 변수 영역을 두 개로 구분 image.png

엔트로피

  • 불순도를 수치적으로 나타낸 척도로 높을수록 불순도도 높음
  • 엔트로피 1 = 불순도 최대를 의미하며 한 범주 안에 데이터가 정확히 반반임을 뜻함
In [1]:
import math
In [2]:
# 전체 엔트로피 공식으로 계산
P_slow = 0.5
P_fast = 0.5
Entropy = - P_slow * math.log(P_slow, 2) - P_fast * math.log(P_fast, 2)
Entropy
Out[2]:
1.0

랜덤 포레스트 예제

  • data
    • https://archive.ics.uci.edu/ml/datasets/Mushroom
    • UCI 머신러닝 레포지토리에 공개된 독버섯 데이터
    • 8124종류의 버섯 특징과 독 유무가 정리된 데이터
    • 첫 번째 열 : 독의 유무(p:poisionous, e:edible)
    • 두 번째 열 : 버섯 머리 모양(b:벨, c:원뿔, x:볼록, k:혹, s:오목)
    • 네 번째 열 : 버섯 머리 색(n:갈색, b:황갈색, c:연한갈색, g:회색, r:녹색, p:분홍색, u:보라색, e:붉은색, w:흰색, y:노란색)
In [3]:
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn import metrics
from sklearn.model_selection import train_test_split
In [4]:
# 1단계 - 디이터 읽기
mr = pd.read_csv('pyml_rev_examples/ch4/mushroom.csv', header=None)
mr.head(3)
Out[4]:
0 1 2 3 4 5 6 7 8 9 ... 13 14 15 16 17 18 19 20 21 22
0 p x s n t p f c n k ... s w w p w o p k s u
1 e x s y t a f c b k ... s w w p w o p n n g
2 e b s w t l f c b n ... s w w p w o p n n m

3 rows × 23 columns

In [5]:
# 2단계 - 데이터 내부의 기호를 숫자로 변환
label = []
data = []
attr_list = []
for row_index, row in mr.iterrows():
    # 라벨(독여부) 생성
    label.append(row.loc[0])
    row_data=[]
    # 나머지 데이터로
    for v in row.loc[1:]:
        row_data.append(ord(v)) # ord() : 특정 한 문자를 아스키 코드 값으로 변환
    data.append(row_data)
In [6]:
data[:1]
Out[6]:
[[120,
  115,
  110,
  116,
  112,
  102,
  99,
  110,
  107,
  101,
  101,
  115,
  115,
  119,
  119,
  112,
  119,
  111,
  112,
  107,
  115,
  117]]
In [7]:
# 3단계 - 학습 전용과 테스트 전용으로 데이터 분리
data_train, data_test, label_train, label_test = train_test_split(data,label)
In [8]:
# 4단계 - 데이터학습
clf = RandomForestClassifier()
clf.fit(data_train, label_train)
Out[8]:
RandomForestClassifier()
In [9]:
# 5단계 - 데이터 예측
predict = clf.predict(data_test)
predict
Out[9]:
array(['e', 'e', 'p', ..., 'p', 'p', 'p'], dtype='<U1')
In [10]:
# 6단계 - 결과 테스트
ac_score = metrics.accuracy_score(label_test, predict)
cl_report = metrics.classification_report(label_test, predict)
print('정답률:', ac_score)
print('리포틔:', cl_report)
정답률: 1.0
리포틔:               precision    recall  f1-score   support

           e       1.00      1.00      1.00      1050
           p       1.00      1.00      1.00       981

    accuracy                           1.00      2031
   macro avg       1.00      1.00      1.00      2031
weighted avg       1.00      1.00      1.00      2031

버섯 데이터 분류변수로 할당

In [11]:
test_dict = {'dic': {}, 'cnt':0}
test_dict['dic']['x'] = 0
test_dict['dic']
test_dict['dic']['y'] = 0
test_dict['dic']
Out[11]:
{'x': 0, 'y': 0}
In [12]:
# 데이터 내부의 분류 변수 전개
label = []
data = []
attr_list = []
for row_index, row in mr.iterrows():
    label.append(row.loc[0])
    exdata = []
    for col, v in enumerate(row.loc[1:]):
        if row_index == 0:
            attr = {'dic':{},'cnt':0}
            attr_list.append(attr)
        else:
            attr = attr_list[col]
        
        d = [0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0]
        if v in attr['dic']:
            idx = attr['dic'][v]
        else:
            idx = attr['cnt']
            attr['dic'][v] = idx
            attr['cnt'] += 1
            
        d[idx] = 1
        exdata += d
    data.append(exdata)
mr.head(3)
Out[12]:
0 1 2 3 4 5 6 7 8 9 ... 13 14 15 16 17 18 19 20 21 22
0 p x s n t p f c n k ... s w w p w o p k s u
1 e x s y t a f c b k ... s w w p w o p n n g
2 e b s w t l f c b n ... s w w p w o p n n m

3 rows × 23 columns

In [13]:
data_train, data_test, label_train, label_test = train_test_split(data,label)
In [14]:
clf = RandomForestClassifier()
In [15]:
clf.fit(data_train, label_train)
Out[15]:
RandomForestClassifier()
In [16]:
predict = clf.predict(data_test)
In [17]:
ac_score = metrics.accuracy_score(label_test, predict)
In [18]:
ac_score
Out[18]:
1.0

독버섯 판별 R로 작성 참고