티스토리 뷰

Untitled7

의사결정 트리 파이썬 코드 실습

(1)패키지 로드

In [1]:
from sklearn.metrics import classification_report, confusion_matrix

sklearn.metrics는 scikit-learn 패키지 중 모델 평가에 사용되는 모듈이다.
sklearn.metrics 패키지의 모듈 중 classification_report는 주요 분류 측정 항목을 보여주는 보고서 모듈이다.
confusion_matrix는 분류의 정확성을 평가하기 위한 오차행렬 계산 모듈이다.

In [2]:
from sklearn.model_selection import train_test_split

sklearn.model_section은 scikit-learn 패키지 중 클래스를 나눌 때, 그리고 함수를 통해 train/test셋을 나눌 때, 아울러 모델 검증에 사용되는 서브 패키지 이다.
sklearn.model_selection 패키지의 모듈중 train_test_split은 배열 또는 행렬을 임의의 훈련 및 테스트 셋으로 분할하는 모듈이다.

In [3]:
from sklearn.tree import DecisionTreeClassifier
In [4]:
from sklearn import tree

sklearn.tree는 scikit-learn 패키지 중 분류 및 회귀를 위한 의사결정 트리 기반 모델이있는 서브 패키지 이다.
sklearn.tree 패키지의 모듈 중 DecisionTreeClassifier는 의사결정 트리 분류 모듈이다.

In [5]:
from IPython.display import Image

Iphython.display는 Ipython 내에 정보를 보여주는 도구용도의 공용 API이다.
IPython.display API 모듈 중 Image는 원시(raw)데이터가 있는 png나 jpeg등의 이미지 객체를 만드는 모듈이다.

In [7]:
import pandas as pd

pandas는 데이터를 구조화된 형식으로 가공 및 분석할 수 있도록 자료구조를 제공하는 패키지이다.
여기서 as pd는 pandas를 약칭 pd로 사용한다는 의미이다.

In [8]:
import numpy as np

Numpy는 Numerical Python으로 고성능 계산이나 데이터 분석에 유용한 패키지 이다.
as np는 numpy를 약칭 np로 사용한다는 의미이다.

In [9]:
import pydotplus     # Anaconda Prompt에서 pip install pydotplus 라고 치면 pydotplus가 설치된다.

pydotplus는 그래프를 생성하는 graphviz의 dot 언어를 파이썬 인터페이스 제공하는 모듈이다.

In [10]:
import os

os는 운영체제와 상호작용하기 위한 기본적인 기능(경로 생성, 변경 등)이 제공되는 모듈이다.

(2)데이터 로드

In [11]:
tennis_data = pd.read_csv('C:/myPyCode/data/playtennis.csv')
tennis_data
Out[11]:
outlook temp humidity windy play
0 sunny hot high False no
1 sunny hot high True no
2 overcast hot high False yes
3 rainy mild high False yes
4 rainy cool normal False yes
5 rainy cool normal True no
6 overcast cool normal True yes
7 sunny mild high False no
8 sunny cool normal False yes
9 rainy mild normal False yes
10 sunny mild normal True yes
11 overcast mild high True yes
12 overcast hot normal False yes
13 rainy mild high True no

(3)데이터 전처리

다음 코드는 변수 tennis_data의 각 컬럼(outlook, temp, humidity, windy, play)의 값(sunny, overcast, ... 등)을 문자열(string) 타입에서 숫자(int) 타입으로 대치(replace)해 변수 tennis_data에 저장한다.

In [12]:
tennis_data.outlook = tennis_data.outlook.replace('sunny',0)
tennis_data.outlook = tennis_data.outlook.replace('overcast', 1)
tennis_data.outlook = tennis_data.outlook.replace('rainy',2)

tennis_data.temp = tennis_data.temp.replace('hot',3)
tennis_data.temp = tennis_data.temp.replace('mild',4)
tennis_data.temp = tennis_data.temp.replace('cool',5)

tennis_data.humidity = tennis_data.humidity.replace('high',6)
tennis_data.humidity = tennis_data.humidity.replace('normal',7)

tennis_data.windy = tennis_data.windy.replace(False,8)
tennis_data.windy = tennis_data.windy.replace(True,9)

tennis_data.play = tennis_data.play.replace('no',10)
tennis_data.play = tennis_data.play.replace('yes',11)

tennis_data
Out[12]:
outlook temp humidity windy play
0 0 3 6 8.0 10
1 0 3 6 9.0 10
2 1 3 6 8.0 11
3 2 4 6 8.0 11
4 2 5 7 8.0 11
5 2 5 7 9.0 10
6 1 5 7 9.0 11
7 0 4 6 8.0 10
8 0 5 7 8.0 11
9 2 4 7 8.0 11
10 0 4 7 9.0 11
11 1 4 6 9.0 11
12 1 3 7 8.0 11
13 2 4 6 9.0 10

(4)속성과 클래스 분리

In [13]:
X = np.array(pd.DataFrame(tennis_data, columns=['outlook','temp', 'humidity', 'windy']))

변수 tennis_data의 컬럼(outlook, temp, humidity, windy)의 값들을 데이터프레임 형태로 추출하고 np.array 함수를 이용해 추출한 데이터를 배열형태로 변환한 후 변수 X에 저장한다.

In [14]:
y = np.array(pd.DataFrame(tennis_data, columns=['play']))

변수 tennis_data의 컬럼(play)값을 데이터프레임 형태로 추출하고 np.array 함수를 이용해 추출한 데이터를 배열형태로 변환한 후 변수 y에 저장한다.

In [15]:
X_train, X_test, y_train, y_test = train_test_split(X,y)

로드(load)된 train_test_aplit 모듈을 이용해 변수 X에 입력 4개 컬럼의 데이터와 변수 y에 입력한 playtennis 컬럼의 데이터를, train(훈련)과 test(테스트)로 구분해, 임의의 개수로 각각 변수 X_train, X_test, y_train, y_test에 저장한다.

In [16]:
X_train
Out[16]:
array([[0., 4., 6., 8.],
       [2., 4., 6., 8.],
       [0., 3., 6., 8.],
       [0., 3., 6., 9.],
       [1., 4., 6., 9.],
       [2., 4., 6., 9.],
       [2., 5., 7., 9.],
       [0., 4., 7., 9.],
       [1., 3., 7., 8.],
       [0., 5., 7., 8.]])
In [17]:
X_test
Out[17]:
array([[2., 4., 7., 8.],
       [2., 5., 7., 8.],
       [1., 3., 6., 8.],
       [1., 5., 7., 9.]])
In [18]:
y_train
Out[18]:
array([[10],
       [11],
       [10],
       [10],
       [11],
       [10],
       [10],
       [11],
       [11],
       [11]], dtype=int64)
In [19]:
y_test
Out[19]:
array([[11],
       [11],
       [11],
       [11]], dtype=int64)

(5)데이터 학습

In [20]:
dt_clf = DecisionTreeClassifier()

로드된 의사결정 트리 분류 모듈을 변수 dt_clf에 저장한다.

In [21]:
dt_clf = dt_clf.fit(X_train, y_train)

의사결정 트리 분류 모듈이 저장된 변수 dt_clf 의 함수 fit()변수 X_train, y_train 을 입력해 의사결정 트리 분류 모델을 생성한다.
그런 다음 생성한 모델을 다시 변수 dt_clf에 저장한다.

In [22]:
dt_prediction = dt_clf.predict(X_test)

변수 dt_clf의 함수 predict()에 변수 X_test를 입력한다. 그리고 입력한 X_test에 대한 클래스 예측 값을 변수 dt_prediction에 저장한다.

(6)의사결정 트리 그래프 표현

IPython 내에서 그래프를 표현하는 소프트웨어인 graphviz 설치과정에 대해 알아보자.
Windows 환경의 최신버전인 graphviz-2.38을 설치하기 위해 https://graphviz.gitlab.io/_pages/Download/Download_windows.html 에 가면 다운로드가 가능한 msi와 zip 두 가지 종류의 확장자를 가진 파일 중 graphviz-2.38.msi 파일을 다운로드 한다.
파일을 (기본경로) C:/Program Files (x86)에 설치한다.

In [23]:
os.environ["PATH"] += os.pathsep + 'C:/Program Files (x86)/Graphviz2.38/bin/'

ipython 내에서 그래프를 생성할 수 있는 인터페이스 경로를 추가 설정하는 부분이다. Graphviz2.38 소프트웨어의 bin 폴더가 있는 경로인 C:\Program Files (x86)/Graphviz2.38/bin/를 os 모듈 중 경로 구분 기호를 반환하는 함수인 os.pathsep을 이용해, 환경변수들을 나타내는 사전함수인 s.environ['PATH']에 동적으로 할당해 저장한다.

In [24]:
feature_names = tennis_data.columns.tolist()

트리표현 함수에 입력되는 파라미터 중 하나인 feature_names에 값을 입력하기 위해, 변수 tennis_data의 각 컬럼명을 list형태로 변환한 후 변수 feature_names에 저장한다.

In [25]:
feature_names = feature_names[0:4]

저장된 변수 feature_names를 슬라이싱([0:4])해 outlook, temp, humidity, windy의 컬럼명을 추출한 다음 다시 변수 feature_names에 저장한다.

In [26]:
target_name = np.array(['Play No', 'Play Yes'])

트리표현 함수에 입력되는 파라미터 중 하나인 class_name에 값을 입력하기 위해, Target_class 값인 'Play No'와 'Play Yes'를 배열형태로 변수 target_name에 저장한다.

In [27]:
dt_dot_data = tree.export_graphviz(dt_clf, out_file = None,
                                  feature_names = feature_names,
                                  class_names = target_name,
                                  filled = True, rounded = True,
                                  special_characters = True)

Tree 패키지 중 의사결정 트리를 dot 형식으로 내보내는 함수인 export_graphviz() 를 이용해 트리 표현을 변수 dt_dot_data 에 저장한다.
dt_clf는 의사결정 트리 분류기, out_file은 의사결정 트리를 파일 또는 문자열로 반환(기본: tree.dot, None일 경우 문자열로 반환)이다.
feature_names는 각 features의 이름, class_names는 각 대상 class의 이름을 오름차순으로 정렬, filledTrue일 경우 분류를 위한 다수 클래스, 회귀 값의 극한 또는 다중 출력의 노드 순도를 나타내기 위해 노드를 색칠한다.
roundedTrue일 경우 둥근 모서리가 있는 노드 상자를 그리고 Times-Roman 대신 Helvetica 글꼴을 사용한다.
마지막으로 special_charactersTrue일 경우 특수 문자 표시를 한다.

In [32]:
dt_graph = pydotplus.graph_from_dot_data(dt_dot_data)

Pydotplus 모듈 중 dot 형식의 데이터로 정의된 그래프를 로드(load)하는 함수인 grap_from_dot_data() 에 변수 dt_dot_data를 입력한 후 다시 변수 dt_graph에 저장한다.

In [34]:
Image(dt_graph.create_png())
Out[34]:

변수 dt_graph에 대한 정보를 png 파일로 생성하는 함수 create_png() 를 사용한 후 이미지 객체를 만드는 Image 모듈을 통해 ipython 내에서 그래프를 표현한다.


출처: 파이썬을 이용한 빅데이터 분석


공지사항
최근에 올라온 글
최근에 달린 댓글
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
글 보관함