周志华《机器学习》第四章决策树-调用sklearn.tree实现

原创 2018年04月14日 23:17:19

周志华《机器学习》第四章决策树-调用sklearn.tree实现

一、导入需要用的包

import csv  # 导入文件
import pandas as pd
from sklearn.feature_extraction import DictVectorizer  # 用于生成哑变量
from sklearn import tree

二、导入数据

1、利用csv导入数据

melon = open(r".../data/watermelon_3.csv","rt")  
reader = csv.reader(melon)   # 迭代器
headers = next(reader)   # python2语法为reader.next()
print(headers) 

# ['编号', '色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率', '好瓜']
for row in reader:
    print(row)

# ['1', '青绿', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.697', '0.46', '是']
# ['2', '乌黑', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.774', '0.376', '是']
# ['3', '乌黑', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.634', '0.264', '是']
# ['4', '青绿', '蜷缩', '沉闷', '清晰', '凹陷', '硬滑', '0.608', '0.318', '是']
# ['5', '浅白', '蜷缩', '浊响', '清晰', '凹陷', '硬滑', '0.556', '0.215', '是']
# ['6', '青绿', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '0.403', '0.237', '是']
# ['7', '乌黑', '稍蜷', '浊响', '稍糊', '稍凹', '软粘', '0.481', '0.149', '是']
# ['8', '乌黑', '稍蜷', '浊响', '清晰', '稍凹', '硬滑', '0.437', '0.211', '是']
# ['9', '乌黑', '稍蜷', '沉闷', '稍糊', '稍凹', '硬滑', '0.666', '0.091', '否']
# ['10', '青绿', '硬挺', '清脆', '清晰', '平坦', '软粘', '0.243', '0.267', '否']
# ['11', '浅白', '硬挺', '清脆', '模糊', '平坦', '硬滑', '0.245', '0.057', '否']
# ['12', '浅白', '蜷缩', '浊响', '模糊', '平坦', '软粘', '0.343', '0.099', '否']
# ['13', '青绿', '稍蜷', '浊响', '稍糊', '凹陷', '硬滑', '0.639', '0.161', '否']
# ['14', '浅白', '稍蜷', '沉闷', '稍糊', '凹陷', '硬滑', '0.657', '0.198', '否']
# ['15', '乌黑', '稍蜷', '浊响', '清晰', '稍凹', '软粘', '0.36', '0.37', '否']
# ['16', '浅白', '蜷缩', '浊响', '模糊', '平坦', '硬滑', '0.593', '0.042', '否']
# ['17', '青绿', '蜷缩', '沉闷', '稍糊', '稍凹', '硬滑', '0.719', '0.103', '否']


2、利用pandas导入数据

# melon = pd.read_csv(".../data/watermelon_3.csv",encoding='GB18030') 
# headers = list(melon.columns )
# print(headers)  

# ['编号', '色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '密度', '含糖率', '好瓜']


三、转变数据格式

1、利用reader(csv导入的迭代器)

featureList = []    
labelList = []  

#存放在两个元祖中  
for row in reader:  
    labelList.append(row[len(row)-1])  
    rowDic = {}  
    for i in range(1,len(row)-1):  
        rowDic[headers[i]] = row[i]  
    featureList.append(rowDic)  
    
print(featureList ) 
print(labelList )


2、利用melon(pandas导入文件)

featureList = []    
labelList = []  

#存放在两个元祖中  
for i in range(melon.shape[0]):  
    labelList.append(melon['好瓜'][i])  
    rowDic = {}  
    for j in range(1, melon.shape[1] - 1):
        rowDic[headers[j]] = melon.loc[i][j]  
    featureList.append(rowDic)  
    
print(featureList ) 
print(labelList ) 
[{'色泽': '青绿', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '密度': '0.697', '含糖率': '0.46'}, 
{'色泽': '乌黑', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑', '密度': '0.774', '含糖率': '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'}]
['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否']


四、生成哑变量

1、predict

v = DictVectorizer(sparse=True)  # sparse=True 表示生成稀疏矩阵
dummyX = v.fit_transform(featureList).toarray()  
print("dummyX:",dummyX ) 
print(v.get_feature_names() ) 
print("labelList:"+str(labelList))  
dummyX: [[0.46  0.697 0.    1.    0.    0.    0.    1.    0.    1.    0.    1.
  0.    0.    0.    0.    1.    1.    0.   ]
 [0.376 0.774 1.    0.    0.    0.    0.    1.    0.    1.    0.    1.
  0.    0.    1.    0.    0.    1.    0.   ]
 [0.264 0.634 0.    1.    0.    0.    0.    1.    0.    1.    0.    1.
  0.    0.    1.    0.    0.    1.    0.   ]
 [0.318 0.608 1.    0.    0.    0.    0.    1.    0.    1.    0.    1.
  0.    0.    0.    0.    1.    1.    0.   ]
 [0.215 0.556 0.    1.    0.    0.    0.    1.    0.    1.    0.    1.
  0.    0.    0.    1.    0.    1.    0.   ]
 [0.237 0.403 0.    1.    0.    0.    1.    0.    0.    1.    0.    0.
  0.    1.    0.    0.    1.    0.    1.   ]
 [0.149 0.481 0.    1.    0.    0.    1.    0.    0.    0.    1.    0.
  0.    1.    1.    0.    0.    0.    1.   ]
 [0.211 0.437 0.    1.    0.    0.    1.    0.    0.    1.    0.    0.
  0.    1.    1.    0.    0.    1.    0.   ]
 [0.091 0.666 1.    0.    0.    0.    1.    0.    0.    0.    1.    0.
  0.    1.    1.    0.    0.    1.    0.   ]
 [0.267 0.243 0.    0.    1.    1.    0.    0.    0.    1.    0.    0.
  1.    0.    0.    0.    1.    0.    1.   ]
 [0.057 0.245 0.    0.    1.    1.    0.    0.    1.    0.    0.    0.
  1.    0.    0.    1.    0.    1.    0.   ]
 [0.099 0.343 0.    1.    0.    0.    0.    1.    1.    0.    0.    0.
  1.    0.    0.    1.    0.    0.    1.   ]
 [0.161 0.639 0.    1.    0.    0.    1.    0.    0.    0.    1.    1.
  0.    0.    0.    0.    1.    1.    0.   ]
 [0.198 0.657 1.    0.    0.    0.    1.    0.    0.    0.    1.    1.
  0.    0.    0.    1.    0.    1.    0.   ]
 [0.37  0.36  0.    1.    0.    0.    1.    0.    0.    1.    0.    0.
  0.    1.    1.    0.    0.    0.    1.   ]
 [0.042 0.593 0.    1.    0.    0.    0.    1.    1.    0.    0.    0.
  1.    0.    0.    1.    0.    1.    0.   ]
 [0.103 0.719 1.    0.    0.    0.    0.    1.    0.    0.    1.    0.
  0.    1.    0.    0.    1.    1.    0.   ]]
['含糖率', '密度', '敲声=沉闷', '敲声=浊响', '敲声=清脆', '根蒂=硬挺', '根蒂=稍蜷', '根蒂=蜷缩', '纹理=模糊', '纹理=清晰', '纹理=稍糊', 
'脐部=凹陷', '脐部=平坦', '脐部=稍凹', '色泽=乌黑', '色泽=浅白', '色泽=青绿', '触感=硬滑', '触感=软粘']
labelList:['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否']


2、response

lb = preprocessing.LabelBinarizer()  
dummyY = lb.fit_transform(labelList)  
print("dummyY:" + str(dummyY))  

# dummyY:[[1]
# [1]
# [1]
# [1]
# [1]
# [1]
# [1]
# [1]
# [0]
# [0]
# [0]
# [0]
# [0]
# [0]
# [0]
# [0]
# [0]]


五、利用tree训练模型

clf = tree.DecisionTreeClassifier(criterion="entropy") #创建一个分类器,entropy表示用ID3,可换成gini等其他  
clf = clf.fit(dummyX, dummyY) 

#预测      
oneRowX = dummyX[0,:]  
print("oneRowX:" +str(oneRowX) ) 
  
newRowX = oneRowX  
newRowX[0] = 1  
newRowX[2] = 0  
print("newRowX:" +str(newRowX))  
  
predictedY = clf.predict([newRowX])  
print("predictedY:" + str(predictedY))
oneRowX:[1.    0.697 0.    1.    0.    0.    0.    1.    0.    1.    0.    1.
 0.    0.    0.    0.    1.    1.    0.   ]
newRowX:[1.    0.697 0.    1.    0.    0.    0.    1.    0.    1.    0.    1.
 0.    0.    0.    0.    1.    1.    0.   ]
predictedY:[1]


六、可视化

中文显示有问题,尚未解决成功。

# 先将melon的变量名全部换成英文,尽可能的让图清洗一些。
melon.rename(columns={'编号': 'num', '色泽': 'color', '根蒂': 'root', '敲声':'sound', '纹理': 'texture', '脐部': 'navel', 
'触感': 'touch', '密度': 'density', '含糖率': 'sugar', '好瓜': 'G&B'}, inplace=True)
melon.loc[melon['G&B'] == '是', 'G&B'] = 'GOOD'
melon.loc[melon['G&B'] == '否', 'G&B'] = 'BAD'
#Visulize model  
with open("C..../data/tree1.dot","w") as f:  
    f = tree.export_graphviz(clf, feature_names=v.get_feature_names(), out_file = f) 
    
dot_data = tree.export_graphviz(clf, out_file=None, 
                                feature_names=v.get_feature_names(), 
                                class_names=melon['G&B'].unique(), 
                                filled=True, rounded=True, 
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)

graph.write_pdf('.../data/tree1.pdf')  # 下图root=□□ 为变量哑变量变量名,取值为0-1




下面根据iris数据集给一个完整的可视化图例

from sklearn.datasets import load_iris
from sklearn import tree
import pydotplus

iris = load_iris()
iris.feature_names

clf = tree.DecisionTreeClassifier()
clf_iris = clf.fit(iris.data, iris.target)

with open('.../data/iris.dot', 'w') as f:
    f = tree.export_graphviz(clf_iris, out_file=f)

dot_data = tree.export_graphviz(clf, out_file=None, 
                                feature_names=iris.feature_names, 
                                class_names=iris.target_names, 
                                filled=True, rounded=True, 
                                special_characters=True)
graph = pydotplus.graph_from_dot_data(dot_data)

graph.write_pdf('.../data/iris.pdf')


参考博客:https://blog.csdn.net/gamer_gyt/article/details/51226904

                https://blog.csdn.net/u012845311/article/details/77294973




<机器学习>(周志华)读书笔记 -- 第四章 决策树

4.1 基本流程 决策树是什么?要想解决这个问题,首先要弄明白的就是计算机中的树是什么。树,我们在计算机中很常见了,有二叉树,哈夫曼树等等,总结一下共同点的时候就是,对一个当前节点而言,下一个个节点有...
  • geng333abc
  • geng333abc
  • 2017-03-28 19:58:07
  • 470

机器学习(周志华) 参考答案 第四章 决策树 4.10

机器学习(周志华) 参考答案 第四章 决策树 4.4机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/details/5...
  • icefire_tyh
  • icefire_tyh
  • 2016-08-01 00:38:12
  • 1993

机器学习(周志华) 参考答案 第四章 决策树 4.5

机器学习(周志华) 参考答案 第四章 决策树 3.5机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/details/5...
  • icefire_tyh
  • icefire_tyh
  • 2016-07-31 23:33:08
  • 2049

《机器学习》周志华第四章笔记

自己对决策树的一些理解,不一定对,权当加深印象。4.1基本流程组成:一个根节点、若干内部节点和若干叶节点;叶节点对应了不同的预测结果,我们的目的是从包含样本全集的根节点找到它到每个叶节点的路径对应一个...
  • sysu_cis
  • sysu_cis
  • 2016-07-01 21:23:41
  • 1305

周志华 《机器学习》之 第四章(决策树)概念总结

看完周老师的决策树章节,首先从内容安排上采用了循序渐进的方式引入介绍决策树这种分类算法。书中从基本流程、划分选择、剪枝处理、连续与缺失值、多变量决策树五个方面进行详细介绍。看完之后我们如何理解决策树呢...
  • lixianjun913
  • lixianjun913
  • 2016-08-15 14:41:51
  • 641

机器学习(周志华) 参考答案 第四章 决策树 4.4

机器学习(周志华) 参考答案 第四章 决策树 4.4机器学习(周志华西瓜书) 参考答案 总目录 http://blog.csdn.net/icefire_tyh/article/details/5...
  • icefire_tyh
  • icefire_tyh
  • 2016-07-31 23:54:04
  • 2557

《机器学习》周志华-CH4 决策树

CH4 决策树
  • qq_34100655
  • qq_34100655
  • 2018-02-03 20:49:06
  • 31

机器学习(周志华)习题解答4.3: Python小白详解ID3决策树的实现

我是刚刚学python,所以尽我所能十分详细地解释了几乎每个步骤……希望和我一样的新手可以从中获益。本文以周志华《机器学习》习题4.3为例,用python实现了ID3决策树的构建和绘图。...
  • thither_shore
  • thither_shore
  • 2016-08-30 00:29:54
  • 4075

周志华《机器学习》笔记:第4章 决策树

机器学习-决策树:基本流程、划分选择、剪枝处理、连续与缺失值、多变量决策树。...
  • Sugar_girl
  • Sugar_girl
  • 2017-08-21 14:36:27
  • 267
收藏助手
不良信息举报
您举报文章:周志华《机器学习》第四章决策树-调用sklearn.tree实现
举报原因:
原因补充:

(最多只允许输入30个字)