机器学习4 决策树 概念总结和简单实践
第四章 决策树 概念图解
第一遍sklearn直接上手实践:
习题4.3 基于信息增益的决策树对西瓜集进行分类:
西瓜集表4.3如下:
色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好坏 |
青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.46 | 好瓜 |
乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.744 | 0.376 | 好瓜 |
乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 好瓜 |
青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 好瓜 |
浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 好瓜 |
青绿 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 0.403 | 0.237 | 好瓜 |
乌黑 | 稍蜷 | 浊响 | 稍糊 | 稍凹 | 软粘 | 0.481 | 0.149 | 好瓜 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 硬滑 | 0.437 | 0.211 | 好瓜 |
乌黑 | 稍蜷 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 0.666 | 0.091 | 坏瓜 |
青绿 | 硬挺 | 清脆 | 清晰 | 平坦 | 软粘 | 0.243 | 0.267 | 坏瓜 |
浅白 | 硬挺 | 清脆 | 模糊 | 平坦 | 硬滑 | 0.245 | 0.057 | 坏瓜 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 软粘 | 0.343 | 0.099 | 坏瓜 |
青绿 | 稍蜷 | 浊响 | 稍糊 | 凹陷 | 硬滑 | 0.639 | 0.161 | 坏瓜 |
浅白 | 稍蜷 | 沉闷 | 稍糊 | 凹陷 | 硬滑 | 0.657 | 0.198 | 坏瓜 |
乌黑 | 稍蜷 | 浊响 | 清晰 | 稍凹 | 软粘 | 0.36 | 0.37 | 坏瓜 |
浅白 | 蜷缩 | 浊响 | 模糊 | 平坦 | 硬滑 | 0.593 | 0.042 | 坏瓜 |
青绿 | 蜷缩 | 沉闷 | 稍糊 | 稍凹 | 硬滑 | 0.719 | 0.103 | 坏瓜 |
sklearn直接调参代码:
# first round -- sklearn
import pandas as pd
import numpy as np
data = pd.read_csv('./CH4 TABLE4-3.csv', delimiter=',')
data1 = data[['色泽','根蒂','敲声','纹理','脐部','触感','密度','含糖率','好坏']]
# change label to data format
data2 = data1.replace(['青绿','蜷缩','浊响','清晰','凹陷','硬滑','乌黑','稍蜷','沉闷','稍糊','稍凹','软粘','浅白','硬挺','清脆','模糊','平坦','好瓜','坏瓜'],[1,1,1,1,1,1,2,2,2,2,2,2,3,3,3,3,3,1,0])
X =np.array(data2.iloc[:,0:8]) #X varible
y = np.array(data2.iloc[:,8]) # target class : bad or good
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
# 基于信息增益的决策树训练
clf = DecisionTreeClassifier(criterion='entropy',splitter='best')
clf.fit(X,y)
# 决策树可视化
import pydotplus
from IPython.display import Image
dot_data = tree.export_graphviz(clf, out_file=None,
feature_names=['color','root','knock',' texture','umbilical','feel','density','sweety'],
class_names=['Bad','Good'],
filled=True, rounded=True,
special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)
Image(graph.create_png())
# 预测值与训练值对比---百分百匹配训练集,过拟合
from sklearn import metrics
y_pred = clf.predict(X)
print(metrics.classification_report(y,y_pred))