机器学习每周挑战——肥胖数据预测

数据的截图

# 字段    说明
# Gender    性别
# Age   年龄
# Height    身高
# Weight    体重
# family_history_with_overweight    家族肥胖史
# FAVC  是否频繁食用高热量食物
# FCVC  食用蔬菜的频次
# NCP   食用主餐的次数
# CAEC  两餐之间的食品消费:always(总是);frequently(经常);sometimes(有时候)
# SMOKE 是否吸烟
# CH2O  每日耗水量
# SCC   高热量饮料消耗量
# FAF   运动频率
# TUE   使用电子设备的时间
# CALC  酒精消耗量:0(无); frequently(经常);sometimes(有时候)
# MTRANS    日常交通方式:Automobile(汽车);Bike(自行车);Motorbike(摩托车);Public Transportation(公共交通);Walking(步行)
# 0be1dad   肥胖水平# 肥胖水平中各字段意思
# Ormal_Weight  正常
# Insufficient Weight   体重不足
# Obesity_Type_I    肥胖类型 I
# Obesity_Type_ll   肥胖类型 II
# Obesity_Type_lll  肥胖类型 III
# Overweight_Level_I    一级超重
# Overweight_Level_Il   二级超重

# 了解了各个字段的含义后,我们来看问题
# 问题描述
# 相关性分析
# 群体特征分析
# 构建肥胖风险预测模型
# 数据可视化
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import pylab as pl
import seaborn as sns
from sklearn.preprocessing import OneHotEncoder,LabelEncoder,StandardScaler
from scipy.stats import spearmanr
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_reportdata = pd.read_csv("obesity_level.csv")
pd.set_option("display.max_columns",1000)
print(data.head(5))

 导入需要用到的第三方库,导入数据

# 知道了问题后我们先对数据进行预处理
print(data.info())
print(data.isnull().sum())
data = data.drop('id',axis=1)
data['Age'] = data['Age'].astype('int64')

# 没有缺失值,因此我们来看数据
# 首先ID这一列对我们的分析没有任何帮助,我们将其删除

# 由于年龄应该是整数,但是数据集中年龄存在小数,我们将其转换为整数

处理之后,我们来看第一个问题,相关性分析,想到什么——热力图(斯皮尔曼相关系数)

columns = ['Gender', 'Age', 'Height', 'Weight', 'family_history_with_overweight','FAVC', 'FCVC', 'NCP', 'CAEC', 'SMOKE', 'CH2O', 'SCC', 'FAF', 'TUE','CALC', 'MTRANS']for col in columns:if data[col].dtype == object:df = pd.crosstab(data[col],data['0be1dad'])pl.figure()sns.heatmap(df,cmap='coolwarm',annot=True,fmt='2g')plt.xlabel(col)plt.ylabel('0be1dad')# plt.tight_layout()# plt.xticks(rotation=60)plt.title(col+'与肥胖水平之间的相关性')else:data[col+ '_bins'] = pd.qcut(data[col],q=5,duplicates='drop')df =data.groupby([col+ '_bins','0be1dad']).size().unstack()df.plot(kind='bar',stacked=True)plt.xlabel(col)plt.ylabel('0be1dad')# plt.tight_layout()# plt.xticks(rotation=60)plt.title(col + '与肥胖水平之间的相关性')plt.show()

由于图像绘制较多,因此我选择部分图像进行展示

 

 

 

从途中我们可以看出各个特征与肥胖水平之间的相关性,但是图片可以得到的数据有限,具体欸到相关性强弱还得需要通过数据来分析。首先我们先将分类变量转换为数值型变量。

le = LabelEncoder()
for col in columns:if data[col].dtype == object:data[col] = le.fit_transform(data[col])print(data.head())
# 计算斯皮尔曼秩相关系数
for i in columns:correlation, p_value = spearmanr(data[i],data['0be1dad'])print("变量"+i+"与变量0be1dad之间的斯皮尔曼秩相关系数",correlation)print("p值",p_value)

 变量Gender与变量0be1dad之间的斯皮尔曼秩相关系数 0.014658850601937863
p值 0.03468814382118435
变量Age与变量0be1dad之间的斯皮尔曼秩相关系数 0.2859097257571513
p值 0.0
变量Height与变量0be1dad之间的斯皮尔曼秩相关系数 0.0549005296297657
p值 2.465342094292171e-15
变量Weight与变量0be1dad之间的斯皮尔曼秩相关系数 0.40279883619705414
p值 0.0
变量family_history_with_overweight与变量0be1dad之间的斯皮尔曼秩相关系数 0.2863193269279612
p值 0.0
变量FAVC与变量0be1dad之间的斯皮尔曼秩相关系数 0.015215732134776854
p值 0.028363458172357518
变量FCVC与变量0be1dad之间的斯皮尔曼秩相关系数 0.06676140706468933
p值 6.036927997520049e-22
变量NCP与变量0be1dad之间的斯皮尔曼秩相关系数 -0.13504675225801754
p值 4.508309933218467e-85
变量CAEC与变量0be1dad之间的斯皮尔曼秩相关系数 0.24046194989929878
p值 8.204819691934083e-271
变量SMOKE与变量0be1dad之间的斯皮尔曼秩相关系数 -0.011154010915639693
p值 0.10805818554147692
变量CH2O与变量0be1dad之间的斯皮尔曼秩相关系数 0.17622305494933643
p值 2.0464562531581523e-144
变量SCC与变量0be1dad之间的斯皮尔曼秩相关系数 -0.0455429294387019
p值 5.214791611958936e-11
变量FAF与变量0be1dad之间的斯皮尔曼秩相关系数 -0.09845958938837115
p值 6.944014419452994e-46
变量TUE与变量0be1dad之间的斯皮尔曼秩相关系数 -0.05047637969363524
p值 3.422014415895151e-13
变量CALC与变量0be1dad之间的斯皮尔曼秩相关系数 0.12321280727640145
p值 5.040375691868427e-71
变量MTRANS与变量0be1dad之间的斯皮尔曼秩相关系数 -0.0721085385266057
p值 2.4264780504638294e-25

斯皮尔曼秩相关系数接近1表示变量之间呈现正相关,接近-1表示变量之间呈现负相关,接近0表示变量之间无相关性。

p值是用来判断统计显著性的指标,它告诉我们观察到的相关系数是否不太可能是由随机因素造成的。如果p值小于显著性水平(如0.05),则可以拒绝原假设,即两个变量不相关,从而认为斯皮尔曼相关系数具有统计学意义。这里面的数据2.4264780504638294e-25表示科学计数法2.4264*10的负25次方。

上次周挑战由于使用了标签编码来进行处理数据,因此,这周挑战使用独热编码来处理数据

scaler = StandardScaler()
for col in columns:if data[col].dtype != object:data[col] = scaler.fit_transform(data[col].values.reshape(-1,1))encode = OneHotEncoder(sparse_output=False)
for col in columns:if data[col].dtype == object:encode_data = encode.fit_transform(data[[col]])data.drop(col,axis=1,inplace=True)encode_columns = [f"{col}_{i}"for i in range(encode_data.shape[1])]data = pd.concat([data,pd.DataFrame(encode_data,columns=encode_columns)],axis=1)

由于后面模型使用了逻辑回归,因此我们要对数据进行标准化处理。

 

# 选择一个常用的机器学习算法来构建肥胖风险预测模型。考虑到这是一个分类问题,我们可以选择以下算法之一:
#
# 逻辑回归(Logistic Regression):这是一种广泛用于分类问题的算法,特别是当特征数量不是很大时。
# 决策树(Decision Tree):这是一种基于树结构的模型,易于理解和解释。
# 随机森林(Random Forest):这是一种集成算法,通过组合多个决策树来提高性能。
# 支持向量机(Support Vector Machine):这是一种强大的分类算法,特别是在特征维度较高时。
# 所以我们选择将四种模型全部输出来综合判断哪个模型更好,为了方便所以我所有模型全部使用默认参数,涉及后期的模型调优我们可以指定模型参数
Dtree = DecisionTreeClassifier()
Rtree = RandomForestClassifier()
log = LogisticRegression(max_iter=1000)
svm = SVC()models = [Dtree,Rtree,log,svm]X = data.drop('0be1dad',axis=1)
y = data['0be1dad']X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=42)for model in models:model.fit(X_train,y_train)y_pred = model.predict(X_test)print(model.__class__.__name__+"模型的的分类报告:")print(classification_report(y_test,y_pred))print("该模型的分数" ,+ model.score(X_test,y_test))# 经过比较,我们选择随机森林来进行特征重要性分析
Rtree.fit(X_train,y_train)
importance = Rtree.feature_importances_
feature = X.columns
sort_index = importance.argsort()plt.figure()
plt.barh(range(len(sort_index)),importance[sort_index])
plt.yticks(range(len(sort_index)),[feature[i] for i in sort_index])
plt.xlabel("特征重要性")
plt.title("特征重要性")plt.show()

DecisionTreeClassifier模型的的分类报告:
                     precision    recall  f1-score   support

       0rmal_Weight       0.79      0.79      0.79       907
Insufficient_Weight       0.91      0.89      0.90       755
     Obesity_Type_I       0.80      0.79      0.80       858
    Obesity_Type_II       0.95      0.95      0.95      1005
   Obesity_Type_III       0.99      0.99      0.99      1207
 Overweight_Level_I       0.65      0.70      0.67       733
Overweight_Level_II       0.71      0.67      0.69       763

           accuracy                           0.84      6228
          macro avg       0.83      0.83      0.83      6228
       weighted avg       0.84      0.84      0.84      6228

该模型的分数 0.8432883750802826
RandomForestClassifier模型的的分类报告:
                     precision    recall  f1-score   support

       0rmal_Weight       0.82      0.89      0.85       907
Insufficient_Weight       0.94      0.90      0.92       755
     Obesity_Type_I       0.88      0.86      0.87       858
    Obesity_Type_II       0.97      0.98      0.98      1005
   Obesity_Type_III       1.00      1.00      1.00      1207
 Overweight_Level_I       0.77      0.74      0.75       733
Overweight_Level_II       0.79      0.78      0.79       763

           accuracy                           0.89      6228
          macro avg       0.88      0.88      0.88      6228
       weighted avg       0.89      0.89      0.89      6228

该模型的分数 0.8909762363519589
LogisticRegression模型的的分类报告:
                     precision    recall  f1-score   support

       0rmal_Weight       0.84      0.80      0.82       907
Insufficient_Weight       0.88      0.92      0.90       755
     Obesity_Type_I       0.82      0.82      0.82       858
    Obesity_Type_II       0.94      0.98      0.96      1005
   Obesity_Type_III       0.99      1.00      1.00      1207
 Overweight_Level_I       0.73      0.73      0.73       733
Overweight_Level_II       0.72      0.68      0.70       763

           accuracy                           0.86      6228
          macro avg       0.85      0.85      0.85      6228
       weighted avg       0.86      0.86      0.86      6228

该模型的分数 0.8625561978163134
SVC模型的的分类报告:
                     precision    recall  f1-score   support

       0rmal_Weight       0.81      0.82      0.82       907
Insufficient_Weight       0.91      0.90      0.91       755
     Obesity_Type_I       0.85      0.83      0.84       858
    Obesity_Type_II       0.95      0.98      0.96      1005
   Obesity_Type_III       1.00      1.00      1.00      1207
 Overweight_Level_I       0.68      0.72      0.70       733
Overweight_Level_II       0.74      0.71      0.72       763

           accuracy                           0.86      6228
          macro avg       0.85      0.85      0.85      6228
       weighted avg       0.86      0.86      0.86      6228

该模型的分数 0.8638407193320488

目前可暂时得出如下结论:

1、FCVC(是否频繁食用高热量食物),Age(年龄),Weight(体重),Height(身高), 对肥胖风险影响较大;
2、交通方式对肥胖风险影响几乎没有。

 

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

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

相关文章

实现点击用户头像或者id与其用户进行聊天(vue+springboot+WebSocket)

用户点击id直接与另一位用户聊天 前端如此&#xff1a; <template><!-- 消息盒子 --><div class"content-box" :style"contentWidth"><!-- 头像&#xff0c;用户名 --><div class"content-box-top box--flex">&l…

软考115-上午题-【计算机网络】-HTML

一、真题 真题1&#xff1a; alink属性表示一个链接的当前激活状态的颜色&#xff0c;即用户正在点击或已经点击的链接的颜色。 vlink属性用于设定已访问过的超链接文本的显示颜色&#xff0c;即用户已经点击过并且已经访问过的链接的颜色。 真题2&#xff1a; <table bord…

【RISC-V 指令集】RISC-V 向量V扩展指令集介绍(七)- 向量算术指令格式

1. 引言 以下是《riscv-v-spec-1.0.pdf》文档的关键内容&#xff1a; 这是一份关于向量扩展的详细技术文档&#xff0c;内容覆盖了向量指令集的多个关键方面&#xff0c;如向量寄存器状态映射、向量指令格式、向量加载和存储操作、向量内存对齐约束、向量内存一致性模型、向量…

python爬虫学习第十五天-------ajax的get和post请求

嗨嗨嗨&#xff01;兄弟姐妹大家好哇&#xff01;今天我们来学习ajax的get和post请求 一、了解ajax Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;是一种在 Web 开发中用于创建交互式网页应用程序的技术。通过 Ajax&#xff0c;网页可以在不重新加载整个页面…

算法基础课-搜索与图论

DFS 题目链接&#xff1a;842. 排列数字 - AcWing题库 思路&#xff1a;写的很好的题解AcWing 842. 排列数字--深度优先遍历代码注释 - AcWing #include<bits/stdc.h>using namespace std; int n; int st[10]; vector<int> a; void dfs(){if(a.size() n){for(in…

安全的通信协议HTTPS被攻击改采用什么防护方案

随着互联网的发展&#xff0c;保护用户在网上交换的敏感信息的安全性变得至关重要。HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;作为一种安全的通信协议&#xff0c;通过加密数据传输&#xff0c;保护用户的隐私和数据安全。然而&#xff0c;尽管HTTPS提…

Kafka基础 (上)

前言 各位清明 快乐呀,近期博主也是学习了一下kafka,以下是博主的一些学习笔记,希望对你有所帮助 前置知识 线程中的数据交互以及进程中的数据交互 我们知道线程之间可以使用堆空间进行数据交互的 但是如果发送方和接收方处理数据的效率差距过大,这里就会造成消息积压的问题,怎…

闪站侠洗护管理系统,洗衣洗鞋小程序软件定制,干洗连锁店软件系统搭建;

闪站侠洗护管理系统&#xff0c;洗衣洗鞋小程序软件定制&#xff0c;干洗连锁店软件系统搭建&#xff1b; 为了让每一个洗衣洗鞋工厂与门店的连接更加高效便捷&#xff0c;送洗流程更加简单轻松&#xff0c;拽牛科技倾心打造洗衣洗鞋管理软件。我们的目标是通过高效和优质的服务…

Prometheus+grafana环境搭建Docker服务(docker+二进制两种方式安装)(八)

由于所有组件写一篇幅过长&#xff0c;所以每个组件分一篇方便查看&#xff0c;前七篇链接如下 Prometheusgrafana环境搭建方法及流程两种方式(docker和源码包)(一)-CSDN博客 Prometheusgrafana环境搭建rabbitmq(docker二进制两种方式安装)(二)-CSDN博客 Prometheusgrafana环…

「 典型安全漏洞系列 」12.OAuth 2.0身份验证漏洞

在浏览网页时&#xff0c;你肯定会遇到允许你使用社交媒体帐户登录的网站。此功能一般是使用流行的OAuth 2.0框架构建的。本文主要介绍如何识别和利用OAuth 2.0身份验证机制中发现的一些关键漏洞。 1. OAuth产生背景 为了更好的理解OAuth&#xff0c;我们假设有如下场景&#…

【vite】-【vite介绍】-【vite的基础应用】-【vite的高级应用】-【

目录 vite介绍vite的基础应用vite创建项目vite创建vue3项目vite创建vue2项目vite创建react项目 vite中使用css的各种功能vite中使用tsvite中处理静态资源的方法vite集成eslint和prettiervite中的env环境变量 vite的高级应用 vite介绍 一、特点&#xff1a; 开发时效率极高开箱…

深入浅出 -- 系统架构之负载均衡Nginx动静分离

一、Nginx动静分离 动静分离应该是听的次数较多的性能优化方案&#xff0c;那先思考一个问题&#xff1a;为什么需要做动静分离呢&#xff1f;它带来的好处是什么&#xff1f; 其实这个问题也并不难回答&#xff0c;当你搞懂了网站的本质后&#xff0c;自然就理解了动静分离的重…