数据分析实战(基础篇):从数据探索到模型解释

news2024/9/24 9:21:41

前言

  • 本文着重介绍数据分析实战的基础知识和技巧,探索从数据探索到建模再到模型解释的完整过程
  • 内容包含数据探索、模型建立、调参技巧、SHAP模型解释
  • 数据来源于kaggle平台,crab age prediction数据集,数据详情

数据说明

数据背景

螃蟹味道鲜美,世界上许多国家每年都会进口大量螃蟹供消费。螃蟹养殖的主要优点是劳动力成本很低,生产成本相对较低,而且生长速度很快。商业螃蟹养殖业正在发展沿海地区人民的生活方式。通过适当的照顾和管理,我们从螃蟹养殖业中可以获得比养虾业更多的收入。您可以在两个系统中饲养青蟹。发展农业和育肥系统。

数据价值

对于商业蟹农来说,了解螃蟹的正确年龄有助于他们决定是否以及何时收获螃蟹。超过一定年龄后,螃蟹的物理特性的增长可以忽略不计,因此,把握收获时间以降低成本并增加利润非常重要。该数据集的目标是:

  • 探索性数据分析 - 了解不同的身体特征如何随年龄变化。
  • 特征工程 - 使用给定数据点的组合定义新特征,以帮助提高模型准确性。
  • 回归模型 - 构建回归模型来预测螃蟹的年龄。

数据字段

  • Sex:螃蟹的性别——雄性(M)、雌性(F)和不确定(I)。
  • Length:螃蟹的长度(以英尺为单位;1 英尺 = 30.48 厘米)
  • Diameter:螃蟹的直径(以英尺为单位;1 英尺 = 30.48 厘米)
  • Height:螃蟹的高度(以英尺为单位;1 英尺 = 30.48 厘米)
  • Weight:螃蟹的重量(以盎司为单位;1 磅 = 16 盎司)
  • Shucked Weight:不含壳的重量(以盎司为单位;1 磅 = 16 盎司)
  • Viscera Weight:身体深处腹部器官的重量(以盎司为单位;1 磅 = 16 盎司)
  • Shell Weight:外壳重量(盎司;1 磅 = 16 盎司)
  • Age:螃蟹的年龄(月)

依赖包

  • pandas:读取数据,基础包
  • ydata-profiling:快速数据探索包,Github项目地址,官方文档
  • sklearn:经典的机器学习模型包,这里不过多介绍
  • shap:SHAP(SHapley Additive exPlanations)是一种博弈论方法,用于解释任何机器学习模型的输出。它将最优信用分配与局部解释联系起来,使用博弈论中的经典Shapley值及其相关扩展(有关详细信息和引文,请参阅论文)。
  • 下面的分析都基于以上包的支持,请提前使用pip install进行安装,如果是在Jupyter Notebook中使用,请使用```!pip install``。

导入必要包

import numpy as np
import pandas as pd
from plotnine import*
import seaborn as sns
from scipy import stats

import matplotlib as mpl
import matplotlib.pyplot as plt
#中文显示问题
plt.rcParams['font.sans-serif']=['SimHei']
plt.rcParams['axes.unicode_minus'] = False

# notebook嵌入图片
%matplotlib inline
# 提高分辨率
%config InlineBackend.figure_format='retina'

from ydata_profiling import ProfileReport

import shap

# 忽略警告
import warnings
warnings.filterwarnings('ignore')

导入数据

df = pd.read_csv('/kaggle/input/crab-age-prediction/CrabAgePrediction.csv')
df.head()

输出

Sex	Length	Diameter	Height	Weight	Shucked Weight	Viscera Weight	Shell Weight	Age
0	F	1.4375	1.1750	0.4125	24.635715	12.332033	5.584852	6.747181	9
1	M	0.8875	0.6500	0.2125	5.400580	2.296310	1.374951	1.559222	6
2	I	1.0375	0.7750	0.2500	7.952035	3.231843	1.601747	2.764076	6
3	F	1.1750	0.8875	0.2500	13.480187	4.748541	2.282135	5.244657	10
4	I	0.8875	0.6625	0.2125	6.903103	3.458639	1.488349	1.700970	6

数据分析

profile = ProfileReport(df, title="Crab data report")
profile.to_notebook_iframe()
  • 由于CSDN无法内嵌html文件,这里只能将完整的数据报告拆分,分开讲解。

概述

在这里插入图片描述

  • 从上图中可获知以下信息:
    • 数据一共包含9个特征
    • 数据一共有3893个样本
    • 数据样本没有任何缺失与重复
    • 分类变量有1个,其他8个为数值变量
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征LengthDiameter有较强的相关性
    • 特征LengthHeight有较强的相关性
    • 特征LengthWeight有较强的相关性
    • 特征LengthShucked Weight有较强的相关性
    • 特征LengthViscera Weight有较强的相关性
    • 特征LengthShell Weight有较强的相关性
    • 特征LengthAge有较强的相关性

变量

在这里插入图片描述

  • 从上图中可获知以下信息:
    • 特征Sex为类别变量,一共有3类
    • 其中类别M的样本有1435条、类别I的样本有1233条、类别F的样本有1225条
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Length为数值变量,一共出现了134个值,差异比例为3.4%
    • 根据直方图可以看到数据分布呈一定右偏
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Diameter为数值变量,一共出现了111个值,差异比例为2.9%
    • 根据直方图可以看到数据分布呈一定右偏
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Height为数值变量,一共出现了51个值,差异比例为1.3%
    • 根据直方图可以看到数据分布呈正态分布,但最大值为2.825,有点异常,可能要考虑剔除。
    • 0值有2个,占总体样本的0.1%,根据经验长度不可能为0,所以这2个样本可能为异常样本,需要剔除。
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Weight为数值变量,一共出现了2343个值,差异比例为60.2%
    • 根据直方图可以看到数据分布呈一定左偏,60以后的值需要考虑是否为潜在异常值,并对其进行相应处理
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Shucked Weight为数值变量,一共出现了1482个值,差异比例为38.1%
    • 根据直方图可以看到数据分布呈一定左偏,30以后的值需要考虑是否为潜在异常值,并对其进行相应处理
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Viscera Weight为数值变量,一共出现了867个值,差异比例为22.3%
    • 根据直方图可以看到数据分布呈一定左偏,15以后的值需要考虑是否为潜在异常值,并对其进行相应处理
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Shell Weight为数值变量,一共出现了907个值,差异比例为23.3%
    • 根据直方图可以看到数据分布呈一定左偏,20以后的值需要考虑是否为潜在异常值,并对其进行相应处理
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等
      在这里插入图片描述
  • 从上图中可获知以下信息:
    • 特征Age为数值变量,一共出现了28个值,差异比例为0.7%
    • 根据直方图可以看到数据分布基本呈正态分布,25以后的值需要考虑是否为潜在异常值,并对其进行相应处理
    • 获知该特征的各类统计特征,如最大最小值、平均值、四分位数等等

交互作用图

  • 这里可以选择不同的两个变量,因为篇幅有限,这里只展示纵轴为Weight,横轴为Age的交互图。
    在这里插入图片描述

相关性图

在这里插入图片描述

  • 上面图中展现的高相关性信息在概述阶段已经说明了,这里就不再赘述了。

数据处理

  • 根据上述数据分析,对数据进行相应处理
  • 将特征Height中为0的样本进行剔除
  • 因为Sex无大小关系,所以对其进行独热编码,使用df = pd.get_dummies(df,columns=["Sex"])
  • 使用sklearn中的隔离森林算法剔除潜在异常值,异常值占比为0.05(经验数值)
  • 将数据进行标准化(zscore)变换,由于数据量较小,训练集为0.9,测试集为0.1,使用10折交叉检验平均MSE作为评估标准
  • 以Age为因变量,其余特征为自变量,构建回归模型

建立模型与调参

  • 使用sklearn构建多种回归模型,如gbrcatboostlightgbm
IDModelMAEMSERMSER2RMSLEMAPETT (Sec)
gbrGradient Boosting Regressor1.50194.48892.11690.55300.17270.15010.3410
catboostCatBoost Regressor1.50824.53342.12770.54850.17290.15052.6590
lightgbmLight Gradient Boosting Machine1.52404.62802.15040.53890.17510.15160.4320
rfRandom Forest Regressor1.53384.65512.15610.53630.17620.15350.8190
etExtra Trees Regressor1.54944.74622.17720.52670.17800.15520.4890
ridgeRidge Regression1.57714.84772.19790.51660.18240.15960.0430
lrLinear Regression1.57724.84792.19800.51650.18220.15960.4730
larLeast Angle Regression1.57724.84792.19800.51650.18220.15960.0470
brBayesian Ridge1.57714.84822.19800.51660.18240.15960.0440
huberHuber Regressor1.54354.91302.21360.51050.18140.15030.0620
xgboostExtreme Gradient Boosting1.58845.03902.24290.49720.18220.15810.2910
knnK Neighbors Regressor1.61475.16072.27050.48560.18530.15990.0500
ompOrthogonal Matching Pursuit1.81576.11712.47150.39170.20840.18670.0400
enElastic Net1.88556.68652.58330.33670.22120.20070.0440
lassoLasso Regression1.95367.12382.66630.29370.23600.21540.0440
llarLasso Least Angle Regression1.95367.12382.66630.29370.23600.21540.0420
adaAdaBoost Regressor2.24637.23862.68730.27670.23250.24790.1820
dtDecision Tree Regressor2.06268.93082.98650.10790.23890.20350.0530
parPassive Aggressive Regressor2.29119.00012.97840.08970.26360.24010.0480
dummyDummy Regressor2.336910.09903.1743-0.00060.28710.26720.0990
  • 可以发现,gbr模型的MSE最低,效果最好。使用随机搜索,调整参数,迭代20次,最佳模型10折交叉检验结果。
FoldMAEMSERMSER2RMSLEMAPE
01.52674.70452.16900.55360.17190.1519
11.46464.32812.08040.56950.16740.1447
21.50534.37462.09150.55340.17570.1562
31.49954.55262.13370.54660.17310.1512
41.57984.64052.15420.56270.18420.1652
51.38793.70921.92590.60790.16540.1462
61.56134.80662.19240.53260.17440.1508
71.47394.42132.10270.58990.16830.1440
81.48734.55542.13430.60520.17160.1502
91.46544.07502.01870.47920.16580.1471
Mean1.49524.41682.10030.56010.17180.1508
Std0.05150.30820.07480.03590.00530.0060
  • 最优参数如下:
Paramnums
alpha0.9
ccp_alpha0.0
criterionfriedman_mse
initNone
learning_rate0.1
losssquared_error
max_depth3
max_featuresNone
max_leaf_nodesNone
min_impurity_decrease0.0
min_samples_leaf1
min_samples_split2
min_weight_fraction_leaf0.0
n_estimators100
n_iter_no_changeNone
random_state2023
subsample1.0
tol0.0001
validation_fraction0.1
verbose0
warm_startFalse

模型分析

  • 对模型进行分析,可视化一些指标

模型残差图

请添加图片描述

  • 模型在训练集与测试集上 R 2 R^2 R2相差不大,说明未发生过拟合现象
  • 残差均匀分布在0线两侧,且呈现随机性
  • 模型在训练集与测试集上残差分布基本一致

模型学习曲线

请添加图片描述

  • 通过学习曲线我们可以判断模型是否产生了过拟合现象,可以看到上图中训练集和验证集都在往中间数值收敛,说明模型未参生过拟合现象。

模型解释

  • 这一模块要用到SHAP包了,使用Shapley值评估特征对模型的影响。

力图

  • 我们可以取出一个样本,然后可视化其预测过程,代码如下
# 取训练数据
X = s.get_config('X_train')
explainer = shap.TreeExplainer(model)
shap_values = explainer.shap_values(X)
shap.force_plot(explainer.expected_value, shap_values[0,:], X.iloc[0,:])

在这里插入图片描述

  • 红色的代表特征贡献的正方向力(将预测推高),蓝色的表示特征贡献的负方向的力(将预测推低)

部分依赖图

  • 为了解单个特征如何影响模型的输出以及特征间的交互作用,我们可以绘制部分依赖图
  • 部分预测图遵照下列规则
    • 每个点都是数据集中的一个样本
    • x轴是特征的值(来自X矩阵,存储在shap_values.data中)
    • y轴是该特征的SHAP值(存储在shap_values.values中)。它表示了该特征的值会在多大程度上改变该样本预测的模型输出。对于这个模型,单位是Age的对数赔率。
    • 散点图的颜色由另一个特征决定,如果不传入固定特征,则函数会挑选与分析特征交互最强的特征列(比如在下面与Length交互性最强的是Sex_F
  • 我们绘制出除Sex独热编码后的其余列,并让函数自动选择与其交互性较强的特征
for name in X.columns:
    if 'Sex' not in name:
        shap.dependence_plot(name, shap_values, X)

请添加图片描述

  • 由上图可知:
    • Length交互性最强的是Sex_F
    • 长度在1.25以上的雌性螃蟹年龄高于雄性和未知性别螃蟹
    • 长度在1.00以下时,随着长度增加年龄也随着增加,但超过1.00以上时,长度增加年龄不一定增加
      请添加图片描述
  • 由上图可知:
    • Diameter交互性最强的是Sex_M
    • 螃蟹直径小于0.6时,直径越长,年龄越小。当直径在0.6~0.8时,直径越长,年龄越大,当直径超过0.8时,直径对年龄影响较小
    • 直径在0.7以下时,雄性螃蟹年龄基本大于雌性和未知性别
      请添加图片描述
  • 由上图可知:
    • Height交互性最强的是Length
    • 螃蟹高度大于0.3时,长度大的螃蟹年龄更大
      请添加图片描述
  • 由上图可知:
    • Weight交互性最强的是Sex_M
    • 在重量相同时,雄性螃蟹年龄比雌性和未知性别年龄大
      请添加图片描述
  • 由上图可知:
    • Shucked Weight交互性最强的是Diameter
    • 当螃蟹不含壳的重量小于3时,重量越小,年龄越小。
    • 去壳重量量越大,螃蟹直径越大

蜂群摘要图

  • 蜂群图旨在显示数据集中的主要特征如何影响模型输出的信息密集摘要。
  • 给定解释的每个实例都由每个特征流上的单个点表示。
  • 点的 x 位置由该特征的 SHAP 值确定,点沿着每个特征行“堆积”以显示密度。颜色用于显示特征的原始值。
    请添加图片描述
  • 由上图可得以下结论:
    • 平均而言外壳重量(Sheel Weight)是最重要的特征,外壳重量越大,螃蟹年龄越大
    • 不含壳重量(Shucked Weight)越轻,反而可能有着更大的年龄。重的不含壳重量几乎年龄较小
    • 长度(Length)越长,年龄越小
    • 直径(Diameter)越小,几乎年龄较小
    • 雄性(Sex_M)和雌性(Sex_F),年龄相较于未知(Sex_I)更大

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

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

相关文章

【性能设计篇】聊聊异步处理

在性能设计的时候,其实主要的三板斧就是数据库(读写分离、分库分表),缓存(提升读性能),异步处理(提升写性能)以及相关的秒杀设计以及边缘设计等。 本篇主要介绍异步处理的哪些事,我们…

6.2.1 网络基本服务---域名解析系统DNS

6.2.1 网络基本服务—域名解析系统DNS 因特网是需要提供一些最基本的服务的,今天我们就来讨论一下这些基本的服务。 域名系统(DNS)远程登录(Telnet)文件传输协议(FTP)动态主机配置协议&#x…

Day47

思维导图 练习 实现登录框中&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;并跳转到其他界面 second.h #ifndef SECOND_H #define SECOND_H#include <QWidget>namespace Ui { class Second; }class Second : public QWidget {Q_OBJECTpublic:explicit …

Matlab绘图时的几个小技巧(修改刻度线长度、添加/去掉右边和上面的轴与刻度线、出图时去掉旁边的空白部分)

set(gca,TickLength,[0.005,0.035]); %修改坐标轴刻度线的长度 box on; %开启右面和上面的坐标轴 box off;%关闭右面和上面的坐标轴 set(gca, LooseInset, [0,0,0,0]);%删除掉图旁边多余的空白部分首先随便出一张图 我想让刻度线更长或更短一些&#xff1a; 我想让右侧和上面…

OpenCV的安装与配置指南(Windows环境,Python语言)

OpenCV 的安装与配置指南&#xff08;Windows环境&#xff0c;Python语言&#xff09; 导语一、安装 Python 二、安装 OpenCV 库三、配置 OpenCV 环境变量四、验证 OpenCV 安装总结 导语 OpenCV 是一个功能强大的计算机视觉库&#xff0c;广泛应用于图像处理和计算机视觉领域。…

第十二章 elk

1、ELK可以帮助我们解决哪些问题 日志分布在多台不同的服务器上,业务一旦出现故障,需要一台台查看日志 单个日志文件巨大,无法使用常用的文本工具分析,检索困难; 2、架构设计分析 Filebeat和Logstash ELK架构中使用Logstash收集、解析日志,但是Logstash对内存、cpu、i…

MySQL入门必备:Linux中部署MySQL环境的四种方式详解

目录 一、仓库安装 二、本地安装 三、Docker中安装 四、源码安装 一、仓库安装 首先需要下载mysql软件包&#xff1a; 1、进入MySQL官网 2、进入MySQL社区版下载 3、使用yum方式下载MySQL 4、下载对应版本的软件包 5、这里可以不登录直接下载软件包 6、复制下载链接 7、然…

Perfetto详细解析

一、Perfetto基础 1、Perfetto介绍 Perfetto 是一个生产级的开源堆栈&#xff0c;用于提高性能 仪器和痕量分析。与 Systrace 不同&#xff0c;它提供数据源超集&#xff0c;可以用 protobuf 编码的二进制流形式记录任意长度的跟踪记录。可以将Perfetto理解为systrace的升级版…

Python——爬虫入门

爬虫的流程 第一步:获取网页内容 浏览器访问网页时也是一样&#xff0c;都是先发个请求获取网页内容&#xff0c;但是浏览器多了个渲染的步骤。 程序获取的内容都是网页源代码 第二步:解析网页内容 第三步:储存或分析数据 要做数据集就存起来&#xff0c;要做数据分析就形…

【Matlab】GRNN神经网络遗传算法(GRNN-GA)函数极值寻优——非线性函数求极值

上一篇博客介绍了BP神经网络遗传算法(BP-GA)函数极值寻优——非线性函数求极值&#xff0c;神经网络用的是BP神经网络&#xff0c;本篇博客将BP神经网络替换成GRNN神经网络&#xff0c;希望能帮助大家快速入门GRNN网络。 1.背景条件 要求&#xff1a;对于未知模型&#xff08;…

scratch 角色追踪

scratch 角色追踪 本程序中一个角色移动到随机位置和方向后向前移动&#xff0c;碰到边缘反弹&#xff1b;另一个角色跟随前一个角色&#xff0c;两个角色接触后前者重新取随机位置。 程序内容如下

Linux——进程信号详解

目录 一.进程信号的理解 1.1定义&#xff1a; 1.2举例&#xff1a; 1.3总结&#xff1a; 二.进程信号地使用&#xff1a; 2.1信号种类&#xff1a; 2.2而操作系统向进程发送信号地方式有四种&#xff1a; 2.2.1以键盘的方式向进程发送信号 接下来介绍一个系统调用函数sign…

【项目】C++实现高并发内存池

文章目录 一、项目介绍1.1 项目原型1.2 池化技术1.3 内存池主要解决的问题1.4 malloc理解 二、定长内存池实现三、高并发内存池的三层申请内存框架设计3.1 thread cache层的设计3.1.1 thread cache整体框架3.1.2 哈希桶映射对齐规则3.1.3 thread cacheTLS无锁访问 3.2 central …

【剑指offer】10. 矩阵中的路径(java)

文章目录 矩阵中的路径描述示例1示例2思路完整代码 矩阵中的路径 描述 请设计一个函数&#xff0c;用来判断在一个n乘m的矩阵中是否存在一条包含某长度为len的字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始&#xff0c;每一步可以在矩阵中向左&#xff0c;向右&…

springboot切面应用

1、切面场景 无侵入的实现功能增强 2、实现 切面类的实现 需要使用注解Aspect和Componet来实现&#xff0c; 环绕通知的作用在返回的student的sname后面拼接around字符串。 后置通知的作用在入参后面拼接idididdi&#xff0c;然后打印日志 Aspect Component public class…

English Learning - L3 纠音 W9 Lesson7-8 Ted Living Beyond Limits 2023.7.4 周二

朗读内容&#xff1a; Lesson 7-8 Day 52 - 60 句子 Ted Living Beyond Limits 23-50

使用Python爬虫和数据可视化,揭示人口大国历年人数的变迁

前言 人口大国通常在全球人口排名中位居前列&#xff0c;其人口数量远远超过其他国家。而印度和中国这两个国家的人口数量均已经超过14亿&#xff0c;而当前全球的人口总数也不过刚刚突破80亿而已&#xff0c;妥妥的天花板级别存在。或许是中国和印度在人口方面的表现太过“耀…

【CANopen】周立功轻松入门CANopen笔记

前言 想学习些新东西了&#xff0c;原本想直接学学Ethercat&#xff0c;但是简单看了看对象字典啥的概念一头雾水的&#xff0c;决定先从CANopen开始&#xff0c;Ethercat看着头疼。Etehrcat和CANopen有挺多类似的地方。感谢ZLG的这个入门笔记&#xff0c;我似乎是看懂了些&am…

非主流币波段策略

数量技术宅团队在CSDN学院推出了量化投资系列课程 欢迎有兴趣系统学习量化投资的同学&#xff0c;点击下方链接报名&#xff1a; 量化投资速成营&#xff08;入门课程&#xff09; Python股票量化投资 Python期货量化投资 Python数字货币量化投资 C语言CTP期货交易系统开…

数据合并--Pandas

1. 键匹配合并:merge()函数 1.1 函数功能 合并DataFrame或者命名的Series&#xff0c;命名的Series被视为单列的DataFrame 1.2 函数语法 pandas.merge(left, right, howinner, onNone, left_onNone, right_onNone, left_indexFalse, right_indexFalse, sortFalse, suffixes…