{
"cells": [
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
"scrolled": true
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"CPython 3.7.3\n",
"IPython 7.5.0\n",
"\n",
"numpy 1.16.3\n",
"scipy 1.2.1\n",
"sklearn 0.21.1\n",
"pandas 0.24.2\n",
"matplotlib 3.0.3\n"
]
}
],
"source": [
"%load_ext watermark\n",
"%watermark -v -p numpy,scipy,sklearn,pandas,matplotlib"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"**6장 – 결정 트리**"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"_이 노트북은 6장에 있는 모든 샘플 코드와 연습문제 해답을 가지고 있습니다._"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 설정"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"파이썬 2와 3을 모두 지원합니다. 공통 모듈을 임포트하고 맷플롯립 그림이 노트북 안에 포함되도록 설정하고 생성한 그림을 저장하기 위한 함수를 준비합니다:"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {},
"outputs": [],
"source": [
"# 파이썬 2와 파이썬 3 지원\n",
"from __future__ import division, print_function, unicode_literals\n",
"\n",
"# 공통\n",
"import numpy as np\n",
"import os\n",
"\n",
"# 일관된 출력을 위해 유사난수 초기화\n",
"np.random.seed(42)\n",
"\n",
"# 맷플롯립 설정\n",
"%matplotlib inline\n",
"import matplotlib\n",
"import matplotlib.pyplot as plt\n",
"plt.rcParams['axes.labelsize'] = 14\n",
"plt.rcParams['xtick.labelsize'] = 12\n",
"plt.rcParams['ytick.labelsize'] = 12\n",
"\n",
"# 한글출력\n",
"matplotlib.rc('font', family='NanumBarunGothic')\n",
"matplotlib.rcParams['axes.unicode_minus'] = False\n",
"\n",
"# 그림을 저장할 폴드\n",
"PROJECT_ROOT_DIR = \".\"\n",
"CHAPTER_ID = \"decision_trees\"\n",
"\n",
"def image_path(fig_id):\n",
" return os.path.join(PROJECT_ROOT_DIR, \"images\", CHAPTER_ID, fig_id)\n",
"\n",
"def save_fig(fig_id, tight_layout=True):\n",
" if tight_layout:\n",
" plt.tight_layout()\n",
" plt.savefig(image_path(fig_id) + \".png\", format='png', dpi=300)"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"# 훈련과 시각화"
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {},
"outputs": [
{
"data": {
"text/plain": [
"DecisionTreeClassifier(class_weight=None, criterion='gini', max_depth=2,\n",
" max_features=None, max_leaf_nodes=None,\n",
" min_impurity_decrease=0.0, min_impurity_split=None,\n",
" min_samples_leaf=1, min_samples_split=2,\n",
" min_weight_fraction_leaf=0.0, presort=False,\n",
" random_state=42, splitter='best')"
]
},
"execution_count": 3,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"from sklearn.datasets import load_iris\n",
"from sklearn.tree import DecisionTreeClassifier\n",
"\n",
"iris = load_iris()\n",
"X = iris.data[:, 2:] # petal length and width\n",
"y = iris.target\n",
"\n",
"tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)\n",
"tree_clf.fit(X, y)"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {},
"outputs": [],
"source": [
"from sklearn.tree import export_graphviz\n",
"\n",
"export_graphviz(\n",
" tree_clf,\n",
" out_file=image_path(\"iris_tree.dot\"),\n",
" feature_names=[\"꽃잎 길이 (cm)\", \"꽃잎 너비 (cm)\"],\n",
" class_names=iris.target_names,\n",
" rounded=True,\n",
" filled=True\n",
" )"
]
},
{
"cell_type": "code",
"execution_count": 5,
"metadata": {},
"outputs": [
{
"data": {
"image/svg+xml": [
"\n",
"\n",
"\n",
"\n",
"\n"
],
"text/plain": [
""
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"import graphviz\n",
"with open(\"images/decision_trees/iris_tree.dot\") as f:\n",
" dot_graph = f.read()\n",
"dot = graphviz.Source(dot_graph)\n",
"dot.format = 'png'\n",
"dot.render(filename='iris_tree', directory='images/decision_trees', cleanup=True)\n",
"dot"
]
},
{
"cell_type": "code",
"execution_count": 6,
"metadata": {},
"outputs": [
{
"data": {
"image/png": "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\n",
"text/plain": [
"