Python机器学习【二】 - 决策树

Python机器学习【二】 - 决策树

原文地址:Python机器学习【二】 - 决策树

上一篇基于sklearn Python库创建K近邻模型(KNN)实现了机器学习Hello World示例,KNN属于最简单的分类算法,简单来讲就是当预测一个新的值时,根据它最近的K个点是什么类型来判断属于哪个类别。掌握了KNN也算是简单入门机器学习了,学习新东西总是要由浅入深,这次准备学习另一种分类算法:决策树

一、决策树

决策树算法采用树形结构,使用层层推理来实现最终的分类,是一种基于 if-then-else 规则的有监督学习算法,决策树的这些规则通过训练得到,而不是人工制定的。

有监督学习: 给定数据,预测标签,它从有标记的训练数据中推导出预测函数。

无监督学习: 给定数据,寻找隐藏的结构,它从无标记的训练数据中推断结论。

我们的生活中有很多决策树的案例,举个简单栗子:银行要对客户进行信用登记评估,可能会根据有无逾期记录、有无逾期未还款记录、有无房产等指标进行评估,得到下面最简单的模型:

二、目标

已知有178个葡萄酒样本数据,每个样本采样酒精、苹果酸、灰、灰的碱性、镁、总酚等共13个特征,葡萄酒分为三个类型,分别用class_0、class_1、class_2表示。

178个葡萄酒中:class_0有59个,class_1有71个,class_2有48个,我们仍然取178条数据的70%作为训练数据,经过训练模型、模型评估,预测剩余30%数据样本的类型,计算出准确率以及查看学习生成的决策树。

三、实现步骤
  1. 安装sklearn
pip install -U scikit-learn
  1. Python实现
  • 获取数据
from sklearn import datasets


# 获取葡萄酒据集,sklearn库提供
wines = datasets.load_wine()
"""
共178个样本,样本具有13个特征值(feature_names)
feature_names:
    alcohol: 酒精
    malic_acid: 苹果酸
    ash: 灰
    alcalinity_of_ash: 灰的碱性
    magnesium: 镁
    total_phenols: 总酚
    flavanoids: 类黄酮
    nonflavanoid_phenols: 非黄烷类酚类
    proanthocyanins: 花青素
    color_intensity: 颜色强度
    hue: 色调
    od280/od315_of_diluted_wines: od280/od315稀释葡萄酒
    proline: 脯氨酸
三种红酒类型(classes)
classes:
    class_0
    class_1
    class_2
"""
print("葡萄酒类型", list(wines.target_names))  # ['class_0', 'class_1', 'class_2']
print("样本特征值", list(wines.feature_names))  # 太长,见注释
print("数据规模", wines.data.shape)  # (178, 13)
  • 数据预处理
x_train, x_test, y_train, y_test = train_test_split(wines.data, wines.target, test_size=0.3)  # 分训练集、测试集  测试集占0.3
print("训练集", x_train.shape)  # (124, 13)
print("测试集", x_test.shape)  # (54, 13)
  • 训练模型
clf = tree.DecisionTreeClassifier(criterion="entropy")  # 载入决策树分类模型
clf = clf.fit(x_train, y_train)
  • 模型评估
score = clf.score(x_test, y_test)
print("准确度", score)  # 0.9629629629629629
  • 画出该决策树

graphviz是一个绘图工具,可以根据dot脚本画出树形图,windows平台使用graphviz需要先安装graphviz软件,再安装graphviz python模块

  1. 安装graphviz软件

下载地址:graphviz软件
注意安装时勾选 Add Graphviz to the system PATH,安装成功后,需要重启 PyCharm

  1. 安装graphviz模块
pip install graphviz
  1. 画出决策树
import graphviz

feature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮', '非黄烷类酚类', '花青素', '颜色强度', '色调', 'od280/od315稀释葡萄酒', '脯氨酸']
class_names = ["class_0", "class_1", "class_2"]
dot_data = tree.export_graphviz(clf, out_file='tree.dot', feature_names=feature_name, class_names=class_names, filled=True, rounded=True)
# 处理中文乱码
with open("tree.dot", encoding='utf-8') as f:
    dot_graph = f.read()
    graph = graphviz.Source(dot_graph.replace("helvetica", "FangSong"))
graph.view()
完整代码
from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn import tree
import graphviz

# 获取葡萄酒据集,sklearn库提供
wines = datasets.load_wine()
"""
共178个样本,样本具有13个特征值(feature_names)
feature_names:
    alcohol: 酒精
    malic_acid: 苹果酸
    ash: 灰
    alcalinity_of_ash: 灰的碱性
    magnesium: 镁
    total_phenols: 总酚
    flavanoids: 类黄酮
    nonflavanoid_phenols: 非黄烷类酚类
    proanthocyanins: 花青素
    color_intensity: 颜色强度
    hue: 色调
    od280/od315_of_diluted_wines: od280/od315稀释葡萄酒
    proline: 脯氨酸
三种红酒类型(classes)
classes:
    class_0
    class_1
    class_2
"""
print("葡萄酒类型", list(wines.target_names))  # ['class_0', 'class_1', 'class_2']
print("样本特征值", list(wines.feature_names))  # 太长,见注释
print("数据规模", wines.data.shape)  # (178, 13)

x_train, x_test, y_train, y_test = train_test_split(wines.data, wines.target, test_size=0.3)  # 分训练集、测试集  测试集占0.3
print("训练集", x_train.shape)
print("测试集", x_test.shape)

clf = tree.DecisionTreeClassifier(criterion="entropy")  # 载入决策树分类模型
clf = clf.fit(x_train, y_train)
score = clf.score(x_test, y_test)
print("准确度", score)

feature_name = ['酒精', '苹果酸', '灰', '灰的碱性', '镁', '总酚', '类黄酮', '非黄烷类酚类', '花青素', '颜色强度', '色调', 'od280/od315稀释葡萄酒', '脯氨酸']
class_names = ["class_0", "class_1", "class_2"]
dot_data = tree.export_graphviz(clf, out_file='tree.dot', feature_names=feature_name, class_names=class_names, filled=True, rounded=True)
# 处理中文乱码
with open("tree.dot", encoding='utf-8') as f:
    dot_graph = f.read()
    graph = graphviz.Source(dot_graph.replace("helvetica", "FangSong"))
graph.view()
参考
  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

OurQueen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值