鱼C论坛

 找回密码
 立即注册
查看: 2498|回复: 6

[技术交流] Python 入门 -----决策树应用

[复制链接]
发表于 2017-8-15 10:23:23 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 回忆一遥远 于 2017-8-16 07:31 编辑

安装过程

① 为了方便,直接安装了 Anaconda 2.7 版本

② 安装 stikit-learn

③ 安装 Graphviz (转化 dot 文件到 pdf 可视化决策树 )

④ 把 Graphviz 加入环境变量


需要处理的数据如图
1.png



生成的决策树文档


digraph Tree {
node [shape=box] ;
0 [label="age=middle_aged <= 0.5\nentropy = 0.9403\nsamples = 14\nvalue = [5, 9]"] ;
1 [label="student=no <= 0.5\nentropy = 1.0\nsamples = 10\nvalue = [5, 5]"] ;
0 -> 1 [labeldistance=2.5, labelangle=45, headlabel="True"] ;
2 [label="credit_rating=excellent <= 0.5\nentropy = 0.7219\nsamples = 5\nvalue = [1, 4]"] ;
1 -> 2 ;
3 [label="entropy = 0.0\nsamples = 3\nvalue = [0, 3]"] ;
2 -> 3 ;
4 [label="age=youth <= 0.5\nentropy = 1.0\nsamples = 2\nvalue = [1, 1]"] ;
2 -> 4 ;
5 [label="entropy = 0.0\nsamples = 1\nvalue = [1, 0]"] ;
4 -> 5 ;
6 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1]"] ;
4 -> 6 ;
7 [label="age=youth <= 0.5\nentropy = 0.7219\nsamples = 5\nvalue = [4, 1]"] ;
1 -> 7 ;
8 [label="credit_rating=excellent <= 0.5\nentropy = 1.0\nsamples = 2\nvalue = [1, 1]"] ;
7 -> 8 ;
9 [label="entropy = 0.0\nsamples = 1\nvalue = [0, 1]"] ;
8 -> 9 ;
10 [label="entropy = 0.0\nsamples = 1\nvalue = [1, 0]"] ;
8 -> 10 ;
11 [label="entropy = 0.0\nsamples = 3\nvalue = [3, 0]"] ;
7 -> 11 ;
12 [label="entropy = 0.0\nsamples = 4\nvalue = [0, 4]"] ;
0 -> 12 [labeldistance=2.5, labelangle=-45, headlabel="False"] ;
}





使用 Graphviz 可视化后的树:

方法: 使用 cmd ,使用命令 dot -Tpdf iris.dot -o output.pdf         
# iris.dot 是 dot 的路径 ,output.pdf 是处理后的文件


巨长的转化命令:
3.png

转化后的可视化决策树:
2.png






编写的代码
  1. # -*- coding: utf-8 -*-
  2. # 不加上面这个注释,默认读取 ASCll 编码,在用 utf-8 格式的编译器里会出错

  3. from sklearn.feature_extraction import DictVectorizer
  4. import csv
  5. from sklearn import preprocessing
  6. from sklearn import tree
  7. from sklearn.externals.six import StringIO

  8. # sklearn 要求是数值型的值,需要转化
  9. # 预处理数据的开始
  10. # 读取 csv 文件数据
  11. allElectronicsData = open(r'D:\Temp\Test1.csv', 'rb')
  12. # reader 在 csv 文件中按行读取
  13. reader = csv.reader(allElectronicsData)
  14. # headers 是 csv 文件中第一行
  15. headers = reader.next()

  16. print(headers)

  17. # 装取特征值信息
  18. featureList = []
  19. # 装取类别的值
  20. labelList = []

  21. # reader 是数据内容 , row 是其中一行
  22. for row in reader:
  23.     # 取每一行最后一个值
  24.     labelList.append(row[len(row) - 1])
  25.     rowDict = {}
  26.     # 取每一行各特征值
  27.     for i in range(1, len(row) - 1):
  28.         rowDict[headers[i]] = row[i]
  29.     # 特征值字典
  30.     featureList.append(rowDict)
  31.    
  32. print(featureList)

  33. # 矢量特征
  34. # 使用 DictVectorizer 把数据数值化
  35. vec = DictVectorizer()
  36. dummyX = vec.fit_transform(featureList).toarray()

  37. print("dummyX: " + str(dummyX))
  38. print(vec.get_feature_names())

  39. print("Labellist: " + str(labelList))

  40. # 矢量化类标签
  41. lb = preprocessing.LabelBinarizer()
  42. dummyY = lb.fit_transform(labelList)
  43. print("dummyY: " + str(dummyY))
  44. # 处理数据结束



  45. # 用决策树进行分类
  46. # 用 DecisionTreeClassifier 进行模型的创建
  47. # DecisionTreeClassifier 分类器创建决策树, entropy 信息熵的算法
  48. clf = tree.DecisionTreeClassifier(criterion = 'entropy')
  49. # 构建决策树
  50. clf = clf.fit(dummyX, dummyY)
  51. print("clf: " + str(clf))


  52. # 观测模型
  53. with open("allElectronicInformationGainOri.dot", 'w') as f:
  54.     # 画出决策树,并且还原数值
  55.     f = tree.export_graphviz(clf, feature_names=vec.get_feature_names(), out_file = f)
  56. # 决策树构建结束,并输出结果

  57. # 预测功能
  58. # 取原训练集中的数据改动后,利用机器学习判断一个人买不买电脑
  59. oneRowX = dummyX[0, :]
  60. print("oneRowX: " + str(oneRowX))

  61. newRowX = oneRowX

  62. newRowX[0] = 1
  63. newRowX[2] = 0
  64. print("newRowX: " + str(newRowX))

  65. predictedY = clf.predict(newRowX)
  66. print("predictedY: " + str(predictedY))
  67. # predicted 的结果由原来的0(不买)变成了1(买)
  68. # 已经可以预测一个人是否买电脑了


复制代码




输出的结果:
  1. ['RID', 'age', 'income', 'student', 'credit_rating', 'Class_buys_computer']
  2. [{'credit_rating': 'fair', 'age': 'youth', 'student': 'no', 'income': 'high'}, {'credit_rating': 'excellent', 'age': 'youth', 'student': 'no', 'income': 'high'}, {'credit_rating': 'fair', 'age': 'middle_aged', 'student': 'no', 'income': 'high'}, {'credit_rating': 'fair', 'age': 'senior', 'student': 'no', 'income': 'medium'}, {'credit_rating': 'fair', 'age': 'senior', 'student': 'yes', 'income': 'low'}, {'credit_rating': 'excellent', 'age': 'senior', 'student': 'yes', 'income': 'low'}, {'credit_rating': 'excellent', 'age': 'middle_aged', 'student': 'yes', 'income': 'low'}, {'credit_rating': 'fair', 'age': 'youth', 'student': 'no', 'income': 'medium'}, {'credit_rating': 'fair', 'age': 'youth', 'student': 'yes', 'income': 'low'}, {'credit_rating': 'fair', 'age': 'senior', 'student': 'yes', 'income': 'medium'}, {'credit_rating': 'excellent', 'age': 'youth', 'student': 'yes', 'income': 'medium'}, {'credit_rating': 'excellent', 'age': 'middle_aged', 'student': 'no', 'income': 'medium'}, {'credit_rating': 'fair', 'age': 'middle_aged', 'student': 'yes', 'income': 'high'}, {'credit_rating': 'excellent', 'age': 'senior', 'student': 'no', 'income': 'medium'}]
  3. dummyX: [[ 0.  0.  1.  0.  1.  1.  0.  0.  1.  0.]
  4. [ 0.  0.  1.  1.  0.  1.  0.  0.  1.  0.]
  5. [ 1.  0.  0.  0.  1.  1.  0.  0.  1.  0.]
  6. [ 0.  1.  0.  0.  1.  0.  0.  1.  1.  0.]
  7. [ 0.  1.  0.  0.  1.  0.  1.  0.  0.  1.]
  8. [ 0.  1.  0.  1.  0.  0.  1.  0.  0.  1.]
  9. [ 1.  0.  0.  1.  0.  0.  1.  0.  0.  1.]
  10. [ 0.  0.  1.  0.  1.  0.  0.  1.  1.  0.]
  11. [ 0.  0.  1.  0.  1.  0.  1.  0.  0.  1.]
  12. [ 0.  1.  0.  0.  1.  0.  0.  1.  0.  1.]
  13. [ 0.  0.  1.  1.  0.  0.  0.  1.  0.  1.]
  14. [ 1.  0.  0.  1.  0.  0.  0.  1.  1.  0.]
  15. [ 1.  0.  0.  0.  1.  1.  0.  0.  0.  1.]
  16. [ 0.  1.  0.  1.  0.  0.  0.  1.  1.  0.]]
  17. ['age=middle_aged', 'age=senior', 'age=youth', 'credit_rating=excellent', 'credit_rating=fair', 'income=high', 'income=low', 'income=medium', 'student=no', 'student=yes']
  18. Labellist: ['no', 'no', 'yes', 'yes', 'yes', 'no', 'yes', 'no', 'yes', 'yes', 'yes', 'yes', 'yes', 'no']
  19. dummyY: [[0]
  20. [0]
  21. [1]
  22. [1]
  23. [1]
  24. [0]
  25. [1]
  26. [0]
  27. [1]
  28. [1]
  29. [1]
  30. [1]
  31. [1]
  32. [0]]
  33. clf: DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
  34.             max_features=None, max_leaf_nodes=None,
  35.             min_impurity_split=1e-07, min_samples_leaf=1,
  36.             min_samples_split=2, min_weight_fraction_leaf=0.0,
  37.             presort=False, random_state=None, splitter='best')
  38. oneRowX: [ 0.  0.  1.  0.  1.  1.  0.  0.  1.  0.]
  39. newRowX: [ 1.  0.  0.  0.  1.  1.  0.  0.  1.  0.]
  40. predictedY: [1]
复制代码


小结


这个决策树使用的是 ID3 算法 (一种贪心算法)
它是通过信息熵的大小来进行分类处理的










另外,有鱼油知道 C++ 的深度学习的资料或视频吗? 我不想学 Python 的啊~~~~~~


评分

参与人数 1鱼币 +4 收起 理由
小甲鱼 + 4

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2017-8-15 11:17:00 | 显示全部楼层
哈哈哈哈哈哈


那你把python的知识传递出来吧


然后再去学c++
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-16 21:54:09 | 显示全部楼层

如果大家觉得我的笔记有益,那真是再好不过了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-17 07:20:55 | 显示全部楼层
回忆一遥远 发表于 2017-8-16 21:54
如果大家觉得我的笔记有益,那真是再好不过了

那开始吧  我做你第一个粉
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-17 07:53:15 | 显示全部楼层
李金龙 发表于 2017-8-17 07:20
那开始吧  我做你第一个粉

呃...我现在的等级还不能加好友...
这个笔记其实也是我边学边记的
我真是入门啊

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2017-8-17 08:12:09 | 显示全部楼层
回忆一遥远 发表于 2017-8-17 07:53
呃...我现在的等级还不能加好友...
这个笔记其实也是我边学边记的
我真是入门啊

我也是入门
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2017-8-17 08:30:32 | 显示全部楼层


那我们一起学习吧~
不过最近我的重心是放在 Java 那边,Python 是偶尔学习一下,所以 Python 笔记的更新速度可能会比 Java 的慢。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-8 03:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表