欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

关于上篇的python实现决策树案例的一些总结

程序员文章站 2024-02-16 13:08:22
...
写文章的目的是为了巩固所学,和方便回顾查找。如有讲错的地方,欢迎指出,谢谢。

上篇的决策树案例链接

结合实例来学习更加容易一些

先看一段代码:

import csv
with open('tree(1).csv') as f:
    data = csv.reader(f)
    #reader 方法将读取csv文件中的每一行,并作为列表返回
    for row in data:
        print(type(row))    #类型为list
        print(row)

输出结果:

['RID', 'age', 'income', 'student', 'credit_rating', 'class_buys_computer']
['1', 'youth', 'high', 'no', 'fair', 'no']
['2', 'youth', 'high', 'no', 'excellent', 'no']
['3', 'middle_aged', 'high', 'no', 'fair', 'yes']
['4', 'senior', 'medium', 'no', 'fair', 'yes']
['5', 'senior', 'low', 'yes', 'fair', 'yes']
['6', 'senior', 'low', 'yes', 'excellent', 'no']
['7', 'middle_aged', 'low', 'yes', 'excellent', 'yes']
['8', 'youth', 'medium', 'no', 'fair', 'no']
['9', 'youth', 'low', 'yes', 'fair', 'yes']
['10', 'senior', 'medium', 'yes', 'fair', 'yes']
['11', 'youth', 'medium', 'yes', 'excellent', 'yes']
['12', 'middle_aged', 'medium', 'no', 'excellent', 'yes']
['13', 'middle_aged', 'high', 'yes', 'fair', 'yes']
['14', 'senior', 'medium', 'no', 'excellent', 'no']

此外可以利用next(),返回

titles = data.__next__()
print(titles)

输出:(这里的例子返回的是特征值)

['RID', 'age', 'income', 'student', 'credit_rating', 'class_buys_computer']

关于特征向量化方法DictVectorizer()
DictVectorizer()可以将使用字典储存的数据进行特征提取与向量化
这里创建一个简单例子进行说明,eg:

from sklearn.feature_extraction import DictVectorizer
test_data = [
            {'age':'youth','income':'low','student':'yes'},
            {'age':'medium','income':'high','student':'no'},
            {'age':'senior','income':'low','student':'no'}
            ]
vec = DictVectorizer()
x = vec.fit_transform(test_data).toarray()  #将list转换成array
print(x)

输出:

[[0. 0. 1. 0. 1. 0. 1.]
 [1. 0. 0. 1. 0. 1. 0.]
 [0. 1. 0. 0. 1. 1. 0.]]
'''
这里的第一个属性age存在三种情况:youth, medium,senior.
使用前三个标志来区分表示age的三个值。
如:001表示age为youth,100表示medium,010表示senior。
需要说明的是这里的取值是程序自动选取的,很方便的方法。
后面的income有两个值,只需要2位来区分,student也是2位。
'''

sklearn中fit、fit_transform、transform
fit原义指的是安装、使适合的意思,其实有点train的含义但是和train不同的是,它并不是一个训练的过程,而是一个适配的过程,过程都是定死的,最后只是得到了一个统一的转换的规则模型。
transform:是将数据进行转换,比如数据的归一化和标准化,将测试数据按照训练数据同样的模型进行转换,得到特征向量。
fit_transform:可以看做是fit和transform的结合,如果训练阶段使用fit_transform,则在测试阶段只需要对测试样本进行transform就行了。

emm..结合使用过程慢慢理解吧

preprocessing.LabelBinarizer()标签二值化
对于标称型数据来说,preprocessing.LabelBinarizer是一个很好用的工具。可以将只有两种结果的属性进行转化。

from sklearn import preprocessing
test_data = ['yes','no','yes','yes']
tool = preprocessing.LabelBinarizer()
y = tool.fit_transform(test_data)
print(y)

输出:

[[1]
 [0]
 [1]
 [1]]
 #1代表yes,0表示no

关于决策树的特征划分标准

#这是上次文章的例子
result = tree.DecisionTreeClassifier(criterion='entropy')
result.fit(x,y)

其中选用的特征划分标准选用了信息熵而不是默认的基尼系数
信息熵计算:
关于上篇的python实现决策树案例的一些总结
用此来计算信息获取量从而决定树的节点。
例子可以参考如下文章(也可以自己找找资料学习):
决策树之ID3算法
决策树实现

使用sklearn建立决策树

result = tree.DecisionTreeClassifier(criterion='entropy')
result.fit(x,y)
# print('result'+str(result))
with open('tree1.dot','w') as f:
    f = tree.export_graphviz(result,out_file=f,feature_names=vec.get_feature_names())
#会生成一个包含决策树结果的tree1.dot文件

Graphviz是开源图形可视化软件。图形可视化是一种将结构信息表示为抽象图和网络图的方法。它在网络,生物信息学,软件工程,数据库和网页设计,机器学习以及其他技术领域的可视化界面中具有重要的应用。
自行安装Graphviz,并配置环境变量,将tree1.dot文件转化。
命令: dot -Tjpg tree1.dot -o tree1.jpg 转化成一个图片格式。也可以转换成其他格式,自行百度
关于上篇的python实现决策树案例的一些总结

说明:
此外,例子虽然简单,但是需要学习和注意的点后期应用肯定会遇到,
① | 例如树的深度设定,这个会影响到建立的模型是否存在过拟合的情况,从而影响模型的准确。
② | 还有就是对于连续型特征设置阈值来区分,如:对于一个同学的成绩(0~100)可以分为不及格,良好,优秀,三种情况,需要设置一个阈值来衡量,设置60以下标记为不及格,60到80为良好,80以上为优秀。。。
罗列不全,后续如果有学习到,再更新