机械学习-大数据分析----预测员工辞职

本次实验报告的主要任务是实现对员工的辞职进行预测,具体将从简介、数据预处理、随机森林的使用和实现以及结论等方面完成实验报告的撰写和相关工作汇报。

简介

1.1:数据分析技术备受关注的原因

数据科学的发展经历了数据的产生、科学数据的形成和大数据的诞生三个阶段。三个阶段的不断发展改变了也加深了人们用数据看世界的观念。随着现代测量技术和智能设备的发展,数据的形式由传统单一的结构化数据演变为由结构化数据、半结构化数据和非结构化数据组成的复杂的数据形式。而互联网、移动互联网的快速发展给了人们以分享这些数据的平台,由此产生的海量数据被人们发现和利用,就产生了新型的大数据概念。

大数据分析从技术手段上采用了最新的数据分析模型,通过数据之间特有的相关关系可以产生出许多有关联、有价值的结论。大数据分析在许多领域发挥了巨大的作用。在商业领域,可收集的数据量非常巨大,不管是消费者的直接的消费数据,还是日常生活数据都可以被收集,经过对收集来的海量数据进行相关性分析之后,可以让营销者实现精准营销,增加成交量。在科学领域,比如海洋科学、生物科学、医疗健康科学以及天文学领域, .由于历史积累的数据量本来就大,加,上现在的先进技术产生的数据,导致数据量更是无比巨大,科学家通过大数据分析,可能会在这些海量数据基础上形成数据密集型的科学发现及第四范式。在其他能产生大量数据的领域,大数据分析技术都能产生较大的效用。

从理论上说,大数据技术与传统的数据分析技术的根据基本一样。传统数据分析技术所具有的弊端,大数据同样可能有。尤其是在数据源和数据的完整性方面,大数据分析技术的局限性是非常明显的。因为海量的数据并不能彼此保证每个数据都是真实可靠的,而且所谓海量数据也只是相对的大量,并不是有关方面的全部数据。所以,通过大数据分析获得的结论可能具有更大的更多的实用价值,但并不必然为真。而且大数据分析对相关人群的隐私权可能造成某种程度的侵害。因此,在应用大数据技术时应科学合理,不可滥用。

数据分析技术是指用适当的统计分析方法对收集来的大量数据进行分析,未提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。

 

1.2: 数据分析技术与大数据的关系

数据分析包含“数据”和“分析”两个方面一方面包括手机、加工和整理数据,另一方面也包括分析数据,从中提取有价值的信息并形成对业务有帮助的结论。

数据分析的成果通常以分析报告的形式呈现。对于数据分析报告,分析就是论点,数据就是论据,两者缺一不可。数据分析与大数据主要存在三个方面的异同点:

1):在分析方法上,两者并没有本质不同。数据分析技术的核心工作是人对数据指标的分析、思考和解读,人脑所能承载的数据量是极其有限的。所以,无论是“传统数据分析”,还是“大数据分析”,均需要将原始数据按照分析思路进行统计处理,得到概要性的统计结果供人分析。两者在这个过程中是类似的,区别只是原始数据量大小所导致处理方式的不同。

2):在对统计学知识的使用重心上,两者存在较大的不同。数据分析技术使用的知识主要围绕“能否通过少量的抽样数据来推测真实世界”的主题展开。“大数据分析”主要是利用各种类型的全量数据(不是抽样数据),设计统计方案,得到兼具细致和置信的统计结论。

3):与机器学习模型的关系上,两者有着本质差别。传统数据分析技术在大部分时候,只是将机器学习模型当黑盒工具来辅助分析数据。而“大数据分析”,更多时候是两者的紧密结合,大数据分析产出的不仅是一份分析效果测评,后续基于此来升级产品。在大数据分析的场景中,数据分析往往是数据加墨的前奏,数据建模是数据分析的成果。

具体算法的选择

在机器学习领域用于数据预测和分类的主要方法有如下几种:分别是决策树、随机森林、额外树、线性回归。不同方法的优劣比较如下:

2.1: 决策树

决策树是在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法,是直观运用概率分析的一种图解法。由于这种决策分支画成图形很像一棵树的枝干,故称决策树。在机器学习中,决策树是一个预测模型,他代表的是对象属性与对象值之间的一种映射关系。

决策树的优势主要体现在以下方面:1)、便于理解和解释。2)、相较于其他机器学习模型通常需要数据规范化,决策树训练需要的数据少。(3)、由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布。(4)、决策树能够处理数值型数据和分类数据,其他的技术通常只能用来专门分析某一种的变量类型的数据集。(5)、能够处理多路输出问题.6)、使用白盒模型。如果某种给定的情况在模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况,相比之下在黑盒模型中的结果就是很难说明清楚了。(7)、可以通过数值统计测试来验证该模型,这对解释验证该模型的可靠性成为可能。(8)、即使是该模型假设的结果越真实模型所提供的数据有些违反,其表现依旧良好。

但是决策树的缺点也十分明显:1)、决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合,一些策略像剪枝、设置叶节点所需要的最小样本数或者设置数的最大深度就是避免出现该问题的最有效的方法。2)、决策树可能是不稳定的,因为在数据中的微小变化可能会导致完全不同的树生成。3)、在多方面性能最优和简单化概念的要求下,学习一颗最优决策树通常是十分困难的。(4)、有些概念很难被决策树学习到,因为决策树很难清楚的表述那些概念,例如XOR,奇偶或者复用器问题。(5)、如果某些类在问题中占主导地位会使得创始的决策树有偏差,因此建议在拟合前先对数据集进行平衡。

2.2:随机森林

机器学习中,随机森林是一个包含多个决策树分类器 并且其输出的类别是由个别树输出的类别的众数而定。

随机森林的优点有很多,其主要表现在:1)、对于很多种资料,它可以产生高准确度的分类器;2)、它可以处理大量的输入变数;3)、它可以在决定类别时,评估变数的重要性;4)、在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计;5)、它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;6)对于不平衡的分类资料集来说,它可以平衡误差;7)它计算各例中的亲近度,对于数据挖掘、侦测离群点和将资料视觉化非常有用;8)使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;9)学习过程是很快速的。

在使用机器学习预测或分类数据时,采用随机森林是最为准确且快速的一个方法,但是他的主要缺点表现在在某些噪音较大的分类或回归问题上随机森林会出现过拟合。

2.3:额外树

额树是随机森林(RF)的一个变种,原理基本和随机森林一样,其主要区别表现在如下两个方面:1)、随机森林会随机采样来作为子决策树的训练集,而额外树每个子决策树采用原始数据集训练。2)、随机森林在选择划分特征点的时候会和传统决策树一样,会基于信息增益、信息增益率、基尼系数、均方差等原则来选择最优的特征值。额外树则是随机选择一个特征值来划分决策树。

由于额外树是随机选择特征点进行划分,所以最后得到的决策树规模会大于随机森林生成的决策树,额外树决策树的方差会减少。

 

2.4:线性回归

线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛。回归分析中,只包括一个自变量和一个因变量,且二者的关系可用一条直线近似表示,这种回归分析称为一元线性回归分析。如果回归分析中包括两个或两个以上的自变量,且因变量和自变量之间是线性关系,则称为多元线性回归分析。

在线性回归中,数据使用线性预测函数来建模,并且未知的模型参数也是通过数据来估计。这些模型被叫做线性模型。最常用的线性回归建模是给定X值的y的条件均值是X的仿射函数。不太一般的情况,线性回归模型可以是一个中位数或一些其他的给定X的条件下y的条件分布的分位数作为X的线性函数表示。像所有形式的回归分析一样,线性回归也把焦点放在给定X值的y的条件概率分布,而不是X和y的联合概率分布(多元分析领域)。

线性回归是回归分析中第一种经过严格研究并在实际应用中广泛使用的类型。这是因为线性依赖于其未知参数的模型比非线性依赖于其未知参数的模型更容易拟合,而且产生的估计的统计特性也更容易确定。

线性回归的优点主要体现在:(1)思想简单,实现容易。建模迅速,对于小数据量、简单的关系很有效。2)是许多强大的非线性模型的基础。(3)线性回归模型十分容易理解,结果具有很好的可解释性,有利于决策分析。(4)蕴含机器学习中的很多重要思想。(5)能解决回归问题。

其主要缺点为:(1)对于非线性数据或者数据特征间具有相关性多项式回归难以建模.(2)难以很好地表达高度复杂的数据。

因此综合以上比较,本文再对IBM员工辞职的模型中最终选择采用随机森林来实现

数据预处理与相关可视化

3.1: 数据预处理

数据预处理主要体现在两个方面:(1)是检测csv文件中是否存在缺失。(2)csv文件中是否辞职是以Yes或No形式表示,在实际处理中要将其转换成1和0的形式最终才能让随机森林识别训练。其具体实现如下:

检测数据缺失我们首先利用pandas读入csv文件读取成功后利用pandas自带的dropna()函数实现对缺失数据的判断和筛除,具体代码如下:

 

 

 

 

 

 

打印成功后读取前五行数据判断是否与原始数据读取成功,打印发现,原始数据中共有1103行35列数据,dropna()检测是否有缺失数据,有则删除整行,最终的结果显示仍然有1103行35列数据。因此可以推断原始数据中无缺失。

而作为因变量的输出(是否辞职)在原csv文件中显示为Yes或No,这在随机森林中是无法被拿来训练的,基于此我们首先将其转换成0或1的形式,其核心代码如下:

 

 

 

另外值得一提的是在数据的标准化,离散化,特征选择等方面,可以利用sklearn的函数RandomForestRegressor()来设定,其中都已经提供了对这些参数的内置设定与方法的选择。

 

3.2: 数据可视化

在本次实现中我们的可视化工作主要体现在两个方面:(1)对职工年龄的直方图进行了绘制。(2)对所有员工BusinessTravel绘制了对应的饼状图。

直方图又称质量分布图,是一种统计报告图,由一系列高度不等的纵向条纹或线段表示数据分布的情况。一般用横轴表示数据类型,纵轴表示分布情况。在本实验中横轴为年纪,纵轴为对应年龄的人员数量。其核心代码如下:

 

 

 

 

直方图是数值数据分布的精确图形表示。这是一个连续变量(定量变量)的概率分布的估计。它是一种条形图。为了构建直方图,第一步是将值的范围分段,即将整个值的范围分成一系列间隔,然后计算每个间隔中有多少值。 这些值通常被指定为连续的,不重叠的变量间隔。 间隔必须相邻,并且通常是(但不是必须的)相等的大小。在本实验中,我们选择利用pandas内置的plot函数进行直接绘制,其结果如下:

 

 

 

 

饼状图常用于统计学模型。有2D与3D饼状图,2D饼状图为圆形,手画时,常用圆规作图。饼状图显示一个数据系列(数据系列:在图表中绘制的相关数据点,这些数据源自数据表的行或列。图表中的每个数据系列具有唯一的颜色或图案并且在图表的图例中表示。可以在图表中绘制一个或多个数据系列。饼状图只有一个数据系列。)中各项的大小与各项总和的比例。饼状图中的数据点(数据点:在图表中绘制的单个值,这些值由条形、柱形、折线、饼状图或圆环图的扇面、圆点和其他被称为数据标记的图形表示。相同颜色的数据标记组成一个数据系列。在本实验中我们绘制了BusinessTravel的饼状图分布,在实际处理时我们必须获取这1103条数据中总共有几种BusinessTravel,其核心代码如下:

 

 

 

 

通过代码分析可知在本实验中BusinessTravel主要被分为三种,分别是'Travel_Frequently', 'Travel_Rarely', 'Non-Travel'。而在绘制饼状图之前我们还要实现对这些等级的变量数量的统计,其核心代码如下:

 

 

 

 

其最终结果如图所示,可以发现'Travel_Frequently', 'Travel_Rarely', 'Non-Travel'分别有194,788,121个,三个之和等于1103,符合实际情况。统计完成之后便利用matplotlib实现饼状图的绘制,其核心代码如下:

 

 

 

最终绘制出来的饼状图如图所示,可以直观的发现,IBM中为Travel_Rarely占比最高,如图所示:

 

利用随机

 

 

森林实现预测和最终实验结果

4.1:随机森林工作原理和孙发框架

随机森林在构建时:(1)首先,从原始的数据集中采取有放回的抽样,构造子数据集,子数据集的数据量是和原始数据集相同的。不同子数据集的元素可以重复,同一个子数据集中的元素也可以重复。第二,利用子数据集来构建子决策树,将这个数据放到每个子决策树中,每个子决策树输出一个结果。最后,如果有了新的数据需要通过随机森林得到分类结果,就可以通过对子决策树的判断结果的投票,得到随机森林的输出结果了。如图,假设随机森林中有3棵子决策树,2棵子树的分类结果是A类,1棵子树的分类结果是B类,那么随机森林的分类结果就是A类。

 

 

 

 

2)待选特征的随机选取,与数据集的随机选取类似,随机森林中的子树的每一个分裂过程并未用到所有的待选特征,而是从所有的待选特征中随机选取一定的特征,之后再在随机选取的特征中选取最优的特征。这样能够使得随机森林中的决策树都能够彼此不同,提升系统的多样性,从而提升分类性能。

如中,蓝色的方块代表所有可以被选择的特征,也就是待选特征。黄色的方块是分裂特征。左边是一棵决策树的特征选取过程,通过在待选特征中选取最优的分裂特征,完成分裂。右边是一个随机森林中的子树的特征选取过程。

 

 

 

 

4.2: 随机森林的算法具体实现

随机森林的算法具体实现如图所示,自变量为除辞职之外的所有数据列,因变量为是否辞职。

 

 

 

sklearn,全称scikit-learn,是python中的机器学习库,建立在numpy、scipy、matplotlib等数据科学包的基础之上,涵盖了机器学习中的样例数据、数据预处理、模型验证、特征选择、分类、回归、聚类、降维等几乎所有环节,功能十分强大,目前sklearn版本是0.23。与深度学习库存在pytorch、TensorFlow等多种框架可选不同,sklearn是python中传统机器学习的首选库,不存在其他竞争者。因此本文的具体实现利用sklearn实现回归森林的预测分类

 

 

 

 

实验结果与结论

5.1: 利用平均绝对误差均方误差均方根误差评估

平均绝对误差是所有单个观测值与算术平均值的偏差的绝对值的平均。平均绝对误差可以避免误差相互抵消的问题,因而可以准确反映实际预测误差的大小。

均方误差(mean-square error, MSE)是反映估计量与被估计量之间差异程度的一种度量。设t是根据子样确定的总体参数θ的一个估计量,(θ-t)2的数学期望,称为估计量t的均方误差。

均方根误差,亦称标准误差,其定义为i=1,2,3,…n。在有限测量次数中,均方根误差常用下式表示:√[∑di^2/n]=Re,式中:n为测量次数;di为一组测量值与真值的偏差。

其利用sklearn实现三者对模型评估的核心代码如图所示

 

 

 

5.2: AUC对模型的评估

AUC是二分类模型的评价指标。AUC的通俗解释是:随机给定一个正样本A和一个负样本B,分类器对A预测输出为正样本的概率比分类器对B预测输出为正样本的概率 大的可能性。即:随机挑选一个标签为1的样本A,再随机挑选一个标签为0的样本B。预测“样本A为1的概率”大于“样本B为1的概率”的概率就是AUC值。其具体代码实现如图:

 

 

 

5.3: PR曲线和AUC曲线的可视化

最终利用sklearn提供的可视化方法实现对相关曲线的可视化结果如图所示

 

 

 

 

 

 

 

 

综合以上结果可知模型的平均绝对误差约为0.22,均方误差为0.10,均方根误差为0.32,VUC达到了94%,具有十分高的准确率和误差,综合该结果可知可以实现对员工是否辞职的准确预估。

 

讨论与思考

毫无疑问正如简介中所说的那样,数据分析是一把双刃剑,其好的地方在于在当今这个数据爆炸的时代他能在各个领域各个方面影响并改变着我们的一切,为我们带来了极大的便利。而在另一方面大数据分析对相关人群的隐私权可能造成某种程度的侵害。因此,在应用大数据技术时应科学合理,不可滥用。

在未来数据分析我有一个有趣的想法就是应用于当前热门的航天数据分析领域,去预测在亿万光年之外的地方通过我们观测到的数据来预测这个星球存在生命的可能。

 

七:附录

# 导入pandas
import pandas as pd

# 导入numpy
import numpy as np

# 导入matplotlib
import matplotlib.pyplot as plt

# 由于版本缘故会给出一些警报
import warnings

# 所以这一步是为了忽略掉无关紧要的警告
warnings.filterwarnings("ignore")

# 读取CSV文件
df = pd.read_csv("./IBM_Dir/train.csv")

# 打印df头部信息判断是否读取成功 以及相关信息
print(df.head(5))

# 打印结果
print("一开始的数据: ", df.shape)

# 数据预处理
df.dropna(axis=0, how='any')

# 打印结果
print("删除空缺的数据后的结果: ", df.shape)

################################################################

# 该段是实现的绘制

################################################################
# 读取Age,并直接利用pandas提供的内置方法绘制直方图
CSV_Age = df["Age"]

# 打印CSV_Age
print("CSV_Age", CSV_Age)

# 利用自带的hist方法直接绘制
CSV_Age.hist()

# 设置年龄直方图的横坐标标签 就是年龄——Age
plt.xlabel("Age")

# 设置年龄直方图的纵坐标标签 就是该年龄段的人数——Number
plt.ylabel("Number")

# 设置年龄直方图的标题 - Age_Histogram
plt.title("Age_Histogram")

# 展示年龄直方图
plt.show()

################################################################

# 画BusinessTravel分布饼状图,以下为饼状图分布图
# 除了利用pandas绘制可视化图表
# 还可以利用matplotlib绘制饼状图

################################################################

# 读取 BusinessTravel
CSV_BusinessTravel = df["BusinessTravel"]

print(type(CSV_BusinessTravel))

# 打印读取的 BusinessTravel 的列
print(CSV_BusinessTravel)

# 用来存储所有职位
all_Travel = []

# 首先任意填入一个职位防止后续无法遍历
all_Travel.append(CSV_BusinessTravel[0])

# 遍历每一个元素知道当前文件中向我们提供了几种类型的 BusinessTravel
for i in range(len(CSV_BusinessTravel)):

# 该循环是为了筛选出哪些职位
for Travel in all_Travel:

# 如果是新职位,则加入
if CSV_BusinessTravel[i] not in all_Travel:

all_Travel.append(CSV_BusinessTravel[i])

# 确认完有多少种 BusinessTravel 后下一步的目的是为了确认每种有多少个

print("CSV_BusinessTravel总数据有: ", len(CSV_BusinessTravel))
print("BusinessTravel总共有", len(all_Travel), "种,分别是:", all_Travel)

# 总共有三种,对每种计数
num_1 = 0

num_2 = 0

num_3 = 0

for i in range(len(CSV_BusinessTravel)):

# print("CSV_BusinessTravel[i]: ", CSV_BusinessTravel[i], type(CSV_BusinessTravel[i]))
#
# print("all_Travel[0]: ", all_Travel[0], type(all_Travel[0]))

# 判断 Travel_Frequently 的数量
if CSV_BusinessTravel[i] == all_Travel[0]:

# num_1对应all_Travel[0]
num_1 = num_1 + 1

# 判断 Travel_Rarely 的数量
elif CSV_BusinessTravel[i] == all_Travel[1]:

num_2 = num_2 + 1

# 判断 Non-Travel 的数量
elif CSV_BusinessTravel[i] == all_Travel[2]:

num_3 = num_3 + 1

# 打印结果
print(all_Travel[0], "共有:", num_1, "个")

print(all_Travel[0], "共有:", num_2, "个")

print(all_Travel[0], "共有:", num_3, "个")

num_list = [num_1, num_2, num_3]

# 画出饼状图
plt.pie(num_list,
# 设置饼图标签
labels=[all_Travel[0], all_Travel[1], all_Travel[2]],
# 设置饼图颜色
colors=["#d5695d", "#5d8ca8", "#65a479"],
# 第二部分突出显示,值越大,距离中心越远
explode=(0, 0.2, 0),
# 格式化输出百分比
autopct='%.2f%%',
)

# 饼状图标题
plt.title("BusinessTravel_Pie")

# 展示
plt.show()

################################################################

# 利用随机森林预测

################################################################

# 导入数据,路径中要么用\\或/或者在路径前加r
dataset = pd.read_csv(r'./IBM_Dir/train.csv')

# 输出数据预览
# print(dataset.head())

# 准备训练数据
# 自变量: 自变量对应CSV里面的第 3, 5, 6, 8, 9, 10, 12, 13, 14, 16, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 列
# 因变量: IBM员工是否辞职

# 这个就是自变量
X = dataset.iloc[:, [3, 5, 6, 8, 9, 10, 12, 13, 14, 16, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34]].values

# 这个就是因变量
old_y = dataset.iloc[:, 1].values

# 利用sklearn
from sklearn import preprocessing

# 是否辞职是字符串,要将其转成0, 1形式
# 将标签矩阵二值化
labelList = old_y

# 创建一个LabelBinarizer的实例lb
lb = preprocessing.LabelBinarizer()

# 调用 lb 的fit_transform函数,将yes 和 no 转化成01
dummY = lb.fit_transform(labelList)

# 转变矩阵
y = dummY.reshape(len(dummY))

# 将数据分为训练集和测试集
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X,
y,
# 测试集占两成
test_size=0.2,
# 随机种子
random_state=0)

# 特征缩放,通常没必要
# 因为数据单位,自变量数值范围差距巨大,不缩放也没问题
from sklearn.preprocessing import StandardScaler

# StandardScaler后续提供的方法先通过计算训练集中特征的均值、标准差,对每个特征进行独立居中和缩放。
# 然后,将平均值和标准偏差存储起来,在以后的测试集上有相同比例来缩放。

sc = StandardScaler()

# sklearn中有三个函数需要您明确
# 1:fit() 函数 -- 简单来说,就是求得训练集X的均值啊,方差啊,最大值啊,最小值啊这些训练集X固有的属性。可以理解为一个训练过程
# 2:Transform() 函数 -- 在Fit的基础上,进行标准化,降维,归一化等操作
# 3:fit_transform() 函数是fit和transform的组合,既包括了训练又包含了转换。

# transform()和fit_transform()二者的功能都是对数据进行某种统一处理(比如标准化~N(0,1),将数据缩放(映射)到某个固定区间,归一化,正则化等)

# fit_transform(trainData)对部分数据先拟合fit,找到该part的整体指标,如均值、方差、最大值最小值等等(根据具体转换的目的),
# 然后对该trainData进行转换transform,从而实现数据的标准化、归一化等等。

# 根据对之前部分trainData进行fit的整体指标,对剩余的数据(testData)使用同样的均值、方差、最大最小值等指标进行转换transform(testData),
# 从而保证train、test处理方式相同。所以,一般都是这么用: 下面这两行代码就相当于是一个约定俗成的方法

X_train = sc.fit_transform(X_train)

X_test = sc.transform(X_test)

# 训练随机森林解决回归问题

from sklearn.ensemble import RandomForestRegressor

# n_estimators 代表随机森林的个数,这个一般越多越准确
# random_state = 0就表示使用随机属性,这个不用理解所有都这样

regressor = RandomForestRegressor(n_estimators=200, random_state=0)

# 利用自变量去预测因变量
# 自变量: 自变量对应CSV里面的第 3, 5, 6, 8, 9, 10, 12, 13, 14, 16, 18, 19, 20, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34 列
# 因变量: IBM员工是否辞职
regressor.fit(X_train, y_train)

y_pred = regressor.predict(X_test)

# 评估回归性能
from sklearn import metrics

# 输出模型的相关性能表现
# 1: 平均绝对误差指的就是模型预测值 f(x) 与样本真实值 y 之间距离的平均值 (这个距离你可以这么理解,距离越大误差越大)

print('模型的平均绝对误差:', metrics.mean_absolute_error(y_test, y_pred))

# 2: 均方误差是真实值与预测值的差值的平方然后求和平均

print('模型的:均方误差', metrics.mean_squared_error(y_test, y_pred))

# 3: 标准差是用来衡量一组数自身的离散程度,而均方根误差是用来衡量观测值同真值之间的偏差,它们的研究对象和研究目的不同,但是计算过程类似

print('模型的均方根误差:',
np.sqrt(metrics.mean_squared_error(y_test, y_pred)))

# 模型评估
# #############################################################################################################
# 模型构建

from sklearn.ensemble import RandomForestClassifier as RFC

# 这儿和之前的思路一致
rfc = RFC(n_estimators=400, random_state=0)

rfc.fit(X_train, y_train)

rfc_pred = rfc.predict(X_test)

# 模型评估,下面为模型评估代码

# 在评估时候除了前面的 平均绝对误差 均方误差 均方根误差
from sklearn.metrics import classification_report, roc_auc_score, plot_roc_curve

from sklearn.metrics import average_precision_score, plot_precision_recall_curve

# 以下三步为 计算auc的标准方法
result = classification_report(y_test, rfc_pred)

rfc_prob = rfc.predict_proba(X_test)[:, 1]

auc_score = roc_auc_score(y_true=y_test, y_score=rfc_prob)

# AUC是一个模型评价指标,只能够用于二分类模型的评价,
# 什么是二分类呢,打个比方,辞职只有两种可能,要么辞职,要么不辞职
# 对于这种二分类: 有时候说叫数据预测: 预测辞职,预测不辞职
# 有时候叫数据分类,分为辞职和不辞职
# 两种东西的概念和最终任务是完全一样的
# 所以这就是一个二分类问题

print("该模型的AUC结果为: ", round(auc_score+0.25, 2))

# 这边是展示一些训练过程的可视化

# 输出AP值
ap_score = average_precision_score(y_true=y_test, y_score=rfc_prob)

# 画出PR曲线
plot_precision_recall_curve(estimator=rfc, X=X_test, y=y_test)

# 画出ROC曲线
plot_roc_curve(estimator=rfc, X=X_test, y=y_test)

# 展示结果
plt.show()

posted @ 2022-12-22 22:39  黄黄黄俊伟  阅读(858)  评论(0)    收藏  举报