♂️ 个人主页:@艾派森的个人主页
✍作者简介:Python学习者
希望大家多多支持,我们一起进步!
如果文章对你有帮助的话,
欢迎评论 点赞 收藏 加关注+
喜欢大数据分析项目的小伙伴,希望可以多多支持该系列的其他文章
大数据分析案例-基于随机森林算法预测人类预期寿命 |
大数据分析案例-基于随机森林算法的商品评价情感分析 |
大数据分析案例-用RFM模型对客户价值分析(聚类) |
大数据分析案例-对电信客户流失分析预警预测 |
大数据分析案例-基于随机森林模型对北京房价进行预测 |
大数据分析案例-基于RFM模型对电商客户价值分析 |
大数据分析案例-基于逻辑回归算法构建垃圾邮件分类器模型 |
大数据分析案例-基于决策树算法构建员工离职预测模型 |
大数据分析案例-基于KNN算法对茅台股票进行预测 |
大数据分析案例-基于多元线性回归算法构建广告投放收益模型 |
大数据分析案例-基于随机森林算法构建返乡人群预测模型 |
大数据分析案例-基于决策树算法构建金融反欺诈分类模型 |
目录
1.项目背景
2.项目简介
2.1项目说明
2.2数据说明
2.3技术工具
3.算法原理
4.项目实施步骤
4.1理解数据
4.2数据预处理
4.3探索性数据分析
4.3.1相关性分析
4.3.2性别对满意度的影响
4.3.3年龄对满意度的影响
4.3.4旅行类型对满意度的影响
4.3.5座椅等级对满意度的影响
4.3.6客户类型对满意度的影响
4.3.7飞行距离对满意度的影响
4.3.8航班延迟对满意度的影响
4.3.9其他分析
4.4特征工程
4.5模型构建
4.6模型评估
4.7特征重要性评分
4.8模型预测
5.实验总结
源代码
随着旅游业的蓬勃发展,航空公司的竞争也日益激烈。为了提高竞争力,航空公司需要不断提高服务质量和客户满意度。因此,预测客户满意度成为航空公司一个重要的研究方向。
传统的满意度预测方法主要基于历史数据,如客户反馈、问卷调查等。这些方法的主要缺点是缺乏实时性和主动性。随着机器学习技术的发展,基于机器学习的满意度预测方法逐渐得到广泛应用。其中,基于梯度提升决策树 (LightGBM) 的算法是一种比较有效的机器学习算法。
LightGBM 是一种基于梯度提升决策树的机器学习算法,它结合了 GBDT 和 LightGBM 的优点,具有较高的训练速度和泛化能力。在航空领域,LightGBM 算法可以用于预测客户满意度,帮助航空公司更好地了解客户需求和行为,提高服务质量和客户满意度。
因此,本实验旨在基于 LightGBM 算法构建一个航空公司满意度预测模型,并通过实际数据进行验证,以帮助航空公司更好地预测客户满意度,提高竞争力和服务质量。
本项目旨在通过分析航空公司的满意度调查数据,找出影响客户满意度的因素,最后使用机器学习算法构造航空公司满意度预测模型,及时帮助航空公司解决客户的不满意,打造一个良好的口碑。
本数据来源于Kaggle,原始数据共有103904条,共23个特征,具体各变量含义如下:
Gender:乘客性别(女、男)
Customer Type:客户类型(Loyal customer, disloyal customer)
Age:乘客的实际年龄
Type of Travel:乘客的飞行目的(个人旅行、商务旅行)
Class:乘客飞机的旅行等级(商务舱、经济舱、经济舱)
Flight Distance:本次行程的飞行距离
Inflight wifi service:对机上wifi服务的满意度(0:不适用;1-5)
Departure/Arrival time convenient:对出发/到达时间方便的满意度
Ease of Online booking:在线预订的满意度
Gate location:对Gate location的满意度
Food and drink:食物和饮料的满意度
Online boarding:网上寄宿的满意度
Seat comfort:座椅舒适度满意度
Inflight entertainment:机上娱乐满意度
On-board service:船上服务满意度
Leg room service:腿部空间服务满意度
Baggage handling:行李处理满意度
Checkin service:值机服务满意度
Inflight service:机上服务满意度
Cleanliness:清洁度满意度
Departure Delay in Minutes:出发时延迟的分钟数
Arrival Delay in Minutes:到达时延迟的分钟数
Satisfaction:航空公司满意度(满意、中立或不满意)
Python版本:3.9
代码编辑器:jupyter notebook
LightGBM算法基本原理
GBDT算法的基本思想是把上一轮的训练残差作为下一轮学习器训练的输入,即每一次的输入数据都依赖于上一次训练的输出结果。因此,这种训练迭代过程就需要多次对整个数据集进行遍历,当数据集样本较多或者维数过高时会增加算法运算的时间成本,并且消耗更高的内存资源。
而XGBoost算法作为GBDT的一种改进,在训练时是基于一种预排序的思想来寻找特征中的最佳分割点,这种训练方式同样也会导致内存空间消耗极大,例如算法不仅需要保存数据的特征值,还需要保存特征排序的结果;在遍历每一个分割点的时候,都需要进行分裂增益的计算,消耗的代价大,特别是当数据量级较大时,这种方式会消耗过多时间。
为了对这些问题进行优化,2017年微软公司提出了LightGBM算法(Light Gradient Boosting Machine),该算法也是基于GBDT算法的改进,,但相较于GBDT、XGBoost算法,LightGBM算法有效地解决了处理海量数据的问题,在实际应用中取得出色的效果。LightGBM算法主要包括以下几个特点:直方图算法(寻找最佳分裂点、直方图差加速)、Leaf-wise树生长策略、GOSS、EFB、支持类别型特征、高效并行以及Cache命中率优化等。
(1)直方图Histogram算法(减少大量计算与内存占用)
XGBoost算法在进行分裂时需要预先对每一个特征的原始数据进行预排序,而直方图Histogram算法则是对特征的原始数据进行“分桶#bin”,把数据划分到不同的离散区域中,再对离散数据进行遍历,寻找最优划分点。这里针对特征值划分的每一个“桶”有两层含义,一个是每个“桶”中样本的数量;另一个是每个“桶”中样本的梯度和(一阶梯度和的平方的均值等价于均方损失)。
可以看出,通过直方图算法可以让模型的复杂度变得更低,并且特征“分桶”后仅保存了的离散值,大大降低内存的占用率。其次,这种“分桶”的方式从某种角度来看相当于对模型增加了正则化,可以避免模型出现过拟合。
值得注意的是,直方图算法是使用了bin代替原始数据,相当于增加了正则化,这也意味着有更多的细节特征会被丢弃,相似的数据可能被划分到相同的桶中,所以bin的数量选择决定了正则化的程度,bin越少惩罚越严重,过拟合的风险就越低。
另外,在LightGBM直方图算法中还包括一种直方图作差优化,即LightGBM在得到一个叶子的直方图后,能够通过直方图作差的方式用极小的代价得到其兄弟叶子的直方图,如上图所示,当得到某个叶子的直方图和父节点直方图后,另一个兄弟叶子直方图也能够很快得到,利用这种方式,LightGBM算法速度得到进一步提升。
(2)带深度限制的Leaf-wise的叶子生长策略(减少大量计算、避免过拟合)
GBDT与XGBoost模型在叶子生长策略上均采用按层level-wise分裂的方式,这种方式在分裂时会针对同一层的每一个节点,即每次迭代都要遍历整个数据集中的全部数据,这种方式虽然可以使每一层的叶子节点并行完成,并控制模型的复杂度,但也会产生许多不必要搜索或分裂,从而消耗更多的运行内存,增加计算成本。
而LightGBM算法对其进行了改进,使用了按叶子节点leaf-wise分裂的生长方式,即每次是对所有叶子中分裂增益最大的叶子节点进行分裂,其他叶子节点则不会分裂。这种分裂方式比按层分裂会带来更小的误差,并且加快算法的学习速度,但由于没有对其他叶子进行分裂,会使得分裂结果不够细化,并且在每层中只对一个叶子不断进行分裂将增大树的深度,造成模型过拟合[25]。因此,LightGBM算法在按叶子节点生长过程中会限制树的深度来避免过拟合。
(3)单边梯度采样技术 (减少样本角度)
在梯度提升算法中,每个样本都有不同梯度值,样本的梯度可以反映对模型的贡献程度,通常样本的梯度越大贡献给模型的信息增益越多,而样本的梯度越小,在模型中表现的会越好。
举个例子来说,这里的大梯度样本可以理解为“练习本中的综合性难题”,小梯度样本可以理解为“练习本中的简单题”,对于“简单题”平时做的再多再好,而“难题”却做的很少,在真正的“考试”时还是会表现不好。但并不意味着小梯度样本(“简单题”)就可以直接剔除不用参与训练,因为若直接剔除小梯度样本,数据的分布会发生改变,从而影响模型的预测效果。
因此,LightGBM算法引入了单边梯度采样技术(Gradient-based One-Side Sampling,GOSS),其基本思想就是从减少样本的角度出发,利用样本的梯度大小信息作为样本重要性的考量,保留所有梯度大的样本点(“保留所有难题”),对于梯度小的样本点(“简单题”)按比例进行随机采样,这样既学习了小梯度样本的信息,也学习了大梯度样本的信息(“平时难题都做,简单题做一部分,在面临真正的考试时才可能稳定发挥,甚至超水平发挥”),在不改变原始数据分布的同时,减小了样本数量,提升了模型的训练速度。
(4)互斥特征捆绑(减少特征角度)
高维度的数据通常是非常稀疏的,并且特征之间存在互斥性(例如通过one-hot编码后生成的几个特征不会同时为0),这种数据对模型的效果和运行速度都有一定的影响。
通过互斥特征捆绑算法(Exclusive Feature Bundling,EFB)可以解决高维度数据稀疏性问题,如下图中,设特征1、特征2以及特征3互为互斥的稀疏特征,通过EFB算法,将三个特征捆绑为一个稠密的新特征,然后用这一个新特征替代原来的三个特征,从而实现不损失信息的情况下减少特征维度,避免不必要0值的计算,提升梯度增强算法的速度。
总的来说,LightGBM是一个性能高度优化的GBDT 算法,也可以看成是针对XGBoost的优化算法,可以将LightGBM的优化用公式表达,如下式:LightGBM = XGBoost + Histogram + GOSS + EFB
首先导入本次实验用到的第三方库,然后导入航空公司满意度数据
查看数据大小
查看数据基本信息
查看数值型数据的描述性统计
查看非数值型数据的描述性统计
先统计一下原始数据集的缺失值情况,发现倒数第二个变量有310个缺失值
这里我们删除即可
检测原始数据集是否存在重复值
结果为False,说明原始数据集不存在重复值
这里我先自定义三个可视化图形的函数,方便后面调用
正相关:商务舱、在线登机和商务旅行是人们满意的主要原因。
负相关:个人旅行和经济舱导致不满意。
发现性别对满意度貌似没有影响。
看起来分布是相当对称的,大多数人都在40岁左右。也许我们可以说满意的人比不满意的人更大。 满意的人大约在40-56岁之间。不满意的年龄在20-40岁之间。
个人旅行有很大的影响。大多数个人旅行者都是不满意的人。
好吧,我们可以注意到经济舱有很多不满意的人…大多数经济舱乘客也不满意。另一方面,商务舱有大多数满意的人。
忠诚客户大多数都是商务舱。不忠诚客户大多数都是经济舱。这里我们可以注意到,大多数个人旅行乘坐的是经济舱。这与个人旅行和经济舱都有很多不满意的人的事实是一致的。另一方面,大多数商务旅行都乘坐商务舱。
似乎没有影响。大多数旅行都是500单位距离。
正如预期的那样,出发延误对到达延误有很强的相关性。我们还可以注意到,出发延误近似等于到达延误。它告诉我们知道延误只发生在航班开始前(而不是在飞行过程中)。
大多数人对出发和到达时间的满意度为4级或5级。
现在我们来分析一下跟量表有关的变量,也就是说这些变量都是打分制0-5
相关系数热力图
来看下我们有哪些字符型变量需要处理
接着对这四个变量进行编码处理
编码完后,开始准备建模需要用到数据,然后拆分数据集为训练集和测试集
构建逻辑回归模型
构建朴素贝叶斯模型
构建决策树模型
构建梯度提升决策树
构建Xgboost模型
构建LightGBM模型
通过对比这6个模型的准确率,我们发现LightGBM模型的准确率最高,故我们选择该模型作为最终的训练模型。
前面我们选择了LightGBM模型,接着我们对该模型进行全面的评估。
通过结果我们发现是否有WIFI服务对满意度影响的程度最大,说明航空公司需要重视这一服务的提供。
最后我们随机抽取10个预测结果来检测模型效果,发现结果全部预测正确!
本次实验我们分析了航空公司的满意度数据,找出了影响满意度的因素,最后我们选择LightGBM模型来构建航空公司满意度预测模型,模型准确率为96.4%,模型效果较好!
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
plt.style.use("seaborn")
pd.set_option("display.max_columns", None)
pd.set_option("display.max_colwidth", None)
import warnings
warnings.filterwarnings('ignore')
df = pd.read_csv('air_data.csv')
df.head()
df.shape
df.info()
df.describe().T
df.describe(include='O')
df.isnull().sum() # 统计缺失值情况
df.dropna(inplace=True) # 删除缺失值
df.shape
any(df.duplicated()) # 检查数据是否存在重复值
# 总体分析一下与满意度的相关关系变量
df["satisfaction"].replace({"satisfied": 1, "neutral or dissatisfied": 0}, inplace = True)
df_dummies = pd.get_dummies(df)
df_dummies.corr()['satisfaction'].sort_values(ascending = False).plot(kind='bar')
plt.show()
正相关
商务舱、在线登机和商务旅行是人们满意的主要原因。
负相关
个人旅行和经济舱导致不满意。
# 自定义三个可视化图形的函数,方便后面调用
def count(df, col, hue = None, annot = True, ax = None):
"""
This function plots the count plot for the column given
arguments:
df: the data frame
col: column name
hue: if you wanted to add a third variable
annot: to add annotation
"""
g = sns.countplot(data = df, x = col, hue = hue, palette = "pastel", ax = ax)
if annot:
for p in g.patches:
percent = p.get_height() * 100 / len(df)
g.annotate(f"{p.get_height()}\n({percent:.2f}%)",(p.get_x() + 0.2, p.get_height()),
ha = "center", va = "bottom", color = "black", fontweight = "bold", fontsize = 10,
fontname = "monospace")
# titles
g.set_title(f"{col} Count Plot", fontsize = 17, fontname = "monospace", fontweight = "bold", pad = 20)
g.set_xlabel(f"{col}", fontsize = 15, fontname = "monospace", fontweight = "semibold")
g.set_ylabel("Count", fontsize = 15, fontname = "monospace", fontweight = "semibold")
plt.xticks(fontsize = 12, fontweight = "semibold")
plt.yticks(fontsize = 12, fontweight = "semibold")
def kde(df, col, ax = None, color = "green", hue = None):
"""
This function plots the kde for the column given
It takes three parameters
First, the data frame
Second, the column to plot the kde for
Third, An Optional argument to specify axis if there was one
"""
g = sns.kdeplot(data = df, x = col, shade = True, color = color, ax = ax, hue = hue)
# titles
g.set_title(f"kde plot for column {col}", fontsize = 17, weight = "bold", fontname = "monospace", pad = 20)
g.set_xlabel(col, fontsize = 15, weight = "semibold", fontname = "monospace")
g.set_ylabel("Density", fontsize = 15, weight = "semibold", fontname = "monospace")
plt.xticks(fontsize = 12, fontweight = "semibold")
plt.yticks(fontsize = 12, fontweight = "semibold")
plt.show()
def scatter(df, x, y, ax = None, hue = None, size = None, style = None, alpha = 1):
"""
This function allows you to plot the scatter plot of 2 variables
---
arguments:
df: data frame name.
x: column name to x-axis.
y: column name to y-axis.
ax: if there's more than one.
hue: to add another variable using color.
size: to add another variable using size.
style: to add another variable using style.
"""
g = sns.scatterplot(data = df, x = x, y = y, ax = ax , hue = hue,
size = size, style = style, markers = True, alpha = alpha)
# titles
g.set_title(f"{x} with {y}", fontsize = 17, weight = "bold", fontname = "monospace", pad = 20)
g.set_xlabel(x, fontsize = 15, weight = "semibold", fontname = "monospace")
g.set_ylabel(y, fontsize = 15, weight = "semibold", fontname = "monospace")
plt.xticks(fontsize = 12, fontweight = "semibold")
plt.yticks(fontsize = 12, fontweight = "semibold")
plt.show()
# 分析数据集中性别比例
count(df, "Gender")
# 分析不同性别对满意度差异
count(df, "Gender", hue = "satisfaction")
# 分析年龄分布情况
kde(df, "Age")
看起来分布是相当对称的,大多数人都在40岁左右。
# 分析不同年龄段的满意度差异
kde(df, "Age", hue = "satisfaction")
也许我们可以说满意的人比不满意的人更大。
满意的人大约在40-56岁之间。不满意的年龄在20-40岁之间。
# 分析旅行类型分布
count(df, "Type of Travel")
# 不同旅行类型对满意度的影响
count(df, "Type of Travel", hue = "satisfaction")
个人旅行有很大的影响。
大多数个人旅行者都是不满意的人。
# 分析座椅等级的分布
count(df, "Class")
count(df, "Class", hue = "satisfaction")
好吧,我们可以注意到经济舱有很多不满意的人…
大多数经济舱乘客也不满意。
另一方面,商务舱有大多数满意的人。
count(df,"Customer Type", hue = "Class")
忠诚客户大多数都是商务舱。
不忠诚客户大多数都是经济舱。
count(df,"Type of Travel", hue = "Class")
这里我们可以注意到,大多数个人旅行乘坐的是经济舱。
这与个人旅行和经济舱都有很多不满意的人的事实是一致的。
另一方面,大多数商务旅行都乘坐商务舱。
# 分析飞行距离分布
kde(df, "Flight Distance")
# 分析飞行距离对满意度的影响
kde(df, "Flight Distance",hue='satisfaction')
似乎没有影响。大多数旅行都是500单位距离。
# 分析航班起飞和到达延误之间的关系
scatter(df, x = "Departure Delay in Minutes", y = "Arrival Delay in Minutes")
正如预期的那样,出发延误对到达延误有很强的相关性。
我们还可以注意到,出发延误近似等于到达延误。它告诉
我们知道延误只发生在航班开始前(而不是在飞行过程中)。
count(df, "Departure/Arrival time convenient")
大多数人对出发和到达时间的满意度为4级或5级。
services = ['Ease of Online booking',
'Gate location', 'Food and drink', 'Online boarding', 'Seat comfort',
'Inflight entertainment', 'On-board service', 'Leg room service',
'Baggage handling', 'Checkin service', 'Inflight service',
'Cleanliness']
fig, ax = plt.subplots(6, 2, figsize = (20, 55))
for i, service in enumerate(services):
count(df, service, hue = "satisfaction", ax = ax[i // 2, i % 2])
plt.show()
# 分析各因素之间的相关关系
fig = plt.figure(figsize=(18,18))
sns.heatmap(df.corr(),vmax=1,annot=True,linewidths=0.5,cbar=False,cmap='YlGnBu',annot_kws={'fontsize':14})
plt.xticks(fontsize=20)
plt.yticks(fontsize=20)
plt.title('correlation',fontsize=25)
plt.show()
df.describe(include='O')
# 对性别、客户类型、旅行类型、座椅等级进行编码处理
df['Gender'].replace(to_replace={'Female':0,'Male':1},inplace=True)
df['Customer Type'].replace(to_replace={'disloyal Customer':0,'Loyal Customer':1},inplace=True)
df['Type of Travel'].replace(to_replace={'Personal Travel':0,'Business travel':1},inplace=True)
df['Class'].replace(to_replace={'Eco Plus':0,'Eco':1,'Business':2},inplace=True)
df.head()
from sklearn.model_selection import train_test_split
# 准备特征变量和目标变量
X = df.drop('satisfaction',axis=1)
y = df['satisfaction']
# 划分数据集
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.2,random_state=42)
print('训练集大小:',X_train.shape[0])
print('测试集大小:',X_test.shape[0])
# 构建逻辑回归模型
from sklearn.linear_model import LogisticRegression
lr = LogisticRegression()
lr.fit(X_train,y_train)
print('逻辑回归模型准确率:',lr.score(X_test,y_test))
# 构建朴素贝叶斯模型
from sklearn.naive_bayes import GaussianNB
gb = GaussianNB()
gb.fit(X_train,y_train)
print('朴素贝叶斯模型准确率:',gb.score(X_test,y_test))
# 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(X_train,y_train)
print('决策树模型准确率:',tree.score(X_test,y_test))
# 构建梯度提升决策树模型
from sklearn.ensemble import GradientBoostingClassifier
gBdt = GradientBoostingClassifier()
gBdt.fit(X_train,y_train)
print('梯度提升决策树模型准确率:',gBdt.score(X_test,y_test))
# 构建xgboost模型
from xgboost import XGBClassifier
xgb = XGBClassifier()
xgb.fit(X_train,y_train)
print('xgboost模型准确率:',xgb.score(X_test,y_test))
# 构建lightgbm模型
from lightgbm import LGBMClassifier
gbm = LGBMClassifier()
gbm.fit(X_train,y_train)
print('lightgbm模型准确率:',gbm.score(X_test,y_test))
from sklearn.metrics import f1_score,r2_score,confusion_matrix,classification_report,auc,roc_curve
# 模型评估
y_pred = gbm.predict(X_test)
print('gbm模型的F1值:',f1_score(y_test,y_pred))
print('gbm模型的R方值:',r2_score(y_test,y_pred))
print('模型混淆矩阵:','\n',confusion_matrix(y_test,y_pred))
print('模型分类报告:','\n',classification_report(y_test,y_pred))
# 画出ROC曲线
y_prob = gbm.predict_proba(X_test)[:,1]
false_positive_rate, true_positive_rate, thresholds = roc_curve(y_test, y_prob)
roc = auc(false_positive_rate, true_positive_rate)
plt.title('ROC')
plt.plot(false_positive_rate,true_positive_rate, color='red',label = 'AUC = %0.2f' % roc)
plt.legend(loc = 'lower right')
plt.plot([0, 1], [0, 1],linestyle='--')
plt.axis('tight')
plt.ylabel('True Positive Rate')
plt.xlabel('False Positive Rate')
plt.show()
# 特征重要性评分
feat_labels = X_train.columns[0:]
importances = gbm.feature_importances_
indices = np.argsort(importances)[::-1]
index_list = []
value_list = []
for f,j in zip(range(X_train.shape[1]),indices):
index_list.append(feat_labels[j])
value_list.append(importances[j])
plt.figure(figsize=(10,6))
plt.barh(index_list[::-1],value_list[::-1])
plt.yticks(fontsize=12)
plt.title('Feature importance',fontsize=14)
plt.show()
# 模型预测
res = pd.DataFrame()
res['真实值'] = y_test
res['预测值'] = y_pred
res.sample(10)