🤵♂️ 个人主页:@艾派森的个人主页
✍🏻作者简介: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查看年龄和IBM的分布
4.3.3分析身体/心里健康对糖尿病的影响
4.3.4分析吸烟对糖尿病的影响
4.3.5饮食对糖尿病的影响
4.3.6喝酒对糖尿病的影响
4.3.7相关性分析
4.4特征工程
4.5模型构建
4.6模型评估
4.7模型预测
5.实验总结
源代码
1.项目背景
糖尿病是一种严重的慢性代谢性疾病,其主要特征是血糖水平持续升高,导致机体内多个系统和器官受损。据世界卫生组织(WHO)的数据,全球有大约4.60亿成年人患有糖尿病,这个数字在过去几十年里持续增长。糖尿病不仅对患者的生活质量造成了严重影响,还会增加心血管疾病、肾脏疾病、神经系统疾病等多种并发症的风险,对医疗资源和社会经济产生了巨大压力。
早期的糖尿病诊断对于控制疾病进程、减少并发症风险具有重要意义。然而,糖尿病的早期症状不明显,很多患者在确诊时已经存在一定的并发症。因此,开发一种准确、可靠的糖尿病确诊预测模型对于早期干预和治疗至关重要。
机器学习和人工智能技术在医疗领域的应用日益广泛,尤其是在疾病诊断、预测和患者管理方面。基于机器学习算法构建糖尿病确诊预测模型,可以利用大量的临床数据和生物指标来辅助医生进行糖尿病的早期筛查和诊断。LightGBM(Light Gradient Boosting Machine)作为一种梯度提升树算法,在处理高维、非线性数据方面具有出色的性能,能够从复杂的数据中挖掘出潜在的模式和关联关系,因此被广泛用于医疗数据分析和预测建模。
2.项目简介
2.1项目说明
本研究旨在基于LightGBM算法构建糖尿病确诊预测模型,通过分析临床数据中的生物特征、生活习惯、家族病史等因素,实现对患病风险的预测。通过该模型,可以为医生提供更多的客观数据支持,帮助其做出更准确的诊断和治疗决策,同时也可以为患者提供个性化的健康管理建议,从而有效降低糖尿病的发病率和并发症风险,改善患者的生活质量。
2.2数据说明
本实验数据集来源于Kaggle,原始数据集共有70692条数据,18列特征变量,具体各变量解释如下:
Age:13级年龄组(1 = 18-24 / 2 = 25-29 / 3 = 30-34 / 4 = 35-39 / 5 = 40-44 / 6 = 45-49 / 7 = 50-54 / 8 = 55-59 / 9 = 60-64 / 10 = 65-69 / 11 = 70-74 / 12 = 75-79 / 13 = 80以上)
Sex:患者的性别(1:男性;0:女)
HighChol:0 =无高胆固醇1 =高胆固醇
CholCheck: 0 = 5年内无胆固醇检查1 = 5年内有胆固醇检查
BMI:身体质量指数
Smoker:你一生中抽过至少100支烟吗?[注:5包= 100支]0 =否1 =是
HeartDiseaseorAttack:冠心病(CHD)或心肌梗死(MI) 0 =否1 =有
PhysActivity:过去30天内的体力活动(不包括作业0 =否1 =有)
Fruits:每天至少吃一次水果0 =不吃1 =吃
Veggies:每天吃蔬菜1次或更多0 =不1 =是
HvyAlcoholConsump:(成年男性>=每周14杯,成年女性>=每周7杯)0 =否1 =是
GenHlth:你认为你的总体健康状况是:1-5级1 =极好2 =很好3 =好4 =一般5 =差
MentHlth:心理健康状况差的天数1-30天
PhysHlth:过去30天内身体疾病或受伤天数1-30
DiffWalk:你走路或爬楼梯有严重困难吗?0 =否1 =是
Stroke:你曾经中风过。0 =否,1 =是
HighBP: 0 =不高,BP 1 =高BP
Diabetes:0 =没有糖尿病,1 =有糖尿病
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越少惩罚越严重,过拟合的风险就越低。
另外,在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
4.项目实施步骤
4.1理解数据
导入数据挖掘常用的第三方库,然后加载数据集
查看数据集大小
查看数据基本信息
查看数值型变量的描述性统计
4.2数据预处理
统计缺失值情况
发现原始数据集中各变量不存在缺失值
检测原始数据集是否存在重复值
结果为True,说明原始数据集存在重复值需要处理
这里我们直接删除即可
4.3探索性数据分析
4.3.1糖尿病确诊比例
可以发现数据集还是平衡的,确诊和非确诊比例几乎相同。
4.3.2查看年龄和IBM的分布
年龄和BMI均为正态分布
4.3.3分析身体/心里健康对糖尿病的影响
总体健康呈正态分布,中位数为3.0
Physical Health仍然很重,但在30时增加
心理健康问题很严重,这意味着更多人的心理健康问题更少
4.3.4分析吸烟对糖尿病的影响
男女比例相对相等,但女性略占优势
吸烟者与非吸烟者的比例相对相等,但非吸烟者占主导地位
更多的人拥有健康的心脏
越来越多的人进行体育锻炼
4.3.5饮食对糖尿病的影响
越来越多的人经常吃水果
越来越多的人经常吃蔬菜
4.3.6喝酒对糖尿病的影响
少量的酗酒者
更多从未经历过中风的人
高血压患者的数量很高
4.3.7相关性分析
4.4特征工程
准备建模用到的数据集,然后拆分数据集为训练集和测试集
4.5模型构建
对比四个模型,我们发现LightGBM算法模型准确率最高,故我们最终选取其作为实验模型。
4.6模型评估
打印特征重要性评分并可视化
可以发现BMI、年龄、身心健康对糖尿病的影响最大,重要性程度最大。
4.7模型预测
随机抽取10个预测结果来检测模型效果,发现10个中错误一个,模型效果还不错。
5.实验总结
本研究旨在基于LightGBM算法构建糖尿病确诊预测模型,通过分析临床数据中的生物特征、生活习惯、家族病史等因素,实现对糖尿病患病风险的预测。经过数据采集、特征工程和模型训练等一系列步骤,我们得出以下总结:
-
数据收集和预处理: 我们收集了大量包括生物特征、生活习惯、家族病史等信息的临床数据。在数据预处理阶段,我们进行了缺失值填充、特征标准化等操作,确保数据的完整性和一致性。
-
特征工程: 通过对数据进行特征选择和提取,我们选择了对糖尿病预测具有重要影响的特征。这些特征可以包括血糖水平、体质指数、年龄、性别等因素。
-
模型构建和训练: 我们选择了LightGBM作为预测模型,这是一种基于梯度提升树的算法,能够有效处理高维、非线性数据,并能从复杂数据中学习出准确的模式。我们将经过特征工程处理后的数据分为训练集和测试集,利用训练集对模型进行训练,然后通过测试集进行模型的验证和评估。
-
模型评估: 我们使用一系列评估指标如准确率、精确率、召回率、F1-score等来评估模型的性能。通过与其他常见的机器学习算法进行比较,我们验证了LightGBM在糖尿病确诊预测上的优越性。
-
结果分析和应用前景: 实验结果显示,基于LightGBM构建的糖尿病确诊预测模型具有较高的准确率和预测性能,能够在早期辅助医生进行糖尿病的诊断和风险评估。该模型在临床实际中具有重要的应用前景,可以为医生提供更多的决策支持,帮助患者实现早期干预和管理,降低并发症风险,提高生活质量。
总之,本研究为糖尿病预测领域的深入探索提供了有力支持,展示了机器学习在医疗领域的应用潜力。然而,仍需要进一步的临床验证和数据积累,以不断优化模型性能,并确保其在实际应用中的稳定性和可靠性。
心得与体会:
通过这次Python项目实战,我学到了许多新的知识,这是一个让我把书本上的理论知识运用于实践中的好机会。原先,学的时候感叹学的资料太难懂,此刻想来,有些其实并不难,关键在于理解。
在这次实战中还锻炼了我其他方面的潜力,提高了我的综合素质。首先,它锻炼了我做项目的潜力,提高了独立思考问题、自我动手操作的潜力,在工作的过程中,复习了以前学习过的知识,并掌握了一些应用知识的技巧等
在此次实战中,我还学会了下面几点工作学习心态:
1)继续学习,不断提升理论涵养。在信息时代,学习是不断地汲取新信息,获得事业进步的动力。作为一名青年学子更就应把学习作为持续工作用心性的重要途径。走上工作岗位后,我会用心响应单位号召,结合工作实际,不断学习理论、业务知识和社会知识,用先进的理论武装头脑,用精良的业务知识提升潜力,以广博的社会知识拓展视野。
2)努力实践,自觉进行主角转化。只有将理论付诸于实践才能实现理论自身的价值,也只有将理论付诸于实践才能使理论得以检验。同样,一个人的价值也是透过实践活动来实现的,也只有透过实践才能锻炼人的品质,彰显人的意志。
3)提高工作用心性和主动性。实习,是开端也是结束。展此刻自我面前的是一片任自我驰骋的沃土,也分明感受到了沉甸甸的职责。在今后的工作和生活中,我将继续学习,深入实践,不断提升自我,努力创造业绩,继续创造更多的价值。
这次Python实战不仅仅使我学到了知识,丰富了经验。也帮忙我缩小了实践和理论的差距。在未来的工作中我会把学到的理论知识和实践经验不断的应用到实际工作中,为实现理想而努力。
源代码
import pandas as pd
import numpy as np
import matplotlib.pylab as plt
import seaborn as sns
sns.set_style('whitegrid')
plt.rcParams['font.sans-serif'] = ['SimHei'] #解决中文显示
plt.rcParams['axes.unicode_minus'] = False #解决符号无法显示
import warnings
warnings.filterwarnings('ignore')df = pd.read_csv('diabetes_data.csv')
df.head()
df.shape
df.info()
df.describe().T
df.isnull().sum() # 统计缺失值情况
any(df.duplicated()) # 检测原始数据是否存在重复值
df.drop_duplicates(inplace=True)
df.shape
df['Diabetes'].value_counts()
# 查看目标变量是否平衡
sns.countplot(x='Diabetes', data=df, palette=("mako"))
plt.title("Balanced data",size=12, fontstyle='italic', weight=900)
plt.ylabel("Total Count", size=16, family='monospace')
plt.show()
# 查看年龄和IBM的分布
fig1, ax = plt.subplots(3, 2, figsize=(16,12))
fig1.suptitle('Age and BMI Histograms')
fig1.delaxes(ax[2,1])
fig1.delaxes(ax[2,0])
fig1.delaxes(ax[1,1])
fig1.delaxes(ax[1,0])
ax[0,0].set_title('Age Description')
sns.histplot(data = df,x = 'Age',color = 'navy',alpha = 1,kde = True, ax = ax[0,0])
ax[0,1].set_title('BMI Description')
sns.histplot(data = df,x = 'BMI',color = 'indigo',alpha = 1,kde = True ,ax = ax[0,1])fig1.tight_layout()
年龄和BMI均为正态分布
# 分析身体/心里健康对糖尿病的影响
fig2, ax = plt.subplots(3, 2, figsize=(16,12))
fig2.suptitle('Health Histograms')
fig2.delaxes(ax[2,1])
fig2.delaxes(ax[2,0])
fig2.delaxes(ax[1,1])
ax[0,0].set_title('General Health Description')
sns.histplot(data = df,x = 'GenHlth',color = 'darkslateblue',alpha = 1,kde = True ,ax = ax[0,0])
ax[0,1].set_title('Pyshical Health Description')
sns.histplot(data = df,x = 'PhysHlth',color = 'navy',alpha = 1,kde = True ,ax = ax[0,1])
ax[1,0].set_title('Mental Health Description')
sns.histplot(data = df,x = 'MentHlth',color = 'navy',alpha = 1,kde = True ,ax = ax[1,0], bins = 12)fig2.tight_layout()
总体健康呈正态分布,中位数为3.0
Physical Health仍然很重,但在30时增加
心理健康问题很严重,这意味着更多人的心理健康问题更少
fig3, ax = plt.subplots(2, 2, figsize=(16,12))fig3.suptitle('General Health')
sns.countplot(x='Sex', data=df, palette=("Blues_d"), ax = ax[0,0])ax[0,0].set_xlabel('Sex (0 = Female & 1 = Male)', size=16, fontstyle='italic', weight=500 )
ax[0,0].set_ylabel('Total Count', size=16, family='monospace')
ax[0,0].set_title('Sex',size=12, fontstyle='italic', weight=900)sns.countplot(x='Smoker', data=df, palette=("Blues_d"),ax = ax[0,1])ax[0,1].set_title('Smokers',size=12, fontstyle='italic', weight=900)
ax[0,1].set_xlabel('Smoker (0 = no & 1 = yes)', size=16, fontstyle='italic', weight=500)
ax[0,1].set_ylabel('Total Count', size=16, family='monospace')sns.countplot(x='HeartDiseaseorAttack', data=df, palette=("Blues_d"),ax = ax[1,0])ax[1,0].set_xlabel('Heart Disease (0 = Healthy Heart & 1 = Has Heart Problem)', size=16, fontstyle='italic', weight=500)
ax[1,0].set_ylabel('Total Count', size=16, family='monospace')
ax[1,0].set_title('Heart Disease or Attack',size=12, fontstyle='italic', weight=900)sns.countplot(x='HeartDiseaseorAttack', data=df, palette=("Blues_d"),ax = ax[1,0])ax[1,0].set_xlabel('Heart Disease (0 = Healthy Heart & 1 = Has Heart Problem)', size=16, fontstyle='italic', weight=500)
ax[1,0].set_ylabel('Total Count', size=16, family='monospace')
ax[1,0].set_title('Heart Disease or Attack',size=12, fontstyle='italic', weight=900)sns.countplot(x='PhysActivity', data=df, palette=("Blues_d"),ax = ax[1,1])ax[1,1].set_xlabel('Physical Activity (0 = Non-Physically Acitve & 1 = Physically Active)', size=16, fontstyle='italic', weight=500)
ax[1,1].set_ylabel('Total Count', size=16, family='monospace')
ax[1,1].set_title('Physical Activity',size=12, fontstyle='italic', weight=900)
fig3.tight_layout()男女比例相对相等,但女性略占优势
吸烟者与非吸烟者的比例相对相等,但非吸烟者占主导地位
更多的人拥有健康的心脏
越来越多的人进行体育锻炼
fig4, ax = plt.subplots(1, 2, figsize=(10,5))fig4.suptitle('Healthy eating')
sns.countplot(x='Fruits', data=df, palette=("Blues_d"), ax = ax[0])
ax[0].set_xlabel('Eats Fruits (0 = Non-Regulary Acitve & 1 = Regularly)', size=9, fontstyle='italic', weight=500)
ax[0].set_ylabel('Total Count', size=9, family='monospace')
ax[0].set_title('Fruit Consumption',size=12, fontstyle='italic', weight=900)
sns.countplot(x='Veggies', data=df, palette=("Blues_d"), ax= ax[1])
ax[1].set_xlabel('Eats Vegtables (0 = Non-Regulary Acitve & 1 = Regularly)', size=9, fontstyle='italic', weight=500)
ax[1].set_ylabel('Total Count', size=9, family='monospace')
ax[1].set_title('Vegtable Consumption',size=12, fontstyle='italic', weight=900)fig4.tight_layout()
越来越多的人经常吃水果
越来越多的人经常吃蔬菜
fig5, ax = plt.subplots(3, 2, figsize=(16,12))fig5.suptitle('Health Disorders')
fig5.delaxes(ax[2,1])
fig5.delaxes(ax[2,0])
fig5.delaxes(ax[1,1])
sns.countplot(x='HvyAlcoholConsump', data=df, palette=("Blues_d"), ax = ax[0,0])
ax[0,0].set_xlabel('Alcohol Consumption (0 = Non-Heavy Active & 1 = Heavy)', size=16, fontstyle='italic', weight=500)
ax[0,0].set_ylabel('Total Count', size=16, family='monospace')
ax[0,0].set_title('Alcohol Consumption',size=12, fontstyle='italic', weight=900)
sns.countplot(x='Stroke', data=df, palette=("Blues_d"), ax = ax[0,1])
ax[0,1].set_xlabel('Stroke (0 = Never Experienced a Stroke & 1 = Has Experienced a Stroke)', size=16, fontstyle='italic', weight=500)
ax[0,1].set_ylabel('Total Count', size=16, family='monospace')
ax[0,1].set_title('Stroke',size=12, fontstyle='italic', weight=900)
sns.countplot(x='HighBP', data=df, palette=("Blues_d"),ax = ax[1,0])
ax[1,0].set_xlabel('Blood-Pressure(0 = Normal Blood-Pressure & 1 = High Blood-Pressure)', size=16, fontstyle='italic', weight=500)
ax[1,0].set_ylabel('Total Count', size=16, family='monospace')
ax[1,0].set_title('Blood-Pressure',size=12, fontstyle='italic', weight=900)
fig5.tight_layout()
少量的酗酒者
更多从未经历过中风的人
高血压患者的数量很高
# 相关系数热力图
plt.figure(figsize=(15,15))
correlation_mat = df.corr()
sns.heatmap(correlation_mat, annot = True)
plt.show()
from sklearn.model_selection import train_test_split
# 准备建模的数据
X = df.drop('Diabetes',axis=1)
y = df['Diabetes']
# 划分数据集
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))
# 构建KNN模型
from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()
knn.fit(X_train,y_train)
print('KNN模型准确率:',knn.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))
# 构建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('模型的F1值:',f1_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)