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

前言

  • 本文着重介绍数据分析实战的基础知识和技巧,探索从数据探索到建模再到模型解释的完整过程
  • 内容包含数据探索、模型建立、调参技巧、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)更大
  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
数据卷是 Docker 中一个非常重要的概念,它可以用来持久化容器的数据,即使容器被删除了,数据也可以被保留下来。在本教程中,我们将学习如何在 Docker 中使用数据卷。 1. 创建数据卷 要创建一个数据卷,可以使用 `docker volume create` 命令,例如: ``` docker volume create mydata ``` 这个命令将创建一个名为 `mydata` 的数据卷。 2. 挂载数据卷 要将一个数据卷挂载到容器中,可以使用 `-v` 参数,例如: ``` docker run -d --name mycontainer -v mydata:/data nginx ``` 这个命令将创建一个名为 `mycontainer` 的容器,并将 `mydata` 数据卷挂载到容器中的 `/data` 目录。 3. 查看数据卷 要查看所有数据卷,可以使用 `docker volume ls` 命令,例如: ``` docker volume ls ``` 这个命令将列出所有数据卷的名称和驱动程序。 要查看特定数据卷的详细信息,可以使用 `docker volume inspect` 命令,例如: ``` docker volume inspect mydata ``` 这个命令将输出 `mydata` 数据卷的详细信息,包括其驱动程序和挂载点。 4. 删除数据卷 要删除一个数据卷,可以使用 `docker volume rm` 命令,例如: ``` docker volume rm mydata ``` 这个命令将删除名为 `mydata` 的数据卷。 需要注意的是,如果一个数据卷正在被一个容器使用,那么在删除该数据卷之前,必须先将该容器删除或者解除数据卷的挂载。 5. 备份和恢复数据卷 要备份一个数据卷,可以使用 `docker run` 命令和 `tar` 命令,例如: ``` docker run --rm -v mydata:/data -v $(pwd):/backup ubuntu tar cvf /backup/mydata.tar /data ``` 这个命令将创建一个名为 `mydata.tar` 的文件,其中包含 `mydata` 数据卷中的所有数据。 要恢复一个数据卷,可以使用 `docker run` 命令和 `tar` 命令,例如: ``` docker run --rm -v mydata:/data -v $(pwd):/backup ubuntu tar xvf /backup/mydata.tar ``` 这个命令将从名为 `mydata.tar` 的文件中恢复 `mydata` 数据卷的所有数据。 6. 使用 Docker Compose 在 Docker Compose 中,可以使用 `volumes` 关键字来创建和管理数据卷,例如: ``` version: '3' services: web: image: nginx volumes: - mydata:/data volumes: mydata: ``` 这个 Compose 文件将创建一个名为 `mydata` 的数据卷,并将其挂载到 `web` 服务的 `/data` 目录中。 以上就是关于 Docker 数据卷的基础实战教程,希望能够帮助到大家。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

羽星_s

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值