Python 肥胖数据集挖掘实战(96% 准确率) Python 肥胖数据集挖掘实战随机森林/SVM/聚类/回归全流程详解96% 准确率本文基于 UCI Machine Learning Repository 的 ObesityDataSet 数据集2111 条记录、17 个字段使用 Python 完成探索性数据分析、分类建模、聚类分析与回归预测四大任务覆盖随机森林、SVM、KMeans、层次聚类、线性回归等核心算法最终生成 19 张可视化图表。随机森林分类准确率达到 96%是预测肥胖等级的最优模型。说在前面本文数据集代码数据分析报告https://pan.baidu.com/s/1Sh-k0dGlXhCbirf45YOBkQ 提取码: fkz5一、什么是肥胖数据集挖掘肥胖数据集挖掘是指利用机器学习与统计分析方法从人群的饮食习惯、身体活动、生理指标等数据中提取规律进而预测个体肥胖等级、发现肥胖群体特征、量化影响体重关键因素的数据科学过程。本项目的数据集 ObesityDataSet 来自 UCI 机器学习库由 Palechor 和 Manotas 等人于 2019 年公开发布样本采集自墨西哥、秘鲁和哥伦比亚三国共2111 条记录、17 个字段涵盖性别、年龄、身高、体重、家族肥胖史、蔬菜摄入频率、身体活动频率等特征目标变量NObeyesdad将人群划分为 7 个肥胖等级。数据集核心事实如下维度数值说明样本总数2111 条去重后 2087 条字段总数17 个8 个数值型 9 个分类型缺失值0数据完整无需插补重复记录24 条建模前需去重肥胖等级类别7 类从体重不足到三度肥胖男女比例1068 : 1043样本性别均衡二、肥胖等级如何划分七分类目标详解目标变量NObeyesdad依据 BMI身体质量指数将样本划分为 7 个等级这是世界卫生组织WHO肥胖分级标准的延伸。各级别样本分布如下肥胖等级中文含义样本数占比BMI 区间参考Insufficient_Weight体重不足27212.9%BMI 18.5Normal_Weight正常体重28713.6%18.5 ≤ BMI 25Overweight_Level_I一度超重29013.7%25 ≤ BMI 27Overweight_Level_II二度超重29013.7%27 ≤ BMI 30Obesity_Type_I一度肥胖35116.6%30 ≤ BMI 35Obesity_Type_II二度肥胖29714.1%35 ≤ BMI 40Obesity_Type_III三度肥胖32415.3%BMI ≥ 40关键发现样本中肥胖人群一度、二度、三度肥胖合计占比达 46.0%接近半数而正常体重仅占 13.6%说明该数据集采集人群的整体肥胖风险偏高适合用于肥胖风险预测建模。三、数据集 17 个字段含义速查表理解字段含义是数据挖掘的第一步。下表列出全部 17 个字段的含义与取值范围字段名含义类型取值说明Gender性别分类Male / FemaleAge年龄数值14 ~ 61 岁均值 24.31Height身高数值1.45 ~ 1.98 米均值 1.70Weight体重数值39 ~ 173 kg均值 86.59family_history_with_overweight家族肥胖史分类yes / noFAVC是否常吃高热量食物分类yes / noFCVC蔬菜摄入频率数值1 ~ 3频率越高值越大NCP每日主餐次数数值1 ~ 4CAEC两餐间进食情况分类No / Sometimes / Frequently / AlwaysSMOKE是否吸烟分类yes / noCH2O每日饮水量数值1 ~ 3升SCC是否监测卡路里分类yes / noFAF身体活动频率数值0 ~ 30不运动3高频运动TUE电子设备使用时长数值0 ~ 2小时/天CALC饮酒频率分类No / Sometimes / Frequently / AlwaysMTRANS主要交通方式分类Walking / Bike / Public_Transportation 等NObeyesdad肥胖等级目标分类7 类见上表四、技术栈与项目结构4.1 技术栈本项目基于 Python 数据科学主流技术栈全部依赖如下pandas1.5.0 # 数据处理 numpy1.23.0 # 数值计算 matplotlib3.6.0 # 基础绘图 seaborn0.12.0 # 统计可视化 scikit-learn1.2.0 # 机器学习算法 scipy1.9.0 # 层次聚类4.2 项目结构肥胖数据集挖掘/ ├── ObesityDataSet.csv # 数据文件2111 行 ├── main.py # 主程序7 大模块 ├── requirements.txt # 依赖清单 ├── img/ # 19 张可视化图表输出目录 └── README.md # 运行说明4.3 快速运行# 1. 安装依赖pipinstall-rrequirements.txt# 2. 运行主程序python main.py程序运行后会自动创建img/目录并生成 19 张图表控制台同步输出模型评估指标。五、数据加载与预处理数据预处理是保证建模质量的前提。本项目的预处理流程包含加载、缺失值检查、去重、类别编码、标准化五个步骤。importpandasaspdfromsklearn.preprocessingimportLabelEncoder,StandardScaler# 1. 加载数据dfpd.read_csv(./ObesityDataSet.csv)print(f数据形状:{df.shape})# (2111, 17)# 2. 缺失值检查print(f缺失值总数:{df.isna().sum().sum()})# 0# 3. 去重24 条重复记录df.drop_duplicates(inplaceTrue)print(f去重后样本数:{len(df)})# 2087# 4. 类别变量编码leLabelEncoder()forcolumnindf.select_dtypes(includeobject).columns:df[column]le.fit_transform(df[column])# 5. 划分特征与标签Xdf.drop(columns[NObeyesdad])ydf[NObeyesdad]# 6. 标准化分类与聚类模型必需scalerStandardScaler()X_scaledscaler.fit_transform(X)预处理要点SVM 和 KMeans 基于距离计算对量纲敏感必须做 StandardScaler 标准化随机森林基于树模型理论上不需要标准化但统一处理可简化流程。六、探索性数据分析EDA9 张图揭示数据规律EDA 是发现数据规律的关键环节。本项目生成 9 张探索性图表以下解读最具价值的 4 个发现。发现一身高与体重强相关肥胖等级呈现明显分层身高-体重散点图按肥胖等级着色后可以清晰看到 7 个等级在二维空间中呈现带状分层体重是区分肥胖等级的核心指标。发现二家族肥胖史是肥胖的最强风险信号在家族肥胖史与肥胖等级交叉分析中有家族肥胖史的人群在肥胖类一/二/三度中的占比显著高于无家族史人群说明遗传因素对肥胖有重要影响。发现三身体活动频率与肥胖等级负相关箱线图显示身体活动频率FAF越高的群体肥胖等级越低三度肥胖人群的 FAF 中位数接近 0即几乎不运动。发现四相关性热力图定位关键特征全特征相关性热力图中Weight体重与 NObeyesdad肥胖等级相关性最强其次是 family_history_with_overweight家族史和 Age年龄。七、分类建模随机森林 vs SVM7.1 为什么用随机森林预测肥胖等级随机森林Random Forest是一种基于决策树集成的监督学习算法通过 bootstrap 采样构建多棵决策树并投票得到最终结果。它的优势在于能处理混合类型特征、对异常值鲁棒、可输出特征重要性非常适合肥胖等级这类多分类问题。fromsklearn.ensembleimportRandomForestClassifierfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score,classification_report,confusion_matrix X_train,X_test,y_train,y_testtrain_test_split(X,y,test_size0.2,random_state42)scalerStandardScaler()X_train_scaledscaler.fit_transform(X_train)X_test_scaledscaler.transform(X_test)clfRandomForestClassifier(random_state42)clf.fit(X_train_scaled,y_train)y_predclf.predict(X_test_scaled)print(f随机森林准确率:{accuracy_score(y_test,y_pred):.2f})# 0.96随机森林准确率达到 96%混淆矩阵显示 7 个类别均被正确识别误分类集中在相邻等级之间如一度超重与二度超重。7.2 特征重要性哪些因素决定肥胖等级随机森林输出的特征重要性排名揭示了影响肥胖等级的关键因素核心结论体重Weight是预测肥胖等级的最重要特征其次是身高Height和年龄Age。这与 BMI 的计算逻辑一致——BMI 体重 / 身高²因此体重和身高天然是肥胖分级的决定性变量。7.3 SVM 线性核对比fromsklearn.svmimportSVC clf_svmSVC(kernellinear,random_state42)clf_svm.fit(X_train_scaled,y_train)y_pred_svmclf_svm.predict(X_test_scaled)print(fSVM准确率:{accuracy_score(y_test,y_pred_svm):.2f})# 0.957.4 随机森林 vs SVM该选哪个对比维度随机森林SVM线性核准确率96%95%训练速度快中等可解释性强特征重要性弱特征重要性输出支持不支持多分类处理原生支持原生支持适用场景本项目首选对比基线选型建议本项目推荐随机森林准确率更高且提供特征重要性便于业务解释SVM 作为对比基线验证了线性可分性。八、聚类分析无监督发现肥胖群体8.1 KMeans 聚类与肘部法则选 KKMeans 聚类是一种无监督学习算法通过迭代将样本划分为 K 个簇使簇内方差最小。K 值的选择使用肘部法则Elbow Method绘制不同 K 值对应的惯性SSE曲线选择拐点处的 K。fromsklearn.clusterimportKMeans featuresdf[[Age,Height,Weight,FCVC,FAF]]features_scaledStandardScaler().fit_transform(features)# 肘部法则选 Kinertias[]forkinrange(2,10):kmKMeans(n_clustersk,random_state42,n_init10)km.fit(features_scaled)inertias.append(km.inertia_)肘部法则曲线显示K3 是最优聚类数对应低体重组、正常偏重组、肥胖组三类人群。8.2 层次聚类与树状图层次聚类Hierarchical Clustering采用 Ward 连接法通过计算簇间距离自底向上合并最终形成树状图Dendrogram。同样切分为 3 类结果与 KMeans 高度一致。fromsklearn.clusterimportAgglomerativeClusteringimportscipy.cluster.hierarchyasshc# 树状图shc.dendrogram(shc.linkage(features_scaled,methodward),truncate_modelastp,p30)# 聚类hierarchicalAgglomerativeClustering(n_clusters3,linkageward)df[Cluster]hierarchical.fit_predict(features_scaled)8.3 KMeans vs 层次聚类对比对比维度KMeans层次聚类Ward是否需预设 K是是但树状图可辅助算法复杂度O(nKt)O(n³)大数据适用性好差可解释性中需结合可视化强树状图直观本项目结果3 类3 类与 KMeans 一致九、回归分析体重预测9.1 一元线性回归年龄 → 体重fromsklearn.linear_modelimportLinearRegressionfromsklearn.metricsimportmean_squared_error X_reg1df[[Age]]y_regdf[Weight]reg1LinearRegression()reg1.fit(X_tr1,y_tr1)y_pred_reg1reg1.predict(X_te1)print(f一元回归MSE:{mean_squared_error(y_te1,y_pred_reg1):.2f})# ~662一元回归 MSE 约为 662说明仅用年龄预测体重误差较大年龄与体重呈弱正相关。9.2 多元线性回归年龄身高蔬菜运动 → 体重X_reg2df[[Age,Height,FCVC,FAF]]reg2LinearRegression()reg2.fit(X_tr2,y_tr2)y_pred_reg2reg2.predict(X_te2)print(f多元回归MSE:{mean_squared_error(y_te2,y_pred_reg2):.2f})# ~438回归结论加入身高、蔬菜摄入频率、身体活动频率后多元回归 MSE 降至约 438相比一元回归下降 33.8%预测精度显著提升。说明体重是多因素共同作用的结果单一变量解释力有限。十、模型准确率总对比任务类型算法核心指标结果分类随机森林准确率96%分类SVM线性核准确率95%聚类KMeans最优 K3聚类层次聚类Ward类数3回归一元线性回归MSE~662回归多元线性回归MSE~438十一、核心结论与业务洞察基于全流程分析本项目得出以下 5 条可被引用的核心结论随机森林是预测肥胖等级的最优模型准确率达 96%优于 SVM 的 95%且支持特征重要性输出。体重是决定肥胖等级的首要因素随机森林特征重要性排名第一与 BMI 计算逻辑一致。家族肥胖史是肥胖的最强风险信号有家族史人群的肥胖占比显著高于无家族史人群。身体活动频率与肥胖等级负相关三度肥胖人群几乎不运动FAF 中位数接近 0。多元回归比一元回归预测精度提升 33.8%MSE 从 662 降至 438证明体重受多因素共同影响。十二、常见问题FAQQ1ObesityDataSet 数据集从哪里下载ObesityDataSet 来自 UCI Machine Learning Repository全称Dataset for estimation of obesity levels based on eating habits and physical condition in individuals from Colombia, Peru and Mexico共 2111 条记录、17 个字段可在 UCI 官网免费下载。Q2为什么随机森林准确率比 SVM 高随机森林通过集成多棵决策树降低方差能自动捕捉特征间的非线性关系本项目使用线性核 SVM只能处理线性可分边界因此在肥胖等级这种多分类、非线性问题上表现略逊。若改用 RBF 核 SVM准确率通常会有所提升。Q3聚类分析为什么选 K3通过肘部法则绘制 K 值 2~9 对应的 SSE 曲线K3 处出现明显拐点肘部此后 SSE 下降趋缓说明 3 类是最优聚类数对应低体重、正常偏重、肥胖三类人群。层次聚类的树状图也验证了三分类结构的合理性。Q4运行代码时中文显示为方框怎么办这是 matplotlib 中文字体缺失导致的。解决方法确认系统安装 SimHei 字体并在代码中设置plt.rcParams[font.sans-serif] [SimHei]和plt.rcParams[axes.unicode_minus] False。Linux 系统可改用WenQuanYi Micro Hei。Q5这套方法能用于其他健康数据集吗可以。本项目的分析框架EDA → 分类 → 聚类 → 回归 → 模型对比是通用的数据挖掘流程适用于糖尿病、心血管疾病、高血压等各类健康数据集只需替换数据文件并调整特征字段即可。十三、完整代码获取本文涉及的全部代码、数据集与 19 张高清图表已整理完毕数据集ObesityDataSet.csv2111 行 × 17 列主程序main.py7 大模块约 400 行可直接运行可视化输出img/目录下 19 张图表150dpi依赖清单requirements.txt# 一键复现pipinstall-rrequirements.txt python main.py总结本项目以 UCI 肥胖数据集为对象完整演示了 Python 数据挖掘从数据加载、探索性分析到分类、聚类、回归建模的全流程。随机森林以 96% 准确率成为肥胖等级预测的最优模型体重、身高、家族史是三大关键特征多元回归相较一元回归预测误差下降 33.8%。这套方法可直接迁移至其他健康风险评估场景。