파이썬(Python) - 의사결정트리
오늘은 파이썬을 활용해서 scikit-learn 라이브러리의 의사결정 트리를 간단하게 학습하고 관련
결과를 시각화 시키는 간단한 예제 소스를 공유하고자 합니다.
보통 R을 활용해서 간단하게 구현가능하지만, 필드에서 파이썬을 활용하는 경우도 많기에 이와 같은
예제를 간단하게 구현해보았습니다.
의사결정트리는 다양한 규칙을 순차로 적용하면서 독립변수의 공간을 분류하고 기준값을 정하는 모델
이라고 할 수 있습니다.
매우 직관적인 분류모델이고 자료의 결과를 해석하기가 용이해서 많이 사용하는 알고리즘이라고
볼 수 있습니다.
그러면 문서 하단에서 간단하게 예제를 작성해보겠습니다.
파이썬(Python) - 의사결정트리(Decision Tree) 예제 소스
파이썬의 graphviz의 pydot을 활용하면 쉽게 의사결정트리를 시각화 할 수 있습니다.
어렵지 않은 코드 이므로, 차근차근 살펴보시면 쉽게 이해하실 수 있습니다.
dicisionTree1.py
123456789101112131415161718192021222324252627282930313233343536373839404142434445 from sklearn.tree import DecisionTreeClassifier, export_graphvizfrom sklearn.datasets import load_breast_cancerfrom sklearn.cross_validation import train_test_split#Dot to pngimport pydot #온라인 시각화#https://dreampuf.github.io/GraphvizOnline #샘플 데이터 로드(유방암 데이터 세트)cancer = load_breast_cancer() #훈련, 테스트 데이터 셔플X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42) #의사결정 트리 선언dTreeAll = DecisionTreeClassifier(random_state=0) #훈련 (모든 리프 노드 사용)dTreeAll.fit(X_train, y_train) #점수 출력print("Train Set Score1 : {:.2f}".format(dTreeAll.score(X_train, y_train)))print("Test Set Score1 : {:.2f}".format(dTreeAll.score(X_test, y_test))) #의사결정 트리 선언(트리 깊이 제한)dTreeLimit = DecisionTreeClassifier(max_depth=3, random_state=0) #훈련 (가지치기 : 리프노드 깊이 제한)dTreeLimit.fit(X_train, y_train) #점수 출력print("Train Set Score2 : {:.2f}".format(dTreeLimit.score(X_train, y_train)))print("Test Set Score2 : {:.2f}".format(dTreeLimit.score(X_test, y_test))) export_graphviz(dTreeLimit, out_file="dicisionTree1.dot", class_names=["malignant","benign"], feature_names=cancer.feature_names, impurity=False, filled=True) #Encoding 중요(graph,) = pydot.graph_from_dot_file('dicisionTree1.dot', encoding='utf8') #Dot 파일을 Png 이미지로 저장graph.write_png('dicisionTree1.png') cs
- 1-3번 라인 : scikit-learn 관련 라이브러리, 예제 데이터 로드
- 18번 라인 : decision tree 객체 생성
- 21번 라인 : decision tree 훈련
- 28번 라인 : decision tree 객체 생성(리프 노드 깊이 제한)- 31번 라인 : decision tree 훈련(28번 라인에서 선언한 의사결정트리)
- 38번 라인 : graphbiz 의사결정 트리 시각화 작업
- 42번 라인 : dot 파일로 encoding 작업
- 45번 라인 : 결과물을 이미지(png) 파일로 저장
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 32 33 34 35 36 37 38 39 40 41 42 43 44 45 | from sklearn.tree import DecisionTreeClassifier, export_graphviz from sklearn.datasets import load_breast_cancer from sklearn.cross_validation import train_test_split #Dot to png import pydot #온라인 시각화 #https://dreampuf.github.io/GraphvizOnline #샘플 데이터 로드(유방암 데이터 세트) cancer = load_breast_cancer() #훈련, 테스트 데이터 셔플 X_train, X_test, y_train, y_test = train_test_split( cancer.data, cancer.target, stratify=cancer.target, random_state=42) #의사결정 트리 선언 dTreeAll = DecisionTreeClassifier(random_state=0) #훈련 (모든 리프 노드 사용) dTreeAll.fit(X_train, y_train) #점수 출력 print("Train Set Score1 : {:.2f}".format(dTreeAll.score(X_train, y_train))) print("Test Set Score1 : {:.2f}".format(dTreeAll.score(X_test, y_test))) #의사결정 트리 선언(트리 깊이 제한) dTreeLimit = DecisionTreeClassifier(max_depth=3, random_state=0) #훈련 (가지치기 : 리프노드 깊이 제한) dTreeLimit.fit(X_train, y_train) #점수 출력 print("Train Set Score2 : {:.2f}".format(dTreeLimit.score(X_train, y_train))) print("Test Set Score2 : {:.2f}".format(dTreeLimit.score(X_test, y_test))) export_graphviz(dTreeLimit, out_file="dicisionTree1.dot", class_names=["malignant","benign"], feature_names=cancer.feature_names, impurity=False, filled=True) #Encoding 중요 (graph,) = pydot.graph_from_dot_file('dicisionTree1.dot', encoding='utf8') #Dot 파일을 Png 이미지로 저장 graph.write_png('dicisionTree1.png') | cs |
- 1-3번 라인 : scikit-learn 관련 라이브러리, 예제 데이터 로드
- 18번 라인 : decision tree 객체 생성
- 21번 라인 : decision tree 훈련
- 28번 라인 : decision tree 객체 생성(리프 노드 깊이 제한)
- 38번 라인 : graphbiz 의사결정 트리 시각화 작업
- 42번 라인 : dot 파일로 encoding 작업
- 45번 라인 : 결과물을 이미지(png) 파일로 저장
파이썬(Python) - 의사결정트리(Decision Tree) 실행 화면
아래 이미지로 실제 실행 화면을 확인하실 수 있습니다.
실제 실행 화면
의사결정트리 결과 이미지
마무리
앞에서도 설명드렸지만, 의사결정트리는 특정 항목에 대한 측정값을 목표가 되는 값에 매핑시켜주는
분석기법으로 의사결정과정의 규칙을 이용해서 Tree 구조로 만든 분류 모델이라 할 수 있습니다.
그러나 깊이(Depth)가 커지면 새로운 데이터를 적용하기가 곤란하고 가장 중요한 단점인 예측 오차의
수치가 비약적으로 높아지는 경우가 있습니다.
이럴 경우 데이터 특성을 정확히 파악하고 가지치기(pruning)을 활용해서 깊이를 조절해줄 필요성이
있으며, 가지치기의 감도를 조절하기 위해서는 reduced error pruning 또는 rule post pruning 등
의 기법을 적용해 볼 필요성이 있습니다.
다음 시간에도 파이썬 관련 유용한 주제에 대해서 포스팅 하도록 하겠습니다.
소스코드 다운로드 : dicisionTree1.zip
'빅데이터 & 분석 > Machine Learning' 카테고리의 다른 글
Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(2) (8) | 2019.06.18 |
---|---|
Flask(플라스크) - 머신러닝, 딥러닝 웹 서비스 예제 소스 및 개념 설명(1) (16) | 2019.06.12 |
파이썬(Python) - 머신러닝 프로젝트(최종) - 나이브 베이즈 스팸 필터링 (26) | 2018.09.23 |
파이썬(Python) - 머신러닝 프로젝트(4) - mLab 호스팅 활용 MongoDB 연동 (4) | 2018.09.09 |
파이썬(Python) - 머신러닝 프로젝트(3) - 문자열 가공 및 TXT 및 CSV 저장 (9) | 2018.07.27 |