一、决策树原理

一般来说决策树比较适合分析离散数据,如果是连续数据要先转成离散数据再做分析。
具体的原理和思想可以参考李航博士的《统计学习方法》第二版中决策树一章,详细讲了决策树的具体思想,此/外,https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html专栏也可以参考,作者为T2噬菌体。

二、决策树的ID3算法和C4.5算法实例

注意:这个例子可以当当做一个模版,当传入新的类似csv文件时,可以利用这个模版来进行决策树分析!

  1. from sklearn.feature_extraction import DictVectorizer
  2. from sklearn import tree
  3. from sklearn import preprocessing
  4. import csv #注意导入csv文件的库,可以读字符数据!
  5. # 读入数据,注意格式
  6. Dtree = open(r'C:\Users\小新\Desktop\课程pdf\py\机器学习\决策树\AllElectronics.csv', 'r')
  7. reader = csv.reader(Dtree)
  8. # 获取第一行数据
  9. headers = reader.__next__()
  10. print(headers)
  11. # 定义两个列表
  12. featureList = [] #准备保存特征
  13. labelList = [] #准备保存标签
  14. #
  15. for row in reader: #这里按行提取,提取完一行后继续下一行
  16. # 把label存入list
  17. labelList.append(row[-1]) #把最后一列数数据添加进标签,即生成标签列表,row[i]行中列的信息
  18. rowDict = {} #建立空字典,便于添加
  19. for i in range(1, len(row)-1): #循环列数-1,即读取前四列的特征数据
  20. #建立一个数据字典
  21. rowDict[headers[i]] = row[i] #读取特征数据,headers[i]作为key,row[i]作为值
  22. # 把数据字典存入list
  23. featureList.append(rowDict) #每一个字典为一个数值传入列表
  24. print(featureList)
  25. # 把数据转换成01表示,因为决策树无法识别字符型数据,要转化成数值型数据
  26. vec = DictVectorizer() #特征提取,DictVectorizer的处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等,将符号转成数字0/1表示。
  27. x_data = vec.fit_transform(featureList).toarray() #转化成01数据
  28. print("x_data: " + str(x_data)) #每一列对应标签的情况,出现标签的表示设为1,不是都为0
  29. # 打印属性名称
  30. print(vec.get_feature_names()) #对应上面一行代码
  31. # 打印标签
  32. print("labelList: " + str(labelList))
  33. # 把标签转换成01表示
  34. lb = preprocessing.LabelBinarizer()
  35. y_data = lb.fit_transform(labelList)
  36. print("y_data: " + str(y_data))
  37. # 创建决策树模型
  38. model = tree.DecisionTreeClassifier(criterion='entropy') #默认是基尼指数,这是cart算法里的,这里改成entropy是信息熵,C4.5的算法
  39. # 输入数据建立模型
  40. model.fit(x_data, y_data)
  41. # 测试
  42. x_test = x_data[0]
  43. print("x_test: " + str(x_test))
  44. predict = model.predict(x_test.reshape(1,-1)) #做预测时要传入一个二维的数据,这里要增加维数
  45. print("predict: " + str(predict))
  46. #注:x_test.reshape(1,-1) #变成一行,列数自动计算
  47. #array([[0., 0., 1., 0., 1., 1., 0., 0., 1., 0.]]) output
  48. #画图
  49. # 导出决策树
  50. # 第一步:在cmd命令中输入 pip install graphviz,安装graphviz包
  51. # 第二步打开网站http://www.graphviz.org/ ,下载graphviz然后添加环境变量,即把bin的路径添加进环境变量,如还不行出错则需要在cmd中输入conda install python-graphviz
  52. import graphviz
  53. dot_data = tree.export_graphviz(model,
  54. out_file = None,
  55. feature_names = vec.get_feature_names(), #获取特征名字
  56. class_names = lb.classes_, #获取标签名字
  57. filled = True,
  58. rounded = True,
  59. special_characters = True)
  60. graph = graphviz.Source(dot_data)
  61. graph.render('computer') #把图保存到当前目录下面
  62. graph #都是二叉树,不是期望出现的决策树
  63. #决策树分析:第一行都是一个判断语句,一般是某个特征是否小于等于0.5,往左分支为True,说明不是这个特征,往右分支为False,说明是这个特征(这里会有点绕)
  64. #第二行是计算信息熵
  65. #第三行是指当前的样本个数
  66. #第四行是当前样本的分类情况,有几个yes或no
  67. #第五行如如果没有下面的分支,那个根据这个特征选择分类yes或者no,根节点是完全没有任何条件下那个标签最多就选择那个标签,从第二个结点开始才根据特征选择分类yes或者no

画的决策树可以看这个附件computer.pdf