sklearn包使用Extra-Trees和GridSearchCV完成成人死亡率预测

news/2024/5/19 9:07:41/文章来源:https://blog.csdn.net/weixin_44491423/article/details/127011461

成年人死亡率指的是每一千人中 15 岁至 60 岁死亡的概率(数学期望)。这里我们给出了世界卫生组织(WHO)下属的全球卫生观察站(GHO)数据存储库跟踪的所有国家健康状况以及许多其他相关因素。要求利用训练数据建立回归模型,并预测成年人死亡率(Adult Mortality)。


导入相关包

import pandas as pd
import sklearn
import numpy as npfrom sklearn.impute import SimpleImputer
from sklearn.preprocessing import MinMaxScaler
from sklearn.ensemble import ExtraTreesRegressor
from sklearn.model_selection import train_test_split
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import mean_squared_error, r2_scoreimport joblib

训练数据读取和可视化

训练数据链接:https://pan.baidu.com/s/1KYtUoHBIv1pqYDbO9OdDHg?pwd=nefu
提取码:nefu

训练数据(train_data.csv)总共包含 2336 条记录,22 个字段,主要字段说明如下:

  • Country:国家
  • Year:年份
  • Status:发达国家或发展中国家
  • Life expectancy:预期寿命
  • Infant deaths:每千人口中的婴儿死亡人数
  • Alcohol:人均酒精消费量(以升纯酒精为单位)
  • percentage expenditure:卫生支出占人均国内生产总值的百分比
  • Hepatitis B:一岁儿童乙型肝炎免疫疫苗接种率
  • Measles:麻疹每 1000 人报告的病例数
  • BMI:所有人群平均 BMI 指数
  • under-five deaths:每千人口中五岁以下死亡人数
  • Polio:1 岁儿童脊髓灰质炎免疫覆盖率(%)
  • Total expenditure:政府卫生支出占政府总支出的百分比
  • Diphtheria:1 岁儿童白喉、破伤风类毒素和百日咳免疫接种率(%)
  • HIV/AIDS:每千名活产婴儿死于艾滋病毒/艾滋病(0-4 岁)
  • GDP:人均国内生产总值(美元)
  • Population:人口
  • thinness 1-19 years:10 至 19 岁儿童和青少年的消瘦流行率
  • thinness 5-9 years:5 至 9 岁儿童中的消瘦流行率
  • Income composition of resources:财力收入构成方面的人类发展指数(从 0 到 1)
  • Schooling:受教育年限
  • Adult Mortality:成人死亡率(每 1000 人中 15 至 60 岁死亡的概率)
    测试数据(test_data.csv)总共包含 592 条记录,21 个字段,和训练数据相比,除了不包含 Adult Mortality 字段外,其他完全相同。

需要注意的是数据中可能会有一些字段的值存在缺失。

# 读取数据集
train_data = pd.read_csv('./data/train_data.csv')
train_data


可以看到 NaN 就是有缺失值。

下面计算各个特征之间的皮尔森相关系数,皮尔森相关系数可以理解为特征与特征之间的线性相关程度,取值[-1,1],正数就是正相关,负数就是负相关。且绝对值越大,即越接近1,相关程度越高。具体可以看这篇文章。

# 计算各个特征之间的皮尔森相关系数
train_data.corr()

# 将相关性矩阵绘制成热力图
corr = train_data.corr()
corr.style.background_gradient(cmap='coolwarm')


从热力图可以看出 infant deathsunder-five deaths有很强的正相关,即 每千人口中的婴儿死亡人数每千人口中五岁以下死亡人数 有很强的正相关。其实很好理解,因为正常情况下,under-five deaths 包含了 infant deaths 的情况,那后面我们就可以考虑将 infant deaths 这个属性去除掉。

除此之外,也可以看到 thinness 1-19 yearsthinness 5-9 years 有很强的正相关,也是和上面一样的道理。

可以用 seaborn 可视化数据之间的依赖关系:

import seaborn as sns
sns.pairplot(train_data)

模型拟合和成年人死亡率预测

train_data = pd.read_csv('./data/train_data.csv') # 训练数据
model_filename = './model.pkl'  # 模型路径
imputer_filename = './imputer.pkl' # 缺失值处理器路径
scaler_filename = './scaler.pkl' #  归一化处理器路径
# 划分为训练集和测试集![请添加图片描述](https://img-blog.csdnimg.cn/2920c38856524604b57fb8dcf17d5ac1.png)train_y = train_data.iloc[:,-1].values
train_data = train_data.drop(["Adult Mortality"], axis=1)
x_train, x_test, y_train, y_test = train_test_split(train_data, train_y, random_state=666, test_size=0.25)

因为每个属性其取值范围差异巨大,无法直接比较。所以需要归一化把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。

这里使用最小最大归一化

# 预处理数据,进行数据归一化,以及补充缺失值
def preprocess_data(data, imputer=None, scaler=None):column_name = ['Year', 'Life expectancy ', 'infant deaths', 'Alcohol','percentage expenditure', 'Hepatitis B', 'Measles ', ' BMI ', 'under-five deaths ','Polio', 'Total expenditure', 'Diphtheria ', ' HIV/AIDS', 'GDP', 'Population',' thinness  1-19 years', ' thinness 5-9 years', 'Income composition of resources','Schooling']data = data.drop(["Country", "Status"], axis=1)if imputer==None: # 采用均值填充缺失值imputer = SimpleImputer(strategy='mean', missing_values=np.nan)imputer = imputer.fit(data[column_name])data[column_name] = imputer.transform(data[column_name])if scaler==None: # 采用最小最大归一化scaler = MinMaxScaler()scaler = scaler.fit(data)data_norm = pd.DataFrame(scaler.transform(data), columns=data.columns)data_norm = data_norm.drop(['Year', 'infant deaths', 'thinness 5-9 years'], axis = 1)return data_norm, imputer, scaler

下面使用训练数据对模型进行训练,注意这里使用了 ExtraTreesRegressor 作为回归模型,并使用了 GridSearchCV 进行参数网格搜索。使用ExtraTreesRegressor 是因为发现其他方法过过拟合很严重

Extra-Trees 为极端随机数(Extremely randomized tress),其与随机森林区别如下:

  1. RF应用了Bagging进行随机抽样,而ET的每棵决策树应用的是相同的样本。

  2. RF在一个随机子集内基于信息熵和基尼指数寻找最优属性,而ET完全随机寻找一个特征值进行划分。

在 sklearn 包中有如下参数:

参数说明
n_estimators:int, default=100森林中树的数量
criterion: {“squared_error”,“absolute_error”},default=“squared_error”计算划分标准的方法默认为均方误差
max_depth:int,default=None树的最大深度,如果不设置节点将会一直扩展到所有叶子都是纯净的或则直到所有叶子都包含少于 min_samples_split 的样本
min_samples_split:int or float,default=2代表如果要划分节点当前节点的最小样本数,如果指定为整型,最小数量就是min_samples_split,如果指定为浮点型,则最小数量就是 ceil(min_samples_split*n_samples) n_samples为总的样本数
min_samples_leaf: int or float, default=1代表如果要划分当前节点,划分出的子节点的样本数量不能小于 min_samples_leaf
bootstrap:bool,default=False表示训练数据采样是否放回
oob_score:bool,default=False表示是否使用包外样本评估泛化分数,仅当bootstrap=True可用
random_state:int, RandomState instance or None,default=None随机数的种子
verbose:int,default=0为1训练和测试输出详细信息
max_samples: int or float,default=None表示每次采样的样本数量
n_jobs:int,default=None表示并行工作的数量,-1使用所有核心

其他参数可用看官方文档。

然后我们就可以根据这些参数进行 GridSearchCV 参数网格搜索,这里的GridSearch代表网格搜索,CV 代表crossvalidation交叉验证,GridSearchCV 可以保证在指定的参数范围内找到精度最高的参数,其参数说明如下:

参数说明
estimator:estimator object模型
para_grid:dict or list of dictionaries参数网格
refit:bool, str,or callable,default=True是否使用最优参数在整个数据集上重新拟合
cv:int, cross-validation generator or an iterable,default=None决定交叉验证策略,默认为5-fold验证
verbose:int>1显示每次验证计算时间以及参数列表;>2显示分数;>3折和候选参数索引与计算开始时间被显示
def gridsearch_cv(train_data):# 需要网格搜索的参数n_estimators = [i for i in range(200,401,10)]max_depth = [i for i in range(5, 11)]min_samples_split = [i for i in range(2, 8)]min_samples_leaf = [i for i in range(1,7)]max_samples = [i/100 for i in range(95, 100)]parameters = {'n_estimators':n_estimators,'max_depth':max_depth, 'min_samples_split':min_samples_split, 'min_samples_leaf':min_samples_leaf,'max_samples':max_samples}regressor = ExtraTreesRegressor(bootstrap=True, oob_score=True, random_state=1)gs = GridSearchCV(regressor, parameters, refit = True, cv = 5, verbose = 1, n_jobs = -1)x_train_norm, imputer, scaler = preprocess_data(x_train)train_x_norm = x_train_norm.valuesgs.fit(x_train_norm,y_train)joblib.dump(gs, model_filename)joblib.dump(imputer, imputer_filename)joblib.dump(scaler, scaler_filename)return gs
gs_model = gridsearch_cv(x_train, y_train)
print('最优参数: ',gs.best_params_)
print('最佳性能: ', gs.best_score_)


模型已经找到最优参数,且训练完成,保存模型文件至本地。

下面加载模型在测试集上进行测试:

def predict(x_test):loaded_model = joblib.load(model_filename)imputer = joblib.load(imputer_filename)scaler = joblib.load(scaler_filename)x_test_norm, _, _ = preprocess_data(x_test, imputer, scaler)test_x_norm = x_test_norm.valuespredictions = loaded_model.predict(test_x_norm)return predictions
y_pred = predict(x_test)
r2 = r2_score(y_test, y_pred)
mse = mean_squared_error(y_test, y_pred)
print("MSE is {}".format(mse))
print("R2 score is {}".format(r2))


这里一共使用了两个指标,MSE(均方误差代表了预测值与真实值之间的差异),R2 衡量了模型与基准模型(取平均值)之间的差异,其计算公式如下:

分子代表预测值和真实值之间的差异,分母代表均值与真实值的差异,所以R2越接近1,代表模型相对于基准模型与真实值差异越小,即模型越好。当R2<0,说明模型还不如基准模型。

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

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Fiddler使用

最近老是使用fiddler工具&#xff0c;用了忘所以特此来记录。先说说fiddler吧&#xff0c;这是一款功能强大的抓包工具&#xff0c;平时可以拿来抓抓小程序的包&#xff0c;直接通关羊了个羊&#xff0c;安装就不说了&#xff0c;都是无脑下一步&#xff0c;提供下地址&#xf…

阿里巴巴面试题- - -多线程并发篇(三十八)

前言:七月末八月初的时候,秋招正式打响,公司会放出大量的全职和实习岗位。为了帮助秋招的小伙伴们,学长这里整理了一系列的秋招面试题给大家,所以小伙伴们不用太过焦虑,相信你们一定能超常发挥,收到心仪公司的Offer~~ 内容涵盖:Java、MyBatis、ZooKeeper、Dubbo、Elast…

商汤AI象棋机器人到底谁在买?北大象棋大师已签收

金磊 衡宇 发自 凹非寺量子位 | 公众号 QbitAI郭晶晶家的象棋家教——没错&#xff0c;就是商汤AI象棋机器人“元萝卜”&#xff08;SenseRobot&#xff09;&#xff0c;近日正式现货发售。从近2个月前开始预售的那刻起&#xff0c;各种讨论就萦绕在它周围&#xff1a;AI象棋机…

非零基础自学Java (老师:韩顺平) 第21章 网络编程 21.3 Socket 21.4 TCP网络通信编程

非零基础自学Java (老师&#xff1a;韩顺平) ✈【【零基础 快速学Java】韩顺平 零基础30天学会Java】 第21章 网络编程 文章目录非零基础自学Java (老师&#xff1a;韩顺平)第21章 网络编程21.3 Socket21.3.1 基本介绍21.4 TCP网络通信编程21.4.1 基本介绍21.4.2 应用案例1 -…

网络法规——知识产权及侵权鉴别学习笔记

一、知识产权概念 《中华人民共和国民法通则》规定&#xff0c;知识产权是指民事权利主体&#xff08;公民、法人&#xff09;基于创造性的智力成果。 1、知识产权分类 知识产权可分为工业产权和著作权。 工业产权 工业产权包括专利、实用新型、工业品外观设计、商标、服务…

随机生成植物生长及舞动算法

几年前写过一套随机树木的生成算法&#xff0c;其中使用了分形和放样建模。那时候还不知道有speedtree这款软件&#xff0c;写的比较粗糙&#xff0c;最近看了speedtree的演示把原算法改进了一下&#xff0c;算是一个speedtree的简化版本。 重构主要是把原先使用递归函…

使用Consul做注册中心简示

基地版同一个地点 不同的风景

JAMA子刊:孕妈妈每天喝半杯咖啡,可能让胎儿发育迟缓

爱心提示本文不仅适用于喜欢咖啡的孕妇&#xff0c;也适用于喜欢茶&#xff08;包括奶茶&#xff09;、巧克力、能量饮料、可乐和其他含有咖啡因的食物或饮料的孕妇。核心要点题目及新发现的相关背景&#xff1b;已知各权威机构对孕期咖啡因摄入量的建议&#xff1b;业主的个人…

Java数据结构之二叉树的基本操作

二叉树的基本操作1 二叉树的基本概念2 二叉树的遍历3 代码实现二叉树的遍历4 代码实现前序、中序、后序查找5 代码实现二叉树指定节点的删除1 二叉树的基本概念 &#xff08;1&#xff09;树有很多种&#xff0c;每个节点最多只能有两个子节点的树就是二叉树。 &#xff08;2&…

[CISCN 2019 初赛]Love Math

<?php error_reporting(0); //听说你很喜欢数学&#xff0c;不知道你是否爱它胜过爱flag if(!isset($_GET[c])){show_source(__FILE__); }else{//例子 c20-1$content $_GET[c];if (strlen($content) > 80) {die("太长了不会算");}$blacklist [ , \t, \r, \n…

【C++11新特性】类的新功能,可变模板参数,包装器

文章目录一、类的新功能1.default2.delete二、可变参数模板1.参数包2.参数包的插入与解析(1)参数包的个数(2)添加参数解析(3)逗号表达式展开(4)emplace_back三、包装器1.function(封装)2.bind(绑定)一、类的新功能 1.default 在继承与多态中&#xff0c;我们介绍了final与ove…

Feign的简单介绍及配置参数

contextId用于区分实例,类似beanName

mysql存储过程的写法

示例表 area_code_2022 &#xff1a; DROP TABLE IF EXISTS area_code_2022; CREATE TABLE area_code_2022 ( code bigint(12) unsigned NOT NULL COMMENT 区划代码, name varchar(128) NOT NULL DEFAULT COMMENT 名称, level tinyint(1) NOT NULL COMMENT 级别1-5,省市…

python识别选中文本

目标&#xff1a;识别鼠标选中区域的文本 be like : 这是我在模拟键鼠操作时遇到的情况&#xff0c;我需要根据某个位置返回的值进行判断&#xff0c;但是只是依赖pyautogui是做不到的。 方法一 经过上网冲浪寻找答案&#xff0c;被告知了此方法&#xff0c;经测试可行 impor…

Django项目想要在 Python Console里面进行操作 报错找不到对应模块

Django项目想要在 Python Console里面进行操作 报错找不到对应模块 问题描述 ModuleNotFoundError: No module named django ’ 问题原因 在进行对 Python console操作 进行管理查询要导入对应的模块&#xff0c;但是和项目中的models.py文件中的 导包引入 冲突了 导致在Py…

可持久化Trie

可持久化指的是可以记录所有的历史版本&#xff0c;即记录下来每一步操作后的状态 下图模拟过程 题目&#xff1a; 最大异或和 给定一个非负整数序列 a&#xff0c;初始长度为 N。 有 M 个操作&#xff0c;有以下两种操作类型&#xff1a; A x&#xff1a;添加操作&#xff0…

uniapp自用速查表 - 我的常用组件

纯私人class&#xff0c;公开文章是方便置顶.... <!-- 自定义导航栏 占位空间 --> <view class"navigationStyleCustomHeight alwaysOnTopBox0 bgColorForTheme"></view> <!-- 自定义导航栏 --> <view class"alwaysOnTopBox1 myNav…

java正则表达式简单使用

String email = "13072558368"; email = email.replaceAll("(\\d{3})\\d{6}(\\d{2})", "$1****$2"); System.out.println("email=" + email); email=130****68从第三个开始,计算6个数字,其中计算的6个数字用*替换String mobile = &q…

java public、protected、default、private

java 的访问控制符为了控制类还有类对应方法的访问做限制。如上的图表总结了类方法的访问控制范围,其实类的访问控制范围也是类似的情况。声明为public则不管外部包还是内部都能够访问,如果为default则只能本包内能够访问 关于类方法的访问范围,我们比较熟悉的是private还有…

java基于ssm的自助旅游管理系统

传统的旅游方式存在着漫无目的的寻找住、吃等问题&#xff0c;这样游客很累&#xff0c;也十分浪费时间。因此一个专门用来给游客介绍一些地方的景点、吃、住、特产等信息的在线旅游网站将给游客的出行选择带来极大的方便快捷。人们迫切能有一个旅游网站&#xff0c;解决旅游过…