一、决策树原理
一般来说决策树比较适合分析离散数据,如果是连续数据要先转成离散数据再做分析。
具体的原理和思想可以参考李航博士的《统计学习方法》第二版中决策树一章,详细讲了决策树的具体思想,此/外,https://www.cnblogs.com/leoo2sk/archive/2010/09/19/decision-tree.html专栏也可以参考,作者为T2噬菌体。
二、决策树的ID3算法和C4.5算法实例
注意:这个例子可以当当做一个模版,当传入新的类似csv文件时,可以利用这个模版来进行决策树分析!
from sklearn.feature_extraction import DictVectorizerfrom sklearn import treefrom sklearn import preprocessingimport csv #注意导入csv文件的库,可以读字符数据!# 读入数据,注意格式Dtree = open(r'C:\Users\小新\Desktop\课程pdf\py\机器学习\决策树\AllElectronics.csv', 'r')reader = csv.reader(Dtree)# 获取第一行数据headers = reader.__next__()print(headers)# 定义两个列表featureList = [] #准备保存特征labelList = [] #准备保存标签#for row in reader: #这里按行提取,提取完一行后继续下一行# 把label存入listlabelList.append(row[-1]) #把最后一列数数据添加进标签,即生成标签列表,row[i]行中列的信息rowDict = {} #建立空字典,便于添加for i in range(1, len(row)-1): #循环列数-1,即读取前四列的特征数据#建立一个数据字典rowDict[headers[i]] = row[i] #读取特征数据,headers[i]作为key,row[i]作为值# 把数据字典存入listfeatureList.append(rowDict) #每一个字典为一个数值传入列表print(featureList)# 把数据转换成01表示,因为决策树无法识别字符型数据,要转化成数值型数据vec = DictVectorizer() #特征提取,DictVectorizer的处理对象是符号化(非数字化)的但是具有一定结构的特征数据,如字典等,将符号转成数字0/1表示。x_data = vec.fit_transform(featureList).toarray() #转化成01数据print("x_data: " + str(x_data)) #每一列对应标签的情况,出现标签的表示设为1,不是都为0# 打印属性名称print(vec.get_feature_names()) #对应上面一行代码# 打印标签print("labelList: " + str(labelList))# 把标签转换成01表示lb = preprocessing.LabelBinarizer()y_data = lb.fit_transform(labelList)print("y_data: " + str(y_data))# 创建决策树模型model = tree.DecisionTreeClassifier(criterion='entropy') #默认是基尼指数,这是cart算法里的,这里改成entropy是信息熵,C4.5的算法# 输入数据建立模型model.fit(x_data, y_data)# 测试x_test = x_data[0]print("x_test: " + str(x_test))predict = model.predict(x_test.reshape(1,-1)) #做预测时要传入一个二维的数据,这里要增加维数print("predict: " + str(predict))#注:x_test.reshape(1,-1) #变成一行,列数自动计算#array([[0., 0., 1., 0., 1., 1., 0., 0., 1., 0.]]) output#画图# 导出决策树# 第一步:在cmd命令中输入 pip install graphviz,安装graphviz包# 第二步打开网站http://www.graphviz.org/ ,下载graphviz然后添加环境变量,即把bin的路径添加进环境变量,如还不行出错则需要在cmd中输入conda install python-graphvizimport graphvizdot_data = tree.export_graphviz(model,out_file = None,feature_names = vec.get_feature_names(), #获取特征名字class_names = lb.classes_, #获取标签名字filled = True,rounded = True,special_characters = True)graph = graphviz.Source(dot_data)graph.render('computer') #把图保存到当前目录下面graph #都是二叉树,不是期望出现的决策树#决策树分析:第一行都是一个判断语句,一般是某个特征是否小于等于0.5,往左分支为True,说明不是这个特征,往右分支为False,说明是这个特征(这里会有点绕)#第二行是计算信息熵#第三行是指当前的样本个数#第四行是当前样本的分类情况,有几个yes或no#第五行如如果没有下面的分支,那个根据这个特征选择分类yes或者no,根节点是完全没有任何条件下那个标签最多就选择那个标签,从第二个结点开始才根据特征选择分类yes或者no
画的决策树可以看这个附件computer.pdf
