当前位置:首页 » 编程语言 » 信息增益python

信息增益python

发布时间: 2024-05-08 12:23:49

python中有哪些简单的算法

首先谢谢邀请,

python中有的算法还是比较多的?

python之所以火是因为人工智能的发展,人工智能的发展离不开算法!

感觉有本书比较适合你,不过可惜的是这本书没有电子版,只有纸质的。

这本书对于算法从基本的入门到实现,循序渐进的介绍,比如里面就涵盖了数学建模的常用算法。

第 1章从数学建模到人工智能

1.1数学建模1.1.1数学建模与人工智能1.1.2数学建模中的常见问题1.2人工智能下的数学1.2.1统计量1.2.2矩阵概念及运算1.2.3概率论与数理统计1.2.4高等数学——导数、微分、不定积分、定积分

第2章 Python快速入门

2.1安装Python2.1.1Python安装步骤2.1.2IDE的选择2.2Python基本操作2.2.1第 一个小程序2.2.2注释与格式化输出2.2.3列表、元组、字典2.2.4条件语句与循环语句2.2.5break、continue、pass2.3Python高级操作2.3.1lambda2.3.2map2.3.3filter

第3章Python科学计算库NumPy

3.1NumPy简介与安装3.1.1NumPy简介3.1.2NumPy安装3.2基本操作3.2.1初识NumPy3.2.2NumPy数组类型3.2.3NumPy创建数组3.2.4索引与切片3.2.5矩阵合并与分割3.2.6矩阵运算与线性代数3.2.7NumPy的广播机制3.2.8NumPy统计函数3.2.9NumPy排序、搜索3.2.10NumPy数据的保存

第4章常用科学计算模块快速入门

4.1Pandas科学计算库4.1.1初识Pandas4.1.2Pandas基本操作4.2Matplotlib可视化图库4.2.1初识Matplotlib4.2.2Matplotlib基本操作4.2.3Matplotlib绘图案例4.3SciPy科学计算库4.3.1初识SciPy4.3.2SciPy基本操作4.3.3SciPy图像处理案例第5章Python网络爬虫5.1爬虫基础5.1.1初识爬虫5.1.2网络爬虫的算法5.2爬虫入门实战5.2.1调用API5.2.2爬虫实战5.3爬虫进阶—高效率爬虫5.3.1多进程5.3.2多线程5.3.3协程5.3.4小结

第6章Python数据存储

6.1关系型数据库MySQL6.1.1初识MySQL6.1.2Python操作MySQL6.2NoSQL之MongoDB6.2.1初识NoSQL6.2.2Python操作MongoDB6.3本章小结6.3.1数据库基本理论6.3.2数据库结合6.3.3结束语

第7章Python数据分析

7.1数据获取7.1.1从键盘获取数据7.1.2文件的读取与写入7.1.3Pandas读写操作7.2数据分析案例7.2.1普查数据统计分析案例7.2.2小结

第8章自然语言处理

8.1Jieba分词基础8.1.1Jieba中文分词8.1.2Jieba分词的3种模式8.1.3标注词性与添加定义词8.2关键词提取8.2.1TF-IDF关键词提取8.2.2TextRank关键词提取8.3word2vec介绍8.3.1word2vec基础原理简介8.3.2word2vec训练模型8.3.3基于gensim的word2vec实战

第9章从回归分析到算法基础

9.1回归分析简介9.1.1“回归”一词的来源9.1.2回归与相关9.1.3回归模型的划分与应用9.2线性回归分析实战9.2.1线性回归的建立与求解9.2.2Python求解回归模型案例9.2.3检验、预测与控制

第10章 从K-Means聚类看算法调参

10.1K-Means基本概述10.1.1K-Means简介10.1.2目标函数10.1.3算法流程10.1.4算法优缺点分析10.2K-Means实战

第11章 从决策树看算法升级

11.1决策树基本简介11.2经典算法介绍11.2.1信息熵11.2.2信息增益11.2.3信息增益率11.2.4基尼系数11.2.5小结11.3决策树实战11.3.1决策树回归11.3.2决策树的分类

第12章 从朴素贝叶斯看算法多变193

12.1朴素贝叶斯简介12.1.1认识朴素贝叶斯12.1.2朴素贝叶斯分类的工作过程12.1.3朴素贝叶斯算法的优缺点12.23种朴素贝叶斯实战

第13章 从推荐系统看算法场景

13.1推荐系统简介13.1.1推荐系统的发展13.1.2协同过滤13.2基于文本的推荐13.2.1标签与知识图谱推荐案例13.2.2小结

第14章 从TensorFlow开启深度学习之旅

14.1初识TensorFlow14.1.1什么是TensorFlow14.1.2安装TensorFlow14.1.3TensorFlow基本概念与原理14.2TensorFlow数据结构14.2.1阶14.2.2形状14.2.3数据类型14.3生成数据十二法14.3.1生成Tensor14.3.2生成序列14.3.3生成随机数14.4TensorFlow实战

希望对你有帮助!!!


贵在坚持,自己掌握一些,在工作中不断打磨,高薪不是梦!!

② python閲屾庝箞璁$畻淇℃伅澧炵泭锛屼俊鎭澧炵泭姣旓纴锘哄凹鎸囨暟

1銆侀栧厛镊瀹氢箟涓浠芥暟鎹锛屽垎鍒璁$畻淇℃伅镡碉纴𨱒′欢淇℃伅镡碉纴浠庤岃$畻淇℃伅澧炵泭銆

③ 零基础学Python应该学习哪些入门知识

关于零基础怎么样能快速学好Python的问题,网络提问和解答的都很多,你可以网络下看看。我觉得从个人自学的角度出发,应从以下几个方面来理解:

1 为什么选择学python?

据统计零基础或非专业的人士学python的比较多,据HackerRank开发者调查报告2018年5月显示(见图),Python排名第一,成为最受欢迎编程语言。Python以优雅、简洁着称,入行门槛低,可以从事linux运维、Python Web网站工程师、Python自动化测试、数据分析、人工智能等职位,薪资待遇呈上涨趋势。

2 入门python需要那些准备?

2.1 心态准备。编程是一门技术,也可说是一门手艺。如同书法、绘画、乐器、雕刻等,技艺纯熟的背后肯定付出了长时间的反复练习。不要相信几周速成,也不能急于求成。编程的世界浩瀚无边,所以请保持一颗敬畏的心态去学习,认真对待写下的每一行代码,甚至每一个字符。收拾好自己的心态,向着编程的世界出发。第一步至关重要,关系到初学者从入门到精通还是从入门到放弃。选一条合适的入门道路,并坚持走下去。

2.2 配置 Python 学习环境。选Python2 还是 Python3?入门时很多人都会纠结。二者只是程序不兼容,思想上并无大差别,语法变动也并不多。选择任何一个入手,都没有大影响。如果你仍然无法抉择,那请选择 Python3,毕竟这是未来的趋势。

编辑器该如何选?同样,推荐 pycharm 社区版,配置简单、功能强大、使用起来省时省心,对初学者友好,并且完全免费!其他编辑器如:notepad++、sublimeText 3、vim 和 Emacs等不推荐了。

操作环境?Python 支持现有所有主流操作平台,不管是 windows 还是 mac 还是 linux,都能很好的运行 Python。并且后两者都默认自带 Python 环境。

2.3 选择自学的书籍。我推荐的书的内容由浅入深,建议按照先后顺序阅读学习:

2.3.1《Python简明教程》。这是一本言简意赅的 Python 入门教程,简单直白,没有废话。就算没有基础,你也可以像读小说一样,花两天时间就可以读完。适合入门快速了解语法。

2.3.2 廖雪峰编写的《Python教程》。廖先生的教程涵盖了 Python 知识的方方面面,内容更加系统,有一定深度,有一定基础之后学习会有更多的收获。

2.4 学会安装包。Python中有很多扩展包,想要安装这些包可以采用两种方法:

2.4.1 使用pip或easy_install。

1)在网上找到的需要的包,下载下来。eg. rsa-3.1.4.tar.gz;

2)解压缩该文件;

3)命令行工具cd切换到所要安装的包的目录,找到setup.py文件,然后输入python setup.py install

2.4.2 不用pip或easy_install,直接打开cmd,敲pip install rsa。

3 提升阶段需要恒心和耐力。

完成入门阶段的基础学习之后,常会陷入一个瓶颈期,通过看教程很难进一步提高编程水平。这时候,需要的是反复练习,大量的练习。可以从书上的例题、作业题开始写,再写小程序片段,然后写完整的项目。我们收集了一些练习题和网站。可根据自己阶段,选择适合的练习去做。建议最好挑选一两个系列重点完成,而不是浅尝辄止。

3.1 多做练习。推荐网站练习:

crossin编程教室实例:相对于编程教室基础练习着重于单一知识点,

编程实例训练对基础知识的融会贯通;

hackerrank:Python 部分难度循序渐进,符合学习曲线

实验楼:提升编程水平从做项目开始;

codewar:社区型编程练习网站,内容由易到难;

leetcode:为编程面试准备,对初学者稍难;

牛客网:提供 BAT 等大厂笔试题目;

codecombat:提供一边游戏一边编程;

projecteuler:纯粹的编程练习网站;

菜鸟教程100例:基于 py2 的基础练习;

3.2 遇到问题多交流。

3.2.1 利用好搜索引擎。

3.2.2 求助于各大网站。推荐

stackoverflow:这是一个程序员的知识库;

v2ex:国内非常不错的编程社区,不仅仅是包含程序,也包含了程序员的生活;

segmentfault:一家以编程问答为主的网站;

CSDN、知乎、简书等

3.2.3 加入相关的QQ、微信群、网络知道。不懂的可以随时请教。

④ python需要学习什么内容

Python的学习内容还是比较多的,我们将学习的过程划分为4个阶段,每个阶段学习对应的内容,具体的学习顺序如下:

Python学习顺序:

①Python软件开发基础

  • 掌握计算机的构成和工作原理

  • 会使用Linux常用工具

  • 熟练使用Docker的基本命令

  • 建立Python开发环境,并使用print输出

  • 使用Python完成字符串的各种操作

  • 使用Python re模块进行程序设计

  • 使用Python创建文件、访问、删除文件

  • 掌握import 语句、From…import 语句、From…import* 语句、方法的引用、Python中的包

  • ②Python软件开发进阶

  • 能够使用Python面向对象方法开发软件

  • 能够自己建立数据库,表,并进行基本数据库操作

  • 掌握非关系数据库MongoDB的使用,掌握Redis开发

  • 能够独立完成TCP/UDP服务端客户端软件开发,能够实现ftp、http服务器,开发邮件软件

  • 能开发多进程、多线程软件

  • ③Python全栈式WEB工程师

  • 能够独立完成后端软件开发,深入理解Python开发后端的精髓

  • 能够独立完成前端软件开发,并和后端结合,熟练掌握使用Python进行全站Web开发的技巧

  • ④Python多领域开发

  • 能够使用Python熟练编写爬虫软件

  • 能够熟练使用Python库进行数据分析

  • 招聘网站Python招聘职位数据爬取分析

  • 掌握使用Python开源人工智能框架进行人工智能软件开发、语音识别、人脸识别

  • 掌握基本设计模式、常用算法

  • 掌握软件工程、项目管理、项目文档、软件测试调优的基本方法

互联网行业目前还是最热门的行业之一,学习IT技能之后足够优秀是有机会进入腾讯、阿里、网易等互联网大厂高薪就业的,发展前景非常好,普通人也可以学习。

想要系统学习,你可以考察对比一下开设有相关专业的热门学校,好的学校拥有根据当下企业需求自主研发课程的能力,中博软件学院、南京课工场、南京北大青鸟等开设python专业的学校都是不错的,建议实地考察对比一下。

祝你学有所成,望采纳。

⑤ 用python实现红酒数据集的ID3,C4.5和CART算法

ID3算法介绍
ID3算法全称为迭代二叉树3代算法(Iterative Dichotomiser 3)
该算法要先进行特征选择,再生成决策树,其中特征选择是基于“信息增益”最大的原则进行的。
但由于决策树完全基于训练集生成的,有可能对训练集过于“依赖”,即产生过拟合现象。因此在生成决策树后,需要对决策树进行剪枝。剪枝有两种形式,分别为前剪枝(Pre-Pruning)和后剪枝(Post-Pruning),一般采用后剪枝。
信息熵、条件熵和信息增益
信息熵:来自于香农定理,表示信息集合所含信息的平均不确定性。信息熵越大,表示不确定性越大,所含的信息量也就越大。
设x 1 , x 2 , x 3 , . . . x n {x_1, x_2, x_3, ...x_n}x
1

,x
2

,x
3

,...x
n

为信息集合X的n个取值,则x i x_ix
i

的概率:
P ( X = i ) = p i , i = 1 , 2 , 3 , . . . , n P(X=i) = p_i, i=1,2,3,...,n
P(X=i)=p
i

,i=1,2,3,...,n

信息集合X的信息熵为:
H ( X ) = − ∑ i = 1 n p i log ⁡ p i H(X) =- \sum_{i=1}^{n}{p_i}\log{p_i}
H(X)=−
i=1

n

p
i

logp
i

条件熵:指已知某个随机变量的情况下,信息集合的信息熵。
设信息集合X中有y 1 , y 2 , y 3 , . . . y m {y_1, y_2, y_3, ...y_m}y
1

,y
2

,y
3

,...y
m

组成的随机变量集合Y,则随机变量(X,Y)的联合概率分布为
P ( x = i , y = j ) = p i j P(x=i,y=j) = p_{ij}
P(x=i,y=j)=p
ij

条件熵:
H ( X ∣ Y ) = ∑ j = 1 m p ( y j ) H ( X ∣ y j ) H(X|Y) = \sum_{j=1}^m{p(y_j)H(X|y_j)}
H(X∣Y)=
j=1

m

p(y
j

)H(X∣y
j

)

H ( X ∣ y j ) = − ∑ j = 1 m p ( y j ) ∑ i = 1 n p ( x i ∣ y j ) log ⁡ p ( x i ∣ y j ) H(X|y_j) = - \sum_{j=1}^m{p(y_j)}\sum_{i=1}^n{p(x_i|y_j)}\log{p(x_i|y_j)}
H(X∣y
j

)=−
j=1

m

p(y
j

)
i=1

n

p(x
i

∣y
j

)logp(x
i

∣y
j

)
和贝叶斯公式:
p ( x i y j ) = p ( x i ∣ y j ) p ( y j ) p(x_iy_j) = p(x_i|y_j)p(y_j)
p(x
i

y
j

)=p(x
i

∣y
j

)p(y
j

)
可以化简条件熵的计算公式为:
H ( X ∣ Y ) = ∑ j = 1 m ∑ i = 1 n p ( x i , y j ) log ⁡ p ( x i ) p ( x i , y j ) H(X|Y) = \sum_{j=1}^m \sum_{i=1}^n{p(x_i, y_j)\log\frac{p(x_i)}{p(x_i, y_j)}}
H(X∣Y)=
j=1

m

i=1

n

p(x
i

,y
j

)log
p(x
i

,y
j

)
p(x
i

)

信息增益:信息熵-条件熵,用于衡量在知道已知随机变量后,信息不确定性减小越大。
d ( X , Y ) = H ( X ) − H ( X ∣ Y ) d(X,Y) = H(X) - H(X|Y)
d(X,Y)=H(X)−H(X∣Y)

python代码实现
import numpy as np
import math

def calShannonEnt(dataSet):
""" 计算信息熵 """
labelCountDict = {}
for d in dataSet:
label = d[-1]
if label not in labelCountDict.keys():
labelCountDict[label] = 1
else:
labelCountDict[label] += 1
entropy = 0.0
for l, c in labelCountDict.items():
p = 1.0 * c / len(dataSet)
entropy -= p * math.log(p, 2)
return entropy

def filterSubDataSet(dataSet, colIndex, value):
"""返回colIndex特征列label等于value,并且过滤掉改特征列的数据集"""
subDataSetList = []
for r in dataSet:
if r[colIndex] == value:
newR = r[:colIndex]
newR = np.append(newR, (r[colIndex + 1:]))
subDataSetList.append(newR)
return np.array(subDataSetList)

def chooseFeature(dataSet):
""" 通过计算信息增益选择最合适的特征"""
featureNum = dataSet.shape[1] - 1
entropy = calShannonEnt(dataSet)
bestInfoGain = 0.0
bestFeatureIndex = -1
for i in range(featureNum):
uniqueValues = np.unique(dataSet[:, i])
condition_entropy = 0.0

for v in uniqueValues: #计算条件熵
subDataSet = filterSubDataSet(dataSet, i, v)
p = 1.0 * len(subDataSet) / len(dataSet)
condition_entropy += p * calShannonEnt(subDataSet)
infoGain = entropy - condition_entropy #计算信息增益

if infoGain >= bestInfoGain: #选择最大信息增益
bestInfoGain = infoGain
bestFeatureIndex = i
return bestFeatureIndex

def creatDecisionTree(dataSet, featNames):
""" 通过训练集生成决策树 """
featureName = featNames[:] # 拷贝featNames,此处不能直接用赋值操作,否则新变量会指向旧变量的地址
classList = list(dataSet[:, -1])
if len(set(classList)) == 1: # 只有一个类别
return classList[0]
if dataSet.shape[1] == 1: #当所有特征属性都利用完仍然无法判断样本属于哪一类,此时归为该数据集中数量最多的那一类
return max(set(classList), key=classList.count)

bestFeatureIndex = chooseFeature(dataSet) #选择特征
bestFeatureName = featNames[bestFeatureIndex]
del featureName[bestFeatureIndex] #移除已选特征列
decisionTree = {bestFeatureName: {}}

featureValueUnique = sorted(set(dataSet[:, bestFeatureIndex])) #已选特征列所包含的类别, 通过递归生成决策树
for v in featureValueUnique:
FeatureName = featureName[:]
subDataSet = filterSubDataSet(dataSet, bestFeatureIndex, v)
decisionTree[bestFeatureName][v] = creatDecisionTree(subDataSet, FeatureName)
return decisionTree

def classify(decisionTree, featnames, featList):
""" 使用训练所得的决策树进行分类 """
classLabel = None
root = decisionTree.keys()[0]
firstGenDict = decisionTree[root]
featIndex = featnames.index(root)
for k in firstGenDict.keys():
if featList[featIndex] == k:
if isinstance(firstGenDict[k], dict): #若子节点仍是树,则递归查找
classLabel = classify(firstGenDict[k], featnames, featList)
else:
classLabel = firstGenDict[k]
return classLabel
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
下面用鸢尾花数据集对该算法进行测试。由于ID3算法只能用于标称型数据,因此用在对连续型的数值数据上时,还需要对数据进行离散化,离散化的方法稍后说明,此处为了简化,先使用每一种特征所有连续性数值的中值作为分界点,小于中值的标记为1,大于中值的标记为0。训练1000次,统计准确率均值。

from sklearn import datasets
from sklearn.model_selection import train_test_split

iris = datasets.load_iris()
data = np.c_[iris.data, iris.target]

scoreL = []
for i in range(1000): #对该过程进行10000次
trainData, testData = train_test_split(data) #区分测试集和训练集

featNames = iris.feature_names[:]
for i in range(trainData.shape[1] - 1): #对训练集每个特征,以中值为分界点进行离散化
splitPoint = np.mean(trainData[:, i])
featNames[i] = featNames[i]+'<='+'{:.3f}'.format(splitPoint)
trainData[:, i] = [1 if x <= splitPoint else 0 for x in trainData[:, i]]
testData[:, i] = [1 if x <= splitPoint else 0 for x in testData[:, i]]

decisionTree = creatDecisionTree(trainData, featNames)
classifyLable = [classify(decisionTree, featNames, td) for td in testData]
scoreL.append(1.0 * sum(classifyLable == testData[:, -1]) / len(classifyLable))
print 'score: ', np.mean(scoreL)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
输出结果为:score: 0.7335,即准确率有73%。每次训练和预测的准确率分布如下:

数据离散化
然而,在上例中对特征值离散化的划分点实际上过于“野蛮”,此处介绍一种通过信息增益最大的标准来对数据进行离散化。原理很简单,当信息增益最大时,说明用该点划分能最大程度降低数据集的不确定性。
具体步骤如下:

对每个特征所包含的数值型特征值排序
对相邻两个特征值取均值,这些均值就是待选的划分点
用每一个待选点把该特征的特征值划分成两类,小于该特征点置为1, 大于该特征点置为0,计算此时的条件熵,并计算出信息增益
选择信息使信息增益最大的划分点进行特征离散化
实现代码如下:

def filterRawData(dataSet, colIndex, value, tag):
""" 用于把每个特征的连续值按照区分点分成两类,加入tag参数,可用于标记筛选的是哪一部分数据"""
filterDataList = []
for r in dataSet:
if (tag and r[colIndex] <= value) or ((not tag) and r[colIndex] > value):
newR = r[:colIndex]
newR = np.append(newR, (r[colIndex + 1:]))
filterDataList.append(newR)
return np.array(filterDataList)

def dataDiscretization(dataSet, featName):
""" 对数据每个特征的数值型特征值进行离散化 """
featureNum = dataSet.shape[1] - 1
entropy = calShannonEnt(dataSet)

for featIndex in range(featureNum): #对于每一个特征
uniqueValues = sorted(np.unique(dataSet[:, featIndex]))
meanPoint = []

for i in range(len(uniqueValues) - 1): # 求出相邻两个值的平均值
meanPoint.append(float(uniqueValues[i+1] + uniqueValues[i]) / 2.0)
bestInfoGain = 0.0
bestMeanPoint = -1
for mp in meanPoint: #对于每个划分点
subEntropy = 0.0 #计算该划分点的信息熵
for tag in range(2): #分别划分为两类
subDataSet = filterRawData(dataSet, featIndex, mp, tag)
p = 1.0 * len(subDataSet) / len(dataSet)
subEntropy += p * calShannonEnt(subDataSet)

## 计算信息增益
infoGain = entropy - subEntropy
## 选择最大信息增益
if infoGain >= bestInfoGain:
bestInfoGain = infoGain
bestMeanPoint = mp
featName[featIndex] = featName[featIndex] + "<=" + "{:.3f}".format(bestMeanPoint)
dataSet[:, featIndex] = [1 if x <= bestMeanPoint else 0 for x in dataSet[:, featIndex]]
return dataSet, featName
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
重新对数据进行离散化,并重复该步骤1000次,同时用sklearn中的DecisionTreeClassifier对相同数据进行分类,分别统计平均准确率。运行代码如下:

from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
scoreL = []
scoreL_sk = []
for i in range(1000): #对该过程进行1000次
featNames = iris.feature_names[:]
trainData, testData = train_test_split(data) #区分测试集和训练集
trainData_tmp = .(trainData)
testData_tmp = .(testData)
discritizationData, discritizationFeatName= dataDiscretization(trainData, featNames) #根据信息增益离散化
for i in range(testData.shape[1]-1): #根据测试集的区分点离散化训练集
splitPoint = float(discritizationFeatName[i].split('<=')[-1])
testData[:, i] = [1 if x<=splitPoint else 0 for x in testData[:, i]]
decisionTree = creatDecisionTree(trainData, featNames)
classifyLable = [classify(decisionTree, featNames, td) for td in testData]
scoreL.append(1.0 * sum(classifyLable == testData[:, -1]) / len(classifyLable))

clf = DecisionTreeClassifier('entropy')
clf.fit(trainData[:, :-1], trainData[:, -1])
clf.predict(testData[:, :-1])
scoreL_sk.append(clf.score(testData[:, :-1], testData[:, -1]))

print 'score: ', np.mean(scoreL)
print 'score-sk: ', np.mean(scoreL_sk)
fig = plt.figure(figsize=(10, 4))
plt.subplot(1,2,1)
pd.Series(scoreL).hist(grid=False, bins=10)
plt.subplot(1,2,2)
pd.Series(scoreL_sk).hist(grid=False, bins=10)
plt.show()
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
两者准确率分别为:
score: 0.7037894736842105
score-sk: 0.7044736842105263

准确率分布如下:

两者的结果非常一样。
(但是。。为什么根据信息熵离散化得到的准确率比直接用均值离散化的准确率还要低啊??哇的哭出声。。)

最后一次决策树图形如下:

决策树剪枝
由于决策树是完全依照训练集生成的,有可能会有过拟合现象,因此一般会对生成的决策树进行剪枝。常用的是通过决策树损失函数剪枝,决策树损失函数表示为:
C a ( T ) = ∑ t = 1 T N t H t ( T ) + α ∣ T ∣ C_a(T) = \sum_{t=1}^TN_tH_t(T) +\alpha|T|
C
a

(T)=
t=1

T

N
t

H
t

(T)+α∣T∣

其中,H t ( T ) H_t(T)H
t

(T)表示叶子节点t的熵值,T表示决策树的深度。前项∑ t = 1 T N t H t ( T ) \sum_{t=1}^TN_tH_t(T)∑
t=1
T

N
t

H
t

(T)是决策树的经验损失函数当随着T的增加,该节点被不停的划分的时候,熵值可以达到最小,然而T的增加会使后项的值增大。决策树损失函数要做的就是在两者之间进行平衡,使得该值最小。
对于决策树损失函数的理解,如何理解决策树的损失函数? - 陶轻松的回答 - 知乎这个回答写得挺好,可以按照答主的思路理解一下

C4.5算法
ID3算法通过信息增益来进行特征选择会有一个比较明显的缺点:即在选择的过程中该算法会优先选择类别较多的属性(这些属性的不确定性小,条件熵小,因此信息增益会大),另外,ID3算法无法解决当每个特征属性中每个分类都只有一个样本的情况(此时每个属性的条件熵都为0)。
C4.5算法ID3算法的改进,它不是依据信息增益进行特征选择,而是依据信息增益率,它添加了特征分裂信息作为惩罚项。定义分裂信息:
S p l i t I n f o ( X , Y ) = − ∑ i n ∣ X i ∣ ∣ X ∣ log ⁡ ∣ X i ∣ ∣ X ∣ SplitInfo(X, Y) =-\sum_i^n\frac{|X_i|}{|X|}\log\frac{|X_i|}{|X|}
SplitInfo(X,Y)=−
i

n

∣X∣
∣X
i



log
∣X∣
∣X
i



则信息增益率为:
G a i n R a t i o ( X , Y ) = d ( X , Y ) S p l i t I n f o ( X , Y ) GainRatio(X,Y)=\frac{d(X,Y)}{SplitInfo(X, Y)}
GainRatio(X,Y)=
SplitInfo(X,Y)
d(X,Y)

关于ID3和C4.5算法
在学习分类回归决策树算法时,看了不少的资料和博客。关于这两个算法,ID3算法是最早的分类算法,这个算法刚出生的时候其实带有很多缺陷:

无法处理连续性特征数据
特征选取会倾向于分类较多的特征
没有解决过拟合的问题
没有解决缺失值的问题
即该算法出生时是没有带有连续特征离散化、剪枝等步骤的。C4.5作为ID3的改进版本弥补列ID3算法不少的缺陷:

通过信息最大增益的标准离散化连续的特征数据
在选择特征是标准从“最大信息增益”改为“最大信息增益率”
通过加入正则项系数对决策树进行剪枝
对缺失值的处理体现在两个方面:特征选择和生成决策树。初始条件下对每个样本的权重置为1。
特征选择:在选取最优特征时,计算出每个特征的信息增益后,需要乘以一个**“非缺失值样本权重占总样本权重的比例”**作为系数来对比每个特征信息增益的大小
生成决策树:在生成决策树时,对于缺失的样本我们按照一定比例把它归属到每个特征值中,比例为该特征每一个特征值占非缺失数据的比重
关于C4.5和CART回归树
作为ID3的改进版本,C4.5克服了许多缺陷,但是它自身还是存在不少问题:

C4.5的熵运算中涉及了对数运算,在数据量大的时候效率非常低。
C4.5的剪枝过于简单
C4.5只能用于分类运算不能用于回归
当特征有多个特征值是C4.5生成多叉树会使树的深度加深
————————————————
版权声明:本文为CSDN博主“Sarah Huang”的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/weixin_44794704/article/details/89406612

⑥ python中的sklearn中决策树使用的是哪一种算法

sklearn中决策树分为DecisionTreeClassifier和DecisionTreeRegressor,所以用的算法是CART算法,也就是分类与回归树算法(classification and regression tree,CART),划分标准默认使用的也是Gini,ID3和C4.5用的是信息熵,为何要设置成ID3或者C4.5呢

热点内容
安卓usb在设置哪里 发布:2024-05-20 05:03:03 浏览:185
绥化编程 发布:2024-05-20 04:59:44 浏览:989
基本原理和从头计算法 发布:2024-05-20 04:50:32 浏览:28
配置情况指的是什么 发布:2024-05-20 04:48:14 浏览:495
那个程序用来编译源文件 发布:2024-05-20 04:46:45 浏览:549
小程序需要数据库吗 发布:2024-05-20 04:35:14 浏览:337
链接sqlserver 发布:2024-05-20 04:27:53 浏览:209
ftp文件服务器扩容 发布:2024-05-20 04:22:21 浏览:646
linux心跳包 发布:2024-05-20 04:17:52 浏览:970
android打开数据库文件 发布:2024-05-20 04:16:07 浏览:572