大数据分析案例-基于LightGBM算法构建航空公司满意度预测模型

news2024/12/24 3:05:50

🤵‍♂️ 个人主页:@艾派森的个人主页

✍🏻作者简介: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.实验总结

源代码


1.项目背景

        随着旅游业的蓬勃发展,航空公司的竞争也日益激烈。为了提高竞争力,航空公司需要不断提高服务质量和客户满意度。因此,预测客户满意度成为航空公司一个重要的研究方向。

        传统的满意度预测方法主要基于历史数据,如客户反馈、问卷调查等。这些方法的主要缺点是缺乏实时性和主动性。随着机器学习技术的发展,基于机器学习的满意度预测方法逐渐得到广泛应用。其中,基于梯度提升决策树 (LightGBM) 的算法是一种比较有效的机器学习算法。

        LightGBM 是一种基于梯度提升决策树的机器学习算法,它结合了 GBDT 和 LightGBM 的优点,具有较高的训练速度和泛化能力。在航空领域,LightGBM 算法可以用于预测客户满意度,帮助航空公司更好地了解客户需求和行为,提高服务质量和客户满意度。

        因此,本实验旨在基于 LightGBM 算法构建一个航空公司满意度预测模型,并通过实际数据进行验证,以帮助航空公司更好地预测客户满意度,提高竞争力和服务质量。

2.项目简介

2.1项目说明

        本项目旨在通过分析航空公司的满意度调查数据,找出影响客户满意度的因素,最后使用机器学习算法构造航空公司满意度预测模型,及时帮助航空公司解决客户的不满意,打造一个良好的口碑。

2.2数据说明

        本数据来源于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:航空公司满意度(满意、中立或不满意)

2.3技术工具

Python版本:3.9

代码编辑器:jupyter notebook

3.算法原理

 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越少惩罚越严重,过拟合的风险就越低。

图 2 6 直方图作差

        另外,在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值的计算,提升梯度增强算法的速度。

图  EFB特征合并示例

        总的来说,LightGBM是一个性能高度优化的GBDT 算法,也可以看成是针对XGBoost的优化算法,可以将LightGBM的优化用公式表达,如下式:LightGBM = XGBoost + Histogram + GOSS + EFB

图  LightGBM算法流程图

4.项目实施步骤

4.1理解数据

首先导入本次实验用到的第三方库,然后导入航空公司满意度数据

查看数据大小 

 

 查看数据基本信息

查看数值型数据的描述性统计

 查看非数值型数据的描述性统计

4.2数据预处理

先统计一下原始数据集的缺失值情况,发现倒数第二个变量有310个缺失值

这里我们删除即可

检测原始数据集是否存在重复值

结果为False,说明原始数据集不存在重复值 

4.3探索性数据分析

这里我先自定义三个可视化图形的函数,方便后面调用

4.3.1相关性分析

正相关:商务舱、在线登机和商务旅行是人们满意的主要原因。
负相关:个人旅行和经济舱导致不满意。

4.3.2性别对满意度的影响

 发现性别对满意度貌似没有影响。

4.3.3年龄对满意度的影响

 看起来分布是相当对称的,大多数人都在40岁左右。也许我们可以说满意的人比不满意的人更大。 满意的人大约在40-56岁之间。不满意的年龄在20-40岁之间。

4.3.4旅行类型对满意度的影响

个人旅行有很大的影响。大多数个人旅行者都是不满意的人。

4.3.5座椅等级对满意度的影响

 好吧,我们可以注意到经济舱有很多不满意的人…大多数经济舱乘客也不满意。另一方面,商务舱有大多数满意的人。

4.3.6客户类型对满意度的影响

 忠诚客户大多数都是商务舱。不忠诚客户大多数都是经济舱。这里我们可以注意到,大多数个人旅行乘坐的是经济舱。这与个人旅行和经济舱都有很多不满意的人的事实是一致的。另一方面,大多数商务旅行都乘坐商务舱。

4.3.7飞行距离对满意度的影响

 似乎没有影响。大多数旅行都是500单位距离。

4.3.8航班延迟对满意度的影响

正如预期的那样,出发延误对到达延误有很强的相关性。我们还可以注意到,出发延误近似等于到达延误。它告诉我们知道延误只发生在航班开始前(而不是在飞行过程中)。

 大多数人对出发和到达时间的满意度为4级或5级。

4.3.9其他分析

现在我们来分析一下跟量表有关的变量,也就是说这些变量都是打分制0-5

相关系数热力图 

4.4特征工程

来看下我们有哪些字符型变量需要处理

接着对这四个变量进行编码处理 

 编码完后,开始准备建模需要用到数据,然后拆分数据集为训练集和测试集

4.5模型构建

构建逻辑回归模型

构建朴素贝叶斯模型 

 

构建决策树模型 

 

 构建梯度提升决策树

构建Xgboost模型

构建LightGBM模型

通过对比这6个模型的准确率,我们发现LightGBM模型的准确率最高,故我们选择该模型作为最终的训练模型。

4.6模型评估

前面我们选择了LightGBM模型,接着我们对该模型进行全面的评估。

 

4.7特征重要性评分 

 通过结果我们发现是否有WIFI服务对满意度影响的程度最大,说明航空公司需要重视这一服务的提供。

4.8模型预测

最后我们随机抽取10个预测结果来检测模型效果,发现结果全部预测正确!

5.实验总结

        本次实验我们分析了航空公司的满意度数据,找出了影响满意度的因素,最后我们选择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)

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

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

相关文章

DOD Digital Engineering Vision 数字工程策略与实施

DOD Digital Engineering Vision DOD的数字工程策略与实施,仅供个人学习使用,不代表个人意见和观点!!! Digital Engineering Strategy and Implementation Ms. Philomena Zimmerman Office of the Under Secretary …

day1

在linux内核中,当用户打开设备文件时,内核中的VFS层会调用设备驱动中的sys_open()函数,在sys_open()函数中,内核会根据文件的inode号判断文件是否存在于文件系统中,如果存在,内核会找到这个文件的文件信息结…

Python:使用钉钉dingtalk发送通知消息

通过钉钉的开放API接口,可以很容易的将消息发送到钉钉dingtalk,比起邮件发送更稳定,及时 文档 官网:https://www.dingtalk.com/API Explorer调试 https://open-dev.dingtalk.com/apiExplorer 目录 方式一:webhook方式…

Search space set group switching(一)

欢迎关注同名微信公众号“modem协议笔记”。 根据R17 38.300的描述,UE可以通过PDCCH monitoring adaptation机制实现power saving的目的,这其中就包括PDCCH monitoring skipping和search space set group (SSSG) switching两种机制。PDCCH monitoring s…

dom4j 解析 mybatis mapper xml 文件

01: CarMapper.xml : <?xml version"1.0" encoding"UTF-8" ?> <!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd"> <mapper namespace"car"…

代码随想录 回溯算法 Java

文章目录 组合&#xff08;*中等&#xff09;77. 组合&#xff08;*中等&#xff09;17. 电话号码的字母组合&#xff08;中等&#xff09;39. 组合总和&#xff08;中等&#xff09;40. 组合总和II&#xff08;中等&#xff09;216. 组合总和||| 分割&#xff08;*中等&#x…

【王道操作系统】内存管理

内存管理概念 1.C 2.D 存储保护的作用&#xff1a;保证各道作业在各自的存储空间内运行&#xff0c;互不干扰 实现虚拟内存管理需要请求分页&#xff08;请求分段、请求段页&#xff09;等技术的支持&#xff0c;故需要硬件支持&#xff0c;比如页表机制、中断机构、地址变换…

【五子棋实战】第1章 项目架构与开发思路

【五子棋实战】第1章 项目总览 前言 ## 项目技术栈 ## 项目可配置性 博客目录 项目预览 项目代码获取 项目架构 ## 架构&#xff1a;前端页面 算法接口 ## 前端页面 ## 算法接口 开发思路 前言 五子棋是一种古老而受欢迎的棋类游戏&#xff0c;本博客将介绍如何使用…

Matplotlib-直方图、箱型图

1. 直方图 hist函数来创建一个直方图。下面是对各个参数的解释&#xff1a; x&#xff1a;要绘制直方图的数据序列。bins&#xff1a;指定直方图的边界范围和间隔。这里使用range(40, 110, 6)表示边界从40到110&#xff0c;间隔为6。facecolor&#xff1a;直方图的填充颜色。…

unity UGUI源码分析(4)Text与TextMeshPro

这一篇博客用于分析Text的内容的更新机制&#xff0c;并分析text mesh pro。 首先我们分析Text的文字是如何渲染出来的。 PupulateWithErrors方法会根据字符串生成顶点数据。其实Text会根据所给定的字符串生成相关的图集&#xff0c;然后对图集进行采样就可以渲染出文字了。由…

【五子棋实战】第3章 算法包装成第三方接口

【五子棋实战】第3章 算法包装成第三方接口 使用Flask开放接口 ## 定义接口输入 ## 开放接口、跨域配置、数据解析 数据预处理 ## 数据检查与异常捕获 ## 预处理数据 ## 定义接口输出 开启接口 继续学习下一篇实战&#xff01; 我们在上一章实现了博弈树负值极大alpha…

最适合入门的100个深度学习实战项目

&#x1f6a8;注意&#x1f6a8;&#xff1a;最近经粉丝反馈&#xff0c;发现有些订阅者将此专栏内容进行二次售卖&#xff0c;特在此声明&#xff0c;本专栏内容仅供学习&#xff0c;不得以任何方式进行售卖&#xff0c;未经作者许可不得对本专栏内容行使发表权、署名权、修改…

Linux系统安装nginx+入门笔记

安装过程 1.加载wget命令 yum install wget 2.拉取安装包 wget https://nginx.org/download/nginx-1.16.1.tar.gz 3.解压安装包 tar -zxvf nginx-1.16.1.tar.gz 4.执行这个命令自动配置一下 5.编译安装 make make install 6.查看nginx安装的位置 whereis nginx 7.…

基于Python的反爬虫技术的研究设计与实现

博主介绍&#xff1a;擅长Java、微信小程序、Python、Android等&#xff0c;专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;&#x1f3fb; 不然下次找不到哟 Java项目精品实战案例…

链表刷题(4~8)

目录 反转链表 返回中间节点 倒数k个节点 链表分割 判断回文 反转链表 单链表刷题时我们遇到过一个反转链表&#xff0c;那时我们采用的是头插的方式达到反转的效果&#xff0c;那能不能把指针反过来呢&#xff1f;答案是可以的。 这里用三个指针是为了记录后面节点的数据&…

SpringBoot+Vue 的智慧养老系统(Java 项目,附源码,数据库)

作者&#xff1a;程序员徐师兄 个人简介&#xff1a;7 年大厂程序员经历&#xff0c;擅长Java、微信小程序、Python、Android等&#xff0c;大家有这一块的问题可以一起交流&#xff01; 各类成品java毕设 。javaweb&#xff0c;ssh&#xff0c;ssm&#xff0c;springboot等等项…

Jira 8.4.1在Windows环境下的安装和配置

一. Jira安装的环境准备 1.JDK1.8的下载和安装 Jira的运行是依赖java环境的&#xff0c;也就是说需要安装JDK并且要是1.8以上版本。(网上搜一下教程) 2.MySQL数据库的下载和安装(网上搜一下教程) 数据库版本&#xff1a;MySQL5.6&#xff0c;版本太高有时会出现连接不到的…

从双目标定到立体匹配:pyton实践指南

文章目录 前言标定立体匹配文章已经同步更新在3D视觉工坊啦&#xff0c;原文链接如下&#xff1a; 前言 立体匹配是计算机视觉中的一个重要领域&#xff0c;旨在将从不同角度拍摄的图像匹配起来&#xff0c;以创建类似人类视觉的3D效果。实现立体匹配的过程需要涉及许多步骤&a…

华为OD机试真题B卷 Java 实现【统计每个月兔子的总数】,附详细解题思路

一、题目描述 有一种兔子&#xff0c;从出生后第3个月起每个月都生一只兔子&#xff0c;小兔子长到第三个月后每个月又生一只兔子。 例如&#xff1a;假设一只兔子第3个月出生&#xff0c;那么它第5个月开始会每个月生一只兔子。 一月的时候有一只兔子&#xff0c;假如兔子都…

dvwa靶场通关(七)

第七关&#xff1a;SQL Injection&#xff08;sql注入&#xff09; low 我们输入 1,出现报错信息&#xff0c;根据报错信息可知&#xff0c;查询语句是单引号闭合的字符型 接着判断字段数 1 order by 3# 报错 1 order by 2# 正常 所以字段数就是2 利用联合查询爆出数据库名…