人工智能--决策树原理与代码实现、特征提取、回归决策树

news2024/9/22 20:21:03

决策树:本质就是一个拥有多个判断节点的树

1,熵

系统越有序,集中,熵值越低;系统越混乱,越分散,熵值越高
在这里插入图片描述
在这里插入图片描述
在这里的计算中,log2记为1,通常以2为底

2,决策树的划分依据

2.1 信息增益

信息增益:以某特征划分数据集前后的熵的差值
在这里插入图片描述
信息增益越大,说明使用特征A来提升数据的纯度越大

2.2 信息增益率

信息增益偏向选择类名更多的特征,为克服该不足,提出信息增益比

C4.5 比ID3 要好的原因:

  1. C4.5使用了信息增益比,克服了不足
  2. 采用了后剪枝方法
  3. 对缺失值的处理

2.3 基尼值和基尼指数

基尼值Gini(D)越小,数据集的纯度越高

信息增益 — ID3决策树
基尼值
基尼指数 — CART

3,CART剪枝

作用:解决过拟合问题
剪枝方法:预剪枝,后剪枝

预剪枝:在生成决策树过程中剪枝

方法:

  • 限制叶子节点最少样本数量,如果小于这个样本就不再分了
  • 限制树的高度和深度;一旦达到这个深度了就不再分了
  • 规定叶子点信息熵阈值,一旦没达到这个阈值就不再分了

后剪枝:在生成了决策树之后

C4.5决策树算法就是采用后剪枝

4,特征提取

定义:将任意数据(如文本或图像)转换为用于机器学习的数字特征
特征提取:文本转换为数字、类别转换为数字
特征提取分类:

  • 字典特征提取(特征离散化)
  • 文本特征提取
  • 图像特征提取(深度学习中讲解)

特征提取API:sklearn.fearure_extraction

4.1字典特征提取

只能处理字典类型的数据,将特征数据转换为one-hot编码的形式
注意:对于值比较少的类别特征使用one-hot编码,如果类别值很多,会对类别进行编号,转换为数字特征即可

from sklearn.feature_extraction import DictVectorizer

def dict_name():
	"字典特征提取"
	#1,获取数据
	data = [{'city':'北京','temperature':100},
	{'city':'上海','temperature':60},
	{'city':'深圳','temperature':30}]
	#2,字典特征提取
	#2.1 实例化
	transfer = DictVectorize(sparse=False)
	#2.2 转换
	new_data = transfer.fit_transform(data)
	print(new_data)
	#2.3 获取具体属性名
	names = transfer.get_feature_names()
	print('属性名字是:\n',names)

if __name__='__main__':
	dict_name()

结果输出:
在这里插入图片描述
sparse=True时,输出如下:
在这里插入图片描述
每一行是:位置 对应数字
sparse=True只存储了非0的位置数字,节省了内存空间且提高了读取效率

4.2 英文文本特征提取

在这里插入图片描述

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.feature_extraction import DictVectorizer

def english_count_demo():
	#获取数据
	data = ["life is short,i like python","life is too long,i dislike python"]
	#文本特征转换
	transfer = CountVectorizer(sparse=True)
	new_data = transfer.fit_transform(data)
	#查看特征名字
	#names = transfer.get_feature_names(spares=True)#会报错,没有参数spares
	names = transfer.get_feature_names()
	print('特征名字是:\n',names)
	print(new_data.toarray())#达到参数spares的效果
	print(new_data)
	
if __name__='__main__':
	english_count_name()

在这里插入图片描述
在这里插入图片描述

4.3 中文文本特征提取

直接用上面的代码,空格或者标点分隔,代表不同的词

from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction import DictVectorizer

def english_count_demo():
	#获取数据
	data = ["生活苦短,我爱python","生活太长久,我不喜欢python"]
	#文本特征转换
	transfer = CountVectorizer(sparse=True)
	new_data = transfer.fit_transform(data)
	#查看特征名字
	#names = transfer.get_feature_names(spares=True)#会报错,没有参数spares
	names = transfer.get_feature_names()
	print('特征名字是:\n',names)
	print(new_data.toarray())#达到参数spares的效果
	print(new_data)
	
if __name__='__main__':
	english_count_name()

在这里插入图片描述

jieba分词:jieba.cut()

from sklearn.feature_extraction.text import CountVectorizer
import jieba

def cut_word(text):
	#对中文进行分词:“我爱北京天安门”--‘我 爱 北京 天安门’
	#用jieba对中午字符串进行分词
	text = " ".join(list(jieba.cut(text))) #空格分开的形式
	return text

def text_chinese_count_demo():
	#对中文进行特征提取
	data = ["一种还是一种今天很残酷,明天更残酷,后天很美好,但绝大部分是死在明天晚上所以每个人不要放弃","我们看到的是过去的明天,或许今天会有所不同,了解某种事物,了解到明天"]
	#将文本转换为分好词的形式
	text_list = [] 
	for sent in data:
		text_list.append(cut_word(seent))
	print(text_list)

	#1,实例化一个转换器类
	transfer = CountVectorizer()
	#transfer = CountVectorizer(stop_words=['今天',"明天","后天"])#停用词,觉得这些词语没用不显示
	
	#2,调用fit_transfore
	data = transfer.fit_transform(text_list)
	print('文本特征抽取的结果是:\n',data.toarray())
	print('返回特征名字:\n',transfer.get_feature_names)

if __name__='__main__':
	text_chinese_count_demo()

4.4 Tf-idf文本特征提取

Tf-idf主要思想:如果某一个词或者短语在一篇文章中出现的概率高,并且在其他文章中很小出现,则认为该词或者短语具有很好的类别区分能力,适合用来分类。
Tf-idf作用:用以评估一字词对于一个文件集或一个语料库中的某个文件的重要程度

概念:

词频tf:指的是某一个给定的词语在该文件中出现的频率
逆向文档频率idf:是一个词语普遍重要性的度量,某一特定词语的idf是,由总文件数目除以包含该词语的文件数,再将得到的商取以10为底的对数得到

tf 词频
IDF指的是逆向文档频率,表示词是否具有强区分度
TFIDF表示某个词在当前文章中的重要性程度,经常被用于文本分类、垃圾邮件识别等场景中

公式:tf-idf = tf * idf
例子:总共1000个文件,含有某词语的文件10个,
所以tf=10/1000=0.1 , idf = log (1000/10) =2
tf-idf = tf * idf=0.2

API :skl
代码和上面一样,只需要改CountVectorizer为TfidfVectorizer

5,决策树算法api

在这里插入图片描述

6,泰坦尼克号乘客生存预测

步骤
1,获取数据 2,数据预处理 3,特征工程 4,机器学习建模 5,模型评估
步骤:获取数据-数据预处理(确定特征值与目标值、缺失值处理、数据集划分)、特征工程(字典特征抽取)、机器学习(决策树)、模型评估

kaggle上的项目与数据

观察数据得到:1,乘客班(1,2,3)2,age列有缺失

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.feature_exyraction import DictVectorizer

#1.获取数据
titan = pd.read_scv("https://labfile.oss.aliyuncs.com/courses/1363/Titanic.csv")
titan
titan.describe()

在这里插入图片描述

#2.1 确定特征值与目标值
x = titan[['pclass','age','sex']]
y = titan['survived']
x.head()
#2.2 缺失值处理
#age太多缺失,不能进行删除,进行替换
x['age'].fillna(value=titan['age'].mean(),inplace=True)

#2.3数据集划分
x_train,x_test,y_train,y_test=train_test_split(x,y,random_state=22,test_size=0.2)
#3 .特征工程(字典特征抽取)
x_train.head()
x_train = x_train.to_dict(orient='records') #转换成字典形式
x_test = x_test.to_dict(orient='records')

transfer = DictVectorizer
x_train = transfer.fit_transform(x_train)
x_test = transfer.fit_transform(x_test)
#4,决策树
estimator = DecisionTreeClassifier()
estimator.fit(x_train,y_train)

#5,模型评估
y_pre = estimator.predict(x_test)
y_pre
ret = estimator.score(x_test,y_test)
print(ret)

7,决策树总结

优点:简单的解释和理解,可视化
缺点:容易发生过拟合-改进:剪枝cart算法、随机森林

8,回归决策树

分类决策树和回归决策树
前者处理离散数据,后者处理连续性数据

举例说明:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor
from sklearn.linear_model import LinearRegression

#生成数据
x = np.array(list(range(1,11))).reshape(-1,1)
#reshape(-1,1)的意义把原本一维数据转成二维数据,这样方便输入
y = ([5.56,5.70,5.91,6.40,6.80,7.05,8.09,8.70,9.00,9.05])

#模型训练
m1 = DecisionTreeRegressor(max_depth=1)
m2 = DecisionTreeRegressor(max_depth=3)
m3 = LinearRegression()

m1.fit(x,y)
m2.fit(x,y)
m3.fit(x,y)
#模型预测
x_test =np.arange(0,10,0.01).reshape(-1,1)
y_1 = m1.predict(x_test)
y_2 = m1.predict(x_test)
y_3 = m1.predict(x_test)

#结果可视化
plt.figure(figsize=(10,6),dpi=100)
plt.scatter(x,y,label='data')
plt.plot(x_test,y_1,label='max_depth=1')
plt.plot(x_test,y_2,label='max_depth=3')
plt.plot(x_test,y_3,label='LinearRegression')

plt.xlabel('数据')
plt.ylabel('预测值')
plt.legend()
plt.show()

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/79590.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Matlab|基于粒子群优化算法及鲁棒MPPT控制器提高光伏并网的效率

💥💥💥💞💞💞欢迎来到本博客❤️❤️❤️💥💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑…

SpringBoot中使用Easyexcel实现Excel导入导出功能(三)

导出的数据包含有图片 导出excel表格的数据包含有图片,这种场景比较少。通Easyexcel实现这样的需求,我认为最简便的方法就是使用前面提到的自定义转换器(com.alibaba.excel.converters.Converter);假如有这样一个场景&…

mysql学习-- 聚合函数,group by理解与使用

文章目录聚合函数定义常用的聚合函数group by的使用使用单个列进行分组根据多个列进行分组having 的使用作用要求sql 语法sql92语法:sql99语法:sql语句的执行过程(进理解为主):聚合函数 定义 作用一组数据&#xff0…

ArcGIS Pro为CAD设置投影

将CAD加载到GIS中,经常出现与GIS数据不能重合的问题。 现在的国空规划的数据基本都是CGCS2000,不重叠的原因不太可能是因为地理坐标系不统一,那极有可能就是ArcGIS的动态投影与CAD的带号没有统一。 如下图,左边为ArcGIS动态投影…

宠物之家网站大学生网页制作教程 学生HTML静态宠物网页设计作业成品 DIV布局简单动物网页制作代码

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

宝塔无法安装fileinfo扩展解决办法(小白篇)

宝塔无法安装fileinfo扩展解决办法(小白篇) 宝塔无法php安装fileinfo扩展的方法:手动安装 重装系统登录宝塔先不要安装其他软件,先设置swap是Linux下的虚拟内存,设置内存后先安装PHP版本,安装好PHP以后&…

Python实现数据结构与算法(三)链表

链表 为什么需要链表 顺序表的构建需要预先知道数据大小来申请连续的存储空间,而在进行扩充时又需要进行数据的搬迁,所以使用起来并不是很灵活。 链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。 链表的定义 链表&#xf…

html内联框架iframe

<!--iframe内联框架src&#xff1a;地址w-h&#xff1a;宽度高度 --> <iframe src"https://www.4399.com" frameborder"0" width"800px" height"800px"></iframe> 使用name属性&#xff1a; <!--回顾&#xff1…

Allegro如何创建差分对操作指导

Allegro如何创建差分对操作指导 Allegro可以在规则管理器里面进行差分对的创建,让两个网络以差分的形式布线,具体操作如下 打开规则管理器 选择Physical-net-All layers 选择两个需要创建差分对的网络,选择Create-Differential Pair 输入差分对的名字 选择Create 差分…

【MATLAB教程案例58】使用matlab实现yolov2网络目标检测功能与仿真分析

欢迎订阅《FPGA学习入门100例教程》、《MATLAB学习入门100例教程》 目录 1.软件版本 2.yolo网络理论概述

Python画3D足球2

文章目录前情提要补点球形膨胀前情提要 足球是正五边形和正六边形拼接而成&#xff0c;由此形成的骨架结构&#xff0c;可通过切割正二十面体获得&#xff0c;所以画足球的第一步是画正二十面体&#xff1a;Python绘制正二十面体 在学会绘制正二十面体之后&#xff0c;就可以…

【JavaWeb开发-Servlet】老人言随机语录

需求&#xff1a;点击网页按钮随机显示一句话&#xff1a; 1、内容涵盖&#xff1a; 老人言、励志语录、名言名言、一句情话 2、设计要求&#xff1a; 以老人言为例&#xff1a;①在数据库创建一张表&#xff0c;存放老人言经典语录。字段包括&#xff1a;id、sentence。id为in…

腾讯云特惠专区——永久有效

腾讯云—腾讯倾力打造的云计算品牌,以卓越科技能力助力各行各业数字化转型,为全球客户提供领先的云计算、大数据、人工智能服务,以及定制化行业解决方案和提供可靠企业上云服务。 购买腾讯云的优势是新用户特别便宜;国内访问速度快;个人认证可秒过;缺点是:网站内容或者…

论文投稿指南——中文核心期刊推荐(机械、仪表工业)

【前言】 &#x1f680; 想发论文怎么办&#xff1f;手把手教你论文如何投稿&#xff01;那么&#xff0c;首先要搞懂投稿目标——论文期刊 &#x1f384;&#x1f388; 在期刊论文的分布中&#xff0c;存在一种普遍现象&#xff1a;即对于某一特定的学科或专业来说&#xff…

java计算机毕业设计ssm医院预约挂号系统b9971(附源码、数据库)

java计算机毕业设计ssm医院预约挂号系统b9971&#xff08;附源码、数据库&#xff09; 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat8.5 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff0…

C# 运算符与表达式

一 运算符 ① 算术运算符&#xff1a;、-、、/、%、、–; ② 关系运算符&#xff1a;>,<,>,<,,!; ③ 逻辑运算符&#xff1a;!,&,|,^,&&,||; ④ 位运算符&#xff1a;&,|,^,~,>>,<<; ⑤ 赋值运算符&#xff1a; 扩展赋值运算符&#…

ESP32 ESP-IDF LVGL8.3.3移植

陈拓 2022/11/27-2022/12/10 1. 概述 在《ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示》 ESP32 ESP-IDF TFT-LCD(ST7735 128x160) LVGL演示_晨之清风的博客-CSDN博客_esp32 tftlcd在ESP32开发框架ESP-IDF中用LVGL库驱动TFT-LCD(ST7735 128x160) 显示屏演示GUIhttps://bl…

游戏开发46课 性能优化5

3. CPU优化 性能优化最主要的一部分工作是CPU&#xff0c;CPU性能优化好了&#xff0c;离目标就成功了一半。 3.1 缓存计算结果 缓存计算是空间换时间的经典应用&#xff0c;它适用于那些耗费大量CPU计算而计算结果无需每帧变化的逻辑。实现伪代码&#xff1a; std::map<…

【Redis场景1】用户登录注册

细节回顾&#xff1a; 关于cookie和session不熟悉的朋友&#xff1b; 建议阅读该博客&#xff1a;https://www.cnblogs.com/ityouknow/p/10856177.html 执行流程&#xff1a; 在单体模式下&#xff0c;一般采用这种模式来存储&#xff0c;传递、认证用户登录、注册等信息&…

阿里巴巴最新推出王者笔记:“Spring MVC 源码与实践”

前言&#xff1a; Spring MVC 是 Spring 框架中用于 Web 应用快速开发的一个模块。Spring MVC 的 MVC 是 Model-View-Contoller 的缩写。它是一个广泛应用于图形化用户交互开发中的设计模式&#xff0c;不仅常见于 Web 开发&#xff0c;也广泛应用于如 Swing 和 JavaFX 等桌面…