python拟合分布
⑴ 如何通过python进行深度学习
作者 | Vihar Kurama
编译 | 荷叶
来源 | 云栖社区
摘要:深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。本文就用一个小例子无死角的介绍一下深度学习!
人脑模拟
深度学习背后的主要原因是人工智能应该从人脑中汲取灵感。此观点引出了“神经网络”这一术语。人脑中包含数十亿个神经元,它们之间有数万个连接。很多情况下,深度学习算法和人脑相似,因为人脑和深度学习模型都拥有大量的编译单元(神经元),这些编译单元(神经元)在独立的情况下都不太智能,但是当他们相互作用时就会变得智能。
我认为人们需要了解到深度学习正在使得很多幕后的事物变得更好。深度学习已经应用于谷歌搜索和图像搜索,你可以通过它搜索像“拥抱”这样的词语以获得相应的图像。-杰弗里·辛顿
神经元
神经网络的基本构建模块是人工神经元,它模仿了人类大脑的神经元。这些神经元是简单、强大的计算单元,拥有加权输入信号并且使用激活函数产生输出信号。这些神经元分布在神经网络的几个层中。
inputs 输入 outputs 输出 weights 权值 activation 激活
人工神经网络的工作原理是什么?
深度学习由人工神经网络构成,该网络模拟了人脑中类似的网络。当数据穿过这个人工网络时,每一层都会处理这个数据的一方面,过滤掉异常值,辨认出熟悉的实体,并产生最终输出。
输入层:该层由神经元组成,这些神经元只接收输入信息并将它传递到其他层。输入层的图层数应等于数据集里的属性或要素的数量。输出层:输出层具有预测性,其主要取决于你所构建的模型类型。隐含层:隐含层处于输入层和输出层之间,以模型类型为基础。隐含层包含大量的神经元。处于隐含层的神经元会先转化输入信息,再将它们传递出去。随着网络受训练,权重得到更新,从而使其更具前瞻性。
神经元的权重
权重是指两个神经元之间的连接的强度或幅度。你如果熟悉线性回归的话,可以将输入的权重类比为我们在回归方程中用的系数。权重通常被初始化为小的随机数值,比如数值0-1。
前馈深度网络
前馈监督神经网络曾是第一个也是最成功的学习算法。该网络也可被称为深度网络、多层感知机(MLP)或简单神经网络,并且阐明了具有单一隐含层的原始架构。每个神经元通过某个权重和另一个神经元相关联。
该网络处理向前处理输入信息,激活神经元,最终产生输出值。在此网络中,这称为前向传递。
inputlayer 输入层 hidden layer 输出层 output layer 输出层
激活函数
激活函数就是求和加权的输入到神经元的输出的映射。之所以称之为激活函数或传递函数是因为它控制着激活神经元的初始值和输出信号的强度。
用数学表示为:
我们有许多激活函数,其中使用最多的是整流线性单元函数、双曲正切函数和solfPlus函数。
激活函数的速查表如下:
反向传播
在网络中,我们将预测值与预期输出值相比较,并使用函数计算其误差。然后,这个误差会传回这个网络,每次传回一个层,权重也会根绝其导致的误差值进行更新。这个聪明的数学法是反向传播算法。这个步骤会在训练数据的所有样本中反复进行,整个训练数据集的网络更新一轮称为一个时期。一个网络可受训练数十、数百或数千个时期。
prediction error 预测误差
代价函数和梯度下降
代价函数度量了神经网络对给定的训练输入和预期输出“有多好”。该函数可能取决于权重、偏差等属性。
代价函数是单值的,并不是一个向量,因为它从整体上评估神经网络的性能。在运用梯度下降最优算法时,权重在每个时期后都会得到增量式地更新。
兼容代价函数
用数学表述为差值平方和:
target 目标值 output 输出值
权重更新的大小和方向是由在代价梯度的反向上采取步骤计算出的。
其中η 是学习率
其中Δw是包含每个权重系数w的权重更新的向量,其计算方式如下:
target 目标值 output 输出值
图表中会考虑到单系数的代价函数
initial weight 初始权重 gradient 梯度 global cost minimum 代价极小值
在导数达到最小误差值之前,我们会一直计算梯度下降,并且每个步骤都会取决于斜率(梯度)的陡度。
多层感知器(前向传播)
这类网络由多层神经元组成,通常这些神经元以前馈方式(向前传播)相互连接。一层中的每个神经元可以直接连接后续层的神经元。在许多应用中,这些网络的单元会采用S型函数或整流线性单元(整流线性激活)函数作为激活函数。
现在想想看要找出处理次数这个问题,给定的账户和家庭成员作为输入
要解决这个问题,首先,我们需要先创建一个前向传播神经网络。我们的输入层将是家庭成员和账户的数量,隐含层数为1, 输出层将是处理次数。
将图中输入层到输出层的给定权重作为输入:家庭成员数为2、账户数为3。
现在将通过以下步骤使用前向传播来计算隐含层(i,j)和输出层(k)的值。
步骤:
1, 乘法-添加方法。
2, 点积(输入*权重)。
3,一次一个数据点的前向传播。
4, 输出是该数据点的预测。
i的值将从相连接的神经元所对应的输入值和权重中计算出来。
i = (2 * 1) + (3* 1) → i = 5
同样地,j = (2 * -1) + (3 * 1) → j =1
K = (5 * 2) + (1* -1) → k = 9
Python中的多层感知器问题的解决
激活函数的使用
为了使神经网络达到其最大预测能力,我们需要在隐含层应用一个激活函数,以捕捉非线性。我们通过将值代入方程式的方式来在输入层和输出层应用激活函数。
这里我们使用整流线性激活(ReLU):
用Keras开发第一个神经网络
关于Keras:
Keras是一个高级神经网络的应用程序编程接口,由Python编写,能够搭建在TensorFlow,CNTK,或Theano上。
使用PIP在设备上安装Keras,并且运行下列指令。
在keras执行深度学习程序的步骤
1,加载数据;
2,创建模型;
3,编译模型;
4,拟合模型;
5,评估模型。
开发Keras模型
全连接层用Dense表示。我们可以指定层中神经元的数量作为第一参数,指定初始化方法为第二参数,即初始化参数,并且用激活参数确定激活函数。既然模型已经创建,我们就可以编译它。我们在底层库(也称为后端)用高效数字库编译模型,底层库可以用Theano或TensorFlow。目前为止,我们已经完成了创建模型和编译模型,为进行有效计算做好了准备。现在可以在PIMA数据上运行模型了。我们可以在模型上调用拟合函数f(),以在数据上训练或拟合模型。
我们先从KERAS中的程序开始,
神经网络一直训练到150个时期,并返回精确值。
⑵ 121 11 个案例掌握 Python 数据可视化--星际探索
星空是无数人梦寐以求想了解的一个领域,远古的人们通过肉眼观察星空,并制定了太阴历,指导农业发展。随着现代科技发展,有了更先进的设备进行星空的探索。本实验获取了美国国家航空航天局(NASA)官网发布的地外行星数据,研究及可视化了地外行星各参数、寻找到了一颗类地行星并研究了天体参数的相关关系。
输入并执行魔法命令 %matplotlib inline, 设置全局字号,去除图例边框,去除右侧和顶部坐标轴。
本数据集来自 NASA,行星发现是 NASA 的重要工作之一,本数据集搜集了 NASA 官网发布的 4296 颗行星的数据,本数据集字段包括:
导入数据并查看前 5 行。
截至 2020 年 10 月 22 日 全球共发现 4296 颗行星,按年聚合并绘制年度行星发现数,并在左上角绘制 NASA 的官方 LOGO 。
从运行结果可以看出,2005 年以前全球行星发现数是非常少的,经计算总计 173 颗,2014 和 2016 是行星发现成果最多的年份,2016 年度发现行星 1505 颗。
对不同机构/项目/计划进行聚合并降序排列,绘制发现行星数目的前 20 。
2009 年至 2013 年,开普勒太空望远镜成为有史以来最成功的系外行星发现者。在一片天空中至少找到了 1030 颗系外行星以及超过 4600 颗疑似行星。当机械故障剥夺了该探测器对于恒星的精确定位功能后,地球上的工程师们于 2014 年对其进行了彻底改造,并以 K2 计划命名,后者将在更短的时间内搜寻宇宙的另一片区域。
对发现行星的方式进行聚合并降序排列,绘制各种方法发现行星的比例,由于排名靠后的几种方式发现行星数较少,因此不显示其标签。
行星在宇宙中并不会发光,因此无法直接观察,行星发现的方式多为间接方式。从输出结果可以看出,发现行星主要有以下 3 种方式,其原理如下:
针对不同的行星质量,绘制比其质量大(或者小)的行星比例,由于行星质量量纲分布跨度较大,因此采用对数坐标。
从输出结果可以看出,在已发现的行星中,96.25% 行星的质量大于地球。(图中横坐标小于 e 的红色面积非常小)
通过 sns.distplot 接口绘制全部行星的质量分布图。
从输出结果可以看出,所有行星质量分布呈双峰分布,第一个峰在 1.8 左右(此处用了对数单位,表示大约 6 个地球质量),第二个峰在 6.2 左右(大概 493 个地球质量)。
针对不同发现方式发现的行星,绘制各行星的公转周期和质量的关系。
从输出结果可以看出:径向速度(Radial Velocity)方法发现的行星在公转周期和质量上分布更宽,而凌日(Transit)似乎只能发现公转周期相对较短的行星,这是因为两种方法的原理差异造成的。对于公转周期很长的行星,其运行到恒星和观察者之间的时间也较长,因此凌日发现此类行星会相对较少。而径向速度与其说是在发现行星,不如说是在观察恒星,由于恒星自身发光,因此其观察机会更多,发现各类行星的可能性更大。
针对不同发现方式发现的行星,绘制各行星的距离和质量的关系。
从输出结果可以看出,凌日和径向速度对距离较为敏感,远距离的行星大多是通过凌日发现的,而近距离的行星大多数通过径向速度发现的。原因是:近距离的行星其引力对恒星造成的摆动更为明显,因此更容易观察;当距离较远时,引力作用变弱,摆动效应减弱,因此很难借助此方法观察到行星。同时,可以观察到当行星质量更大时,其距离分布相对较宽,这是因为虽然相对恒星的距离变长了,但是由于行星质量的增加,相对引力也同步增加,恒星摆动效应会变得明显。
将所有行星的质量和半径对数化处理,绘制其分布并拟合其分布。
由于:
因此,从原理上质量对数与半径对数应该是线性关系,且斜率为定值 3 ,截距的大小与密度相关。
从输出结果可以看出:行星质量和行星半径在对数变换下,具有较好的线性关系。输出 fix_xy 数值可知,其关系可以拟合出如下公式:
拟合出曲线对应的行星平均密度为:
同样的方式绘制恒星质量与半径的关系。
从输出结果可以看出,恒星与行星的规律不同,其质量与半径在对数下呈二次曲线关系,其关系符合以下公式:
同样的方式研究恒星表面重力加速度与半径的关系。
从输出结果可以看出,恒星表面对数重力加速度与其对数半径呈现较好的线性关系:
以上我们分别探索了各变量的分布和部分变量的相关关系,当数据较多时,可以通过 pd.plotting.scatter_matrix 接口,直接绘制各变量的分布和任意两个变量的散点图分布,对于数据的初步探索,该接口可以让我们迅速对数据全貌有较为清晰的认识。
通过行星的半径和质量,恒星的半径和质量,以及行星的公转周期等指标与地球的相似性,寻找诸多行星中最类似地球的行星。
从输出结果可以看出,在 0.6 附近的位置出现了一个最大的圆圈,那就是我们找到的类地行星 Kepler - 452 b ,让我们了解一下这颗行星:
数据显示,Kepler - 452 b 行星公转周期为 384.84 天,半径为 1.63 地球半径,质量为 3.29 地球质量;它的恒星为 Kepler - 452 半径为太阳的 1.11 倍,质量为 1.04 倍,恒星方面数据与太阳相似度极高。
以下内容来自网络。 开普勒452b(Kepler 452b) ,是美国国家航空航天局(NASA)发现的外行星, 直径是地球的 1.6 倍,地球相似指数( ESI )为 0.83,距离地球1400光年,位于为天鹅座。
2015 年 7 月 24 日 0:00,美国国家航空航天局 NASA 举办媒体电话会议宣称,他们在天鹅座发现了一颗与地球相似指数达到 0.98 的类地行星开普勒 - 452 b。这个类地行星距离地球 1400 光年,绕着一颗与太阳非常相似的恒星运行。开普勒 452 b 到恒星的距离,跟地球到太阳的距离相同。NASA 称,由于缺乏关键数据,现在不能说 Kepler - 452 b 究竟是不是“另外一个地球”,只能说它是“迄今最接近另外一个地球”的系外行星。
在银河系经纬度坐标下绘制所有行星,并标记地球和 Kepler - 452 b 行星的位置。
类地行星,是人类寄希望移民的第二故乡,但即使最近的 Kepler-452 b ,也与地球相聚 1400 光年。
以下通过行星的公转周期和质量两个特征将所有行星聚为两类,即通过训练获得两个簇心。
定义函数-计算距离
聚类距离采用欧式距离:
定义函数-训练簇心
训练簇心的原理是:根据上一次的簇心计算所有点与所有簇心的距离,任一点的分类以其距离最近的簇心确定。依此原理计算出所有点的分类后,对每个分类计算新的簇心。
定义函数预测分类
根据训练得到的簇心,预测输入新的数据特征的分类。
开始训练
随机生成一个簇心,并训练 15 次。
绘制聚类结果
以最后一次训练得到的簇心为基础,进行行星的分类,并以等高面的形式绘制各类的边界。
从运行结果可以看出,所有行星被分成了两类。并通过上三角和下三角标注了每个类别的簇心位置。
聚类前
以下输出了聚类前原始数据绘制的图像。
⑶ 建议收藏!10 种 Python 聚类算法完整操作示例
聚类或聚类分析是无监督学习问题。它通常被用作数据分析技术,用于发现数据中的有趣模式,例如基于其行为的客户群。有许多聚类算法可供选择,对于所有情况,没有单一的最佳聚类算法。相反,最好探索一系列聚类算法以及每种算法的不同配置。在本教程中,你将发现如何在 python 中安装和使用顶级聚类算法。完成本教程后,你将知道:
聚类分析,即聚类,是一项无监督的机器学习任务。它包括自动发现数据中的自然分组。与监督学习(类似预测建模)不同,聚类算法只解释输入数据,并在特征空间中找到自然组或群集。
群集通常是特征空间中的密度区域,其中来自域的示例(观测或数据行)比其他群集更接近群集。群集可以具有作为样本或点特征空间的中心(质心),并且可以具有边界或范围。
聚类可以作为数据分析活动提供帮助,以便了解更多关于问题域的信息,即所谓的模式发现或知识发现。例如:
聚类还可用作特征工程的类型,其中现有的和新的示例可被映射并标记为属于数据中所标识的群集之一。虽然确实存在许多特定于群集的定量措施,但是对所识别的群集的评估是主观的,并且可能需要领域专家。通常,聚类算法在人工合成数据集上与预先定义的群集进行学术比较,预计算法会发现这些群集。
有许多类型的聚类算法。许多算法在特征空间中的示例之间使用相似度或距离度量,以发现密集的观测区域。因此,在使用聚类算法之前,扩展数据通常是良好的实践。
一些聚类算法要求您指定或猜测数据中要发现的群集的数量,而另一些算法要求指定观测之间的最小距离,其中示例可以被视为“关闭”或“连接”。因此,聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。scikit-learn 库提供了一套不同的聚类算法供选择。下面列出了10种比较流行的算法:
每个算法都提供了一种不同的方法来应对数据中发现自然组的挑战。没有最好的聚类算法,也没有简单的方法来找到最好的算法为您的数据没有使用控制实验。在本教程中,我们将回顾如何使用来自 scikit-learn 库的这10个流行的聚类算法中的每一个。这些示例将为您复制粘贴示例并在自己的数据上测试方法提供基础。我们不会深入研究算法如何工作的理论,也不会直接比较它们。让我们深入研究一下。
在本节中,我们将回顾如何在 scikit-learn 中使用10个流行的聚类算法。这包括一个拟合模型的例子和可视化结果的例子。这些示例用于将粘贴复制到您自己的项目中,并将方法应用于您自己的数据。
1.库安装
首先,让我们安装库。不要跳过此步骤,因为你需要确保安装了最新版本。你可以使用 pip Python 安装程序安装 scikit-learn 存储库,如下所示:
接下来,让我们确认已经安装了库,并且您正在使用一个现代版本。运行以下脚本以输出库版本号。
运行该示例时,您应该看到以下版本号或更高版本。
2.聚类数据集
我们将使用 make _ classification ()函数创建一个测试二分类数据集。数据集将有1000个示例,每个类有两个输入要素和一个群集。这些群集在两个维度上是可见的,因此我们可以用散点图绘制数据,并通过指定的群集对图中的点进行颜色绘制。这将有助于了解,至少在测试问题上,群集的识别能力如何。该测试问题中的群集基于多变量高斯,并非所有聚类算法都能有效地识别这些类型的群集。因此,本教程中的结果不应用作比较一般方法的基础。下面列出了创建和汇总合成聚类数据集的示例。
运行该示例将创建合成的聚类数据集,然后创建输入数据的散点图,其中点由类标签(理想化的群集)着色。我们可以清楚地看到两个不同的数据组在两个维度,并希望一个自动的聚类算法可以检测这些分组。
已知聚类着色点的合成聚类数据集的散点图接下来,我们可以开始查看应用于此数据集的聚类算法的示例。我已经做了一些最小的尝试来调整每个方法到数据集。3.亲和力传播亲和力传播包括找到一组最能概括数据的范例。
它是通过 AffinityPropagation 类实现的,要调整的主要配置是将“ 阻尼 ”设置为0.5到1,甚至可能是“首选项”。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法取得良好的结果。
数据集的散点图,具有使用亲和力传播识别的聚类
4.聚合聚类
聚合聚类涉及合并示例,直到达到所需的群集数量为止。它是层次聚类方法的更广泛类的一部分,通过 AgglomerationClustering 类实现的,主要配置是“ n _ clusters ”集,这是对数据中的群集数量的估计,例如2。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组。
使用聚集聚类识别出具有聚类的数据集的散点图
5.BIRCHBIRCH
聚类( BIRCH 是平衡迭代减少的缩写,聚类使用层次结构)包括构造一个树状结构,从中提取聚类质心。
它是通过 Birch 类实现的,主要配置是“ threshold ”和“ n _ clusters ”超参数,后者提供了群集数量的估计。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个很好的分组。
使用BIRCH聚类确定具有聚类的数据集的散点图
6.DBSCANDBSCAN
聚类(其中 DBSCAN 是基于密度的空间聚类的噪声应用程序)涉及在域中寻找高密度区域,并将其周围的特征空间区域扩展为群集。
它是通过 DBSCAN 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,尽管需要更多的调整,但是找到了合理的分组。
使用DBSCAN集群识别出具有集群的数据集的散点图
7.K均值
K-均值聚类可以是最常见的聚类算法,并涉及向群集分配示例,以尽量减少每个群集内的方差。
它是通过 K-均值类实现的,要优化的主要配置是“ n _ clusters ”超参数设置为数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以找到一个合理的分组,尽管每个维度中的不等等方差使得该方法不太适合该数据集。
使用K均值聚类识别出具有聚类的数据集的散点图
8.Mini-Batch
K-均值Mini-Batch K-均值是 K-均值的修改版本,它使用小批量的样本而不是整个数据集对群集质心进行更新,这可以使大数据集的更新速度更快,并且可能对统计噪声更健壮。
它是通过 MiniBatchKMeans 类实现的,要优化的主配置是“ n _ clusters ”超参数,设置为数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,会找到与标准 K-均值算法相当的结果。
带有最小批次K均值聚类的聚类数据集的散点图
9.均值漂移聚类
均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。
它是通过 MeanShift 类实现的,主要配置是“带宽”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,可以在数据中找到一组合理的群集。
具有均值漂移聚类的聚类数据集散点图
10.OPTICSOPTICS
聚类( OPTICS 短于订购点数以标识聚类结构)是上述 DBSCAN 的修改版本。
它是通过 OPTICS 类实现的,主要配置是“ eps ”和“ min _ samples ”超参数。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我无法在此数据集上获得合理的结果。
使用OPTICS聚类确定具有聚类的数据集的散点图
11.光谱聚类
光谱聚类是一类通用的聚类方法,取自线性线性代数。
它是通过 Spectral 聚类类实现的,而主要的 Spectral 聚类是一个由聚类方法组成的通用类,取自线性线性代数。要优化的是“ n _ clusters ”超参数,用于指定数据中的估计群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,找到了合理的集群。
使用光谱聚类聚类识别出具有聚类的数据集的散点图
12.高斯混合模型
高斯混合模型总结了一个多变量概率密度函数,顾名思义就是混合了高斯概率分布。它是通过 Gaussian Mixture 类实现的,要优化的主要配置是“ n _ clusters ”超参数,用于指定数据中估计的群集数量。下面列出了完整的示例。
运行该示例符合训练数据集上的模型,并预测数据集中每个示例的群集。然后创建一个散点图,并由其指定的群集着色。在这种情况下,我们可以看到群集被完美地识别。这并不奇怪,因为数据集是作为 Gaussian 的混合生成的。
使用高斯混合聚类识别出具有聚类的数据集的散点图
在本文中,你发现了如何在 python 中安装和使用顶级聚类算法。具体来说,你学到了:
⑷ Python怎么检验数据分布
import matplotlib.pyplot as plt
import matplotlib.mlab as mlab
import numpy as np
import pydotplus
import csv
import scipy.stats as ss
game =[ ]#game是一个列表 ,你自己弄一个自己的数据列表即可
x = np.array(game)#x要处理成这个样子:
N=30
counts, bins = np.histogram(x, bins=N)
bin_width = bins[1]-bins[0]
total_count = float(sum(counts))
f, ax = plt.subplots(1, 1)
f.suptitle('query_uri')
ax.bar(bins[:-1]+bin_width/2., counts, align='center', width=.85*bin_width)
ax.grid('on')
def fit_pdf(x, name='lognorm', color='r'):
dist = getattr(ss, name) # params = shape, loc, scale
# dist = ss.gamma # 3 params
params = dist.fit(x, loc=0) # 1-day lag minimum for shipping
y = dist.pdf(bins, *params)*total_count*bin_width
sqerror_sum = np.log(sum(ci*(yi - ci)**2. for (ci, yi) in zip(counts, y)))
ax.plot(bins, y, color, lw=3, alpha=0.6, label='%s err=%3.2f' % (name, sqerror_sum))
return y
colors = ['r-', 'g-', 'r:', 'g:']
for name, color in zip(['exponweib', 't', 'gamma'], colors): # 'lognorm', 'erlang', 'chi2', 'weibull_min',
#分号后面的分布也可以打进去 线条颜色自己加
y = fit_pdf(x, name=name, color=color)
ax.legend(loc='best', frameon=False)
plt.savefig('G:\weibull216.png')
plt.show()
我之前也是考虑这个问题,这些代码能实现'exponweib', 't', 'gamma', 'lognorm', 'erlang', 'chi2', 'weibull_min',的拟合。只要自己输入game,game为一组数据即可。
⑸ python数据统计分析
1. 常用函数库
scipy包中的stats模块和statsmodels包是python常用的数据分析工具,scipy.stats以前有一个models子模块,后来被移除了。这个模块被重写并成为了现在独立的statsmodels包。
scipy的stats包含一些比较基本的工具,比如:t检验,正态性检验,卡方检验之类,statsmodels提供了更为系统的统计模型,包括线性模型,时序分析,还包含数据集,做图工具等等。
2. 小样本数据的正态性检验
(1) 用途
夏皮罗维尔克检验法 (Shapiro-Wilk) 用于检验参数提供的一组小样本数据线是否符合正态分布,统计量越大则表示数据越符合正态分布,但是在非正态分布的小样本数据中也经常会出现较大的W值。需要查表来估计其概率。由于原假设是其符合正态分布,所以当P值小于指定显着水平时表示其不符合正态分布。
正态性检验是数据分析的第一步,数据是否符合正态性决定了后续使用不同的分析和预测方法,当数据不符合正态性分布时,我们可以通过不同的转换方法把非正太态数据转换成正态分布后再使用相应的统计方法进行下一步操作。
(2) 示例
(3) 结果分析
返回结果 p-value=0.029035290703177452,比指定的显着水平(一般为5%)小,则拒绝假设:x不服从正态分布。
3. 检验样本是否服务某一分布
(1) 用途
科尔莫戈罗夫检验(Kolmogorov-Smirnov test),检验样本数据是否服从某一分布,仅适用于连续分布的检验。下例中用它检验正态分布。
(2) 示例
(3) 结果分析
生成300个服从N(0,1)标准正态分布的随机数,在使用k-s检验该数据是否服从正态分布,提出假设:x从正态分布。最终返回的结果,p-value=0.9260909172362317,比指定的显着水平(一般为5%)大,则我们不能拒绝假设:x服从正态分布。这并不是说x服从正态分布一定是正确的,而是说没有充分的证据证明x不服从正态分布。因此我们的假设被接受,认为x服从正态分布。如果p-value小于我们指定的显着性水平,则我们可以肯定地拒绝提出的假设,认为x肯定不服从正态分布,这个拒绝是绝对正确的。
4.方差齐性检验
(1) 用途
方差反映了一组数据与其平均值的偏离程度,方差齐性检验用以检验两组或多组数据与其平均值偏离程度是否存在差异,也是很多检验和算法的先决条件。
(2) 示例
(3) 结果分析
返回结果 p-value=0.19337536323599344, 比指定的显着水平(假设为5%)大,认为两组数据具有方差齐性。
5. 图形描述相关性
(1) 用途
最常用的两变量相关性分析,是用作图描述相关性,图的横轴是一个变量,纵轴是另一变量,画散点图,从图中可以直观地看到相关性的方向和强弱,线性正相关一般形成由左下到右上的图形;负面相关则是从左上到右下的图形,还有一些非线性相关也能从图中观察到。
(2) 示例
(3) 结果分析
从图中可以看到明显的正相关趋势。
6. 正态资料的相关分析
(1) 用途
皮尔森相关系数(Pearson correlation coefficient)是反应两变量之间线性相关程度的统计量,用它来分析正态分布的两个连续型变量之间的相关性。常用于分析自变量之间,以及自变量和因变量之间的相关性。
(2) 示例
(3) 结果分析
返回结果的第一个值为相关系数表示线性相关程度,其取值范围在[-1,1],绝对值越接近1,说明两个变量的相关性越强,绝对值越接近0说明两个变量的相关性越差。当两个变量完全不相关时相关系数为0。第二个值为p-value,统计学上,一般当p-value<0.05时,可以认为两变量存在相关性。
7. 非正态资料的相关分析
(1) 用途
斯皮尔曼等级相关系数(Spearman’s correlation coefficient for ranked data ),它主要用于评价顺序变量间的线性相关关系,在计算过程中,只考虑变量值的顺序(rank, 值或称等级),而不考虑变量值的大小。常用于计算类型变量的相关性。
(2) 示例
(3) 结果分析
返回结果的第一个值为相关系数表示线性相关程度,本例中correlation趋近于1表示正相关。第二个值为p-value,p-value越小,表示相关程度越显着。
8. 单样本T检验
(1) 用途
单样本T检验,用于检验数据是否来自一致均值的总体,T检验主要是以均值为核心的检验。注意以下几种T检验都是双侧T检验。
(2) 示例
(3) 结果分析
本例中生成了2列100行的数组,ttest_1samp的第二个参数是分别对两列估计的均值,p-value返回结果,第一列1.47820719e-06比指定的显着水平(一般为5%)小,认为差异显着,拒绝假设;第二列2.83088106e-01大于指定显着水平,不能拒绝假设:服从正态分布。
9. 两独立样本T检验
(1) 用途
由于比较两组数据是否来自于同一正态分布的总体。注意:如果要比较的两组数据不满足方差齐性, 需要在ttest_ind()函数中添加参数equal_var = False。
(2) 示例
(3) 结果分析
返回结果的第一个值为统计量,第二个值为p-value,pvalue=0.19313343989106416,比指定的显着水平(一般为5%)大,不能拒绝假设,两组数据来自于同一总结,两组数据之间无差异。
10. 配对样本T检验
(1) 用途
配对样本T检验可视为单样本T检验的扩展,检验的对象由一群来自正态分布独立样本更改为二群配对样本观测值之差。它常用于比较同一受试对象处理的前后差异,或者按照某一条件进行两两配对分别给与不同处理的受试对象之间是否存在差异。
(2) 示例
(3) 结果分析
返回结果的第一个值为统计量,第二个值为p-value,pvalue=0.80964043445811551,比指定的显着水平(一般为5%)大,不能拒绝假设。
11. 单因素方差分析
(1) 用途
方差分析(Analysis of Variance,简称ANOVA),又称F检验,用于两个及两个以上样本均数差别的显着性检验。方差分析主要是考虑各组之间的平均数差别。
单因素方差分析(One-wayAnova),是检验由单一因素影响的多组样本某因变量的均值是否有显着差异。
当因变量Y是数值型,自变量X是分类值,通常的做法是按X的类别把实例成分几组,分析Y值在X的不同分组中是否存在差异。
(2) 示例
(3) 结果分析
返回结果的第一个值为统计量,它由组间差异除以组间差异得到,上例中组间差异很大,第二个返回值p-value=6.2231520821576832e-19小于边界值(一般为0.05),拒绝原假设, 即认为以上三组数据存在统计学差异,并不能判断是哪两组之间存在差异 。只有两组数据时,效果同 stats.levene 一样。
12. 多因素方差分析
(1) 用途
当有两个或者两个以上自变量对因变量产生影响时,可以用多因素方差分析的方法来进行分析。它不仅要考虑每个因素的主效应,还要考虑因素之间的交互效应。
(2) 示例
(3) 结果分析
上述程序定义了公式,公式中,"~"用于隔离因变量和自变量,”+“用于分隔各个自变量, ":"表示两个自变量交互影响。从返回结果的P值可以看出,X1和X2的值组间差异不大,而组合后的T:G的组间有明显差异。
13. 卡方检验
(1) 用途
上面介绍的T检验是参数检验,卡方检验是一种非参数检验方法。相对来说,非参数检验对数据分布的要求比较宽松,并且也不要求太大数据量。卡方检验是一种对计数资料的假设检验方法,主要是比较理论频数和实际频数的吻合程度。常用于特征选择,比如,检验男人和女人在是否患有高血压上有无区别,如果有区别,则说明性别与是否患有高血压有关,在后续分析时就需要把性别这个分类变量放入模型训练。
基本数据有R行C列, 故通称RC列联表(contingency table), 简称RC表,它是观测数据按两个或更多属性(定性变量)分类时所列出的频数表。
(2) 示例
(3) 结果分析
卡方检验函数的参数是列联表中的频数,返回结果第一个值为统计量值,第二个结果为p-value值,p-value=0.54543425102570975,比指定的显着水平(一般5%)大,不能拒绝原假设,即相关性不显着。第三个结果是自由度,第四个结果的数组是列联表的期望值分布。
14. 单变量统计分析
(1) 用途
单变量统计描述是数据分析中最简单的形式,其中被分析的数据只包含一个变量,不处理原因或关系。单变量分析的主要目的是通过对数据的统计描述了解当前数据的基本情况,并找出数据的分布模型。
单变量数据统计描述从集中趋势上看,指标有:均值,中位数,分位数,众数;从离散程度上看,指标有:极差、四分位数、方差、标准差、协方差、变异系数,从分布上看,有偏度,峰度等。需要考虑的还有极大值,极小值(数值型变量)和频数,构成比(分类或等级变量)。
此外,还可以用统计图直观展示数据分布特征,如:柱状图、正方图、箱式图、频率多边形和饼状图。
15. 多元线性回归
(1) 用途
多元线性回归模型(multivariable linear regression model ),因变量Y(计量资料)往往受到多个变量X的影响,多元线性回归模型用于计算各个自变量对因变量的影响程度,可以认为是对多维空间中的点做线性拟合。
(2) 示例
(3) 结果分析
直接通过返回结果中各变量的P值与0.05比较,来判定对应的解释变量的显着性,P<0.05则认为自变量具有统计学意义,从上例中可以看到收入INCOME最有显着性。
16. 逻辑回归
(1) 用途
当因变量Y为2分类变量(或多分类变量时)可以用相应的logistic回归分析各个自变量对因变量的影响程度。
(2) 示例
(3) 结果分析
直接通过返回结果中各变量的P值与0.05比较,来判定对应的解释变量的显着性,P<0.05则认为自变量具有统计学意义。
⑹ 用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