决策树的实现

样本选自周志华老师的西瓜书

样本:

将上面的样本制作成为一个CSV文件,保存的编码为utf8,文中保存在/home/jsj/datetest/下名字wm20.csv

需要导入的文件:

import csv#导入csv
from sklearn.feature_extraction import DictVectorizer#转换工具,将list转换成为一个数组
from sklearn import preprocessing
from sklearn import tree #创建决策树
import numpy as np

1)导入文件:

#csv的读取
file = csv.reader((open("/home/jsj/datatest/wm20.csv","rt")))#注意保存utf8
print(file)#获取文件信息
#file.decode("utf8","ignore")
headers = next(file)#获取并打印头信息
print(headers)

这段代码的运行结果:

  <_csv.reader object at 0x7fa77d171198>
  ['编号', '色泽', '根蒂', '敲声', '纹理', '脐部', '触感', '好瓜'])

2)分离标签和特征值

#将行信息转变成为listDict
featurelist = []#创建一个特征列表
labellist = []#创建一个标签列表
for row in file:
  labellist.append(row[len(row) -1])#每一次获取最后一行值,添加到标签列表中
  rowDict = {}#每一次都创建一个字典接受列值
  for i in range(1,len(row)-1):#从第二位置开始添加
    rowDict[headers[i]] = row[i]#添加字典的对应特征值
  featurelist.append(rowDict)#每次添加一行
print(labellist)#获取到的标签值
print(featurelist)#获取到的每一行的特征值,每一个字典相当于一个元素

这段代码的运行结果:

  ['是', '是', '是', '是', '是', '是', '是', '是', '否', '否', '否', '否', '否', '否', '否', '否', '否']
  [{'色泽': '青绿', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '乌黑', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '乌黑', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '青绿', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '清晰', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '青绿', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '脐部': '稍凹', '触感': '软粘'}, {'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '稍糊', '脐部': '稍凹', '触感': '软粘'}, {'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '脐部': '稍凹', '触感': '硬滑'}, {'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '沉闷', '纹理': '稍糊', '脐部': '稍凹', '触感': '硬滑'}, {'色泽': '青绿', '根蒂': '硬挺', '敲声': '清脆', '纹理': '清晰', '脐部': '平坦', '触感': '软粘'}, {'色泽': '浅白', '根蒂': '硬挺', '敲声': '清脆', '纹理': '模糊', '脐部': '平坦', '触感': '硬滑'}, {'色泽': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '模糊', '脐部': '平坦', '触感': '软粘'}, {'色泽': '青绿', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '稍糊', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '浅白', '根蒂': '稍蜷', '敲声': '沉闷', '纹理': '稍糊', '脐部': '凹陷', '触感': '硬滑'}, {'色泽': '乌黑', '根蒂': '稍蜷', '敲声': '浊响', '纹理': '清晰', '脐部': '稍凹', '触感': '软粘'}, {'色泽': '浅白', '根蒂': '蜷缩', '敲声': '浊响', '纹理': '模糊', '脐部': '平坦', '触感': '硬滑'}, {'色泽': '青绿', '根蒂': '蜷缩', '敲声': '沉闷', '纹理': '稍糊', '脐部': '稍凹', '触感': '硬滑'}]

3)将特征值转换成为0、1数组

#将获得特征值字典转变成为数组
vec = DictVectorizer()#获取转换对象
dummyX = vec.fit_transform(featurelist).toarray()#将特征值的list转变成为一个数组
print("dummyX:" + str(dummyX))
print(vec.get_feature_names())#获取特征所有的取值

这段代码的运行结果:

dummyX:[[0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
 [0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 1. 0.]
 [1. 0. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 1. 0. 0. 1. 0.]
 [0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 0. 1.]
 [0. 0. 1. 1. 0. 0. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1.]
 [0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 0. 1. 1. 0.]
 [1. 0. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1.]
 [0. 1. 0. 0. 0. 1. 1. 0. 0. 0. 1. 0. 0. 1. 0. 1. 0.]
 [1. 0. 0. 0. 0. 1. 0. 0. 1. 0. 0. 1. 0. 0. 1. 1. 0.]]
['敲声=沉闷', '敲声=浊响', '敲声=清脆', '根蒂=硬挺', '根蒂=稍蜷', '根蒂=蜷缩', '纹理=模糊', '纹理=清晰', '纹理=稍糊', '脐部=凹陷', '脐部=平坦', '脐部=稍凹', '色泽=乌黑', '色泽=浅白', '色泽=青绿', '触感=硬滑', '触感=软粘']
4)转换标签为0、1数组 

#将获取的标签list转变
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]]

5)使用id3建立决策树

#创建分类器
clf = tree.DecisionTreeClassifier(criterion= "entropy")#使用Id3
clf = clf.fit(dummyX,dummyY)
print("clf:"+str(clf))

这段代码结果为:

clf:DecisionTreeClassifier(class_weight=None, criterion='entropy', max_depth=None,
            max_features=None, max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, presort=False, random_state=None,
            splitter='best')

6)创建出文件

with open("/home/jsj/datatest/wm20.dot","w") as f:
f = tree.export_graphviz(clf,feature_names = vec.get_feature_names(),out_file= f)#使用export_graphviz

这段代码结果为:

   会产生一个wm20.dot的文件

  

文件打开之后形式如下:

  

上面是使用export_graphviz建立好的决策树,可以使用graphviz产生图片,详情见https://blog.csdn.net/adaptiver/article/details/53701015

使用命令:dot -Tpng wm20.dot -o wm20.png产生下列图:

7)预测

#预测新的数据如:'浅白', '蜷缩', '浊响', '清晰', '稍凹', '硬滑'
newRowX = oneRowX;
#修改数据不同的地方
#将青绿转变成为浅白
newRowX[2] = 0
newRowX[0] = 1
#将凹陷转变成为稍凹
newRowX[14] = 0
newRowX[13] = 1
"""由于在新版的sklearn中,
所有的数据都应该是二维矩阵,哪怕它只是单独一行或一列(
比如前面做预测时,仅仅只用了一个样本数据),
所以需要使用.reshape(1,-1)进行转换,具体操作如下"""
newRowX = np.array(newRowX).reshape(1, -1)
print("newRowX :" + str(newRowX))
pY = clf.predict(newRowX)
print("pY :" + str(pY))

这段代码结果为:

[0. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 0. 1. 1. 0.]
newRowX :[[1. 1. 0. 0. 0. 1. 0. 1. 0. 1. 0. 0. 0. 1. 0. 1. 0.]]
pY :[1]

--可以看到这里是好瓜

转载于:https://www.cnblogs.com/hhxz/p/10626419.html

决策树实现可以使用Java编程语言。在Java中,有许多开源的机器学习库可以帮助实现决策树模型,例如Weka、Apache Spark MLlib和J48等。这些库提供了丰富的功能和API,可以用于构建、训练和评估决策树模型。 其中,Weka是一个非常流行的机器学习库,它提供了各种算法和工具,包括决策树算法。使用Weka,你可以通过加载数据集、选择合适的属性和设置参数来构建决策树模型。然后,你可以使用训练集对模型进行训练,并使用测试集对模型进行评估。最后,你可以使用训练好的模型进行预测。 以下是一个使用Weka库实现决策树的简单示例代码: ```java import weka.core.Instances; import weka.core.converters.ConverterUtils.DataSource; import weka.classifiers.trees.J48; public class DecisionTreeExample { public static void main(String\[\] args) throws Exception { // 加载数据集 DataSource source = new DataSource("path/to/dataset.arff"); Instances data = source.getDataSet(); // 设置类别属性 data.setClassIndex(data.numAttributes() - 1); // 构建决策树模型 J48 tree = new J48(); tree.buildClassifier(data); // 输出决策树模型 System.out.println(tree); } } ``` 在上述代码中,你需要将"path/to/dataset.arff"替换为你的数据集文件的路径。然后,你可以使用J48类构建决策树模型,并使用buildClassifier方法对数据进行训练。最后,你可以使用System.out.println方法输出决策树模型的信息。 请注意,这只是一个简单的示例,实际的决策树实现可能需要更多的步骤和参数设置。你可以根据具体的需求和数据集进行调整和扩展。 #### 引用[.reference_title] - *1* *2* *3* [ID3算法决策树(java实现)](https://blog.csdn.net/kiround/article/details/127018844)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^koosearch_v1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值