Coursera-Kaggle Week2 学习笔记

本篇博客为 Coursera-Kaggle 公开课的第二周学习笔记。

探索式数据分析

EDA 介绍

  • EDA 的作用:
    • 更加了解数据
    • 找到一些 magic 特征
  • 在探究模型(比如进行 stacking)之前,先进行 EDA
    • 附:stacking 是一种集成学习方法

  • 在具体进行 EDA 之前,先要建立对数据的直觉:
    • 首先需要了解相关的领域知识
      • 可以帮助更深层次地理解问题
    • 检查数据是否符合直觉
      • 是否和领域知识相契合
    • 了解数据是如何生成的
      • 这对建立正确的验证方式非常重要

匿名数据

  • 关于匿名数据:
    • 我们需要尝试去解码这些特征
      • 即猜测该特征的真实含义
    • 我们需要猜测特征的类型
      • 每种类型对应的预处理方式不同
    • 可能有用的函数:
      df.dtypes # dataframe各列数据类型
      df.info() # dataframe信息(index和各列数据类型)
      x.value_counts() # 某个特征项中各数值数量统计
      x.isnull() # 某个特征项是否包含NA(such as None or numpy.NaN) pandas基于numpy构建

数据可视化

数据可视化可以分为两类:

第一类:探索单个特征

  • 直方图:plt.hist(x)

  • 索引与值:plt.plot(x, ‘.’)

  • 统计量分析:

    df.describe()
    x.mean()
    x.var()
  • 其他统计:

    x.value_counts()
    x.isnull()

第二类:探索特征间的关联性

  • 特征对
    • 散点图:plt.scatter(x1, x2)

    • 散点矩阵:pd.scatter_matrix(df)

    • 相关系数图:df.corr(), plt.matshow( … )

  • 特征组
    • 相关系数图 + 聚类

    • 索引与值(基于统计量):df.mean().sort_values().plot(style=’.’)

数据集清理与检查

  • 数据集清理包括:
    • 常数特征的清理:traintest.nunique(axis=1) == 1
    • 重复特征的清理:traintest.T.drop_duplicates()
      • 如果对于一些分类特征,其实际上是重复的(只要把名字替换)

        • 这种情况可以先给分类变量重新命名(自顶向下,第一个变量为 1,第二个为 2,以此类推)

          for f in categorical_feats:
          traintest[f] = traintest[f].factorize()
          traintest.T.drop_duplicates()
  • 其他检查包括:
    • 检查是否有重复的数据行
      • 如果有,理解其为什么重复(并不一定要删除)
    • 检查是否有打乱数据
      • 可以通过画图来确认

      • 如果没有打乱数据,则可能存在数据泄露

验证与过拟合

简介

  • 验证帮助我们评估一个模型的质量
    • 选择在未知数据(验证集)上表现最好的模型
  • 欠拟合指模型未捕获数据足够的模式
  • 一般来说,过拟合指模型在验证集上的表现明显低于训练集,原因在于:
    • 捕获了噪声
    • 捕获了无法推广到测试数据的模式
  • 在竞赛中,过拟合指模型在测试(公开/私有)集上的表现比验证集的表现要差

验证策略

  • 有三种主要的验证策略:
    • 保留验证(Hold-out)sklearn.model_selection.ShuffleSplit
    • K 保留验证(K-fold)sklearn.model_selection.Kfold
    • 留一验证(Leave-one-out)sklearn.model_selection.LeaveOneOut
  • 对于某些情况,上述验证方法可能会存在偏差:
    • 例如上面这个小数据集,如果分割不当,可能会导致训练结果产生偏差
    • 这时我们需要采用分层的方法,来保证各 fold 之间类别的比例与总比例相同
    • 分层方法主要针对:
      • 小样本数据
      • 不平衡数据
      • 多分类数据

数据划分策略

  • 在大部分情况下,数据划分的方式有以下三种(单独使用或结合起来):
    • 根据 row number(随机分)
    • 根据时间
    • 根据数据的 id
  • 特征生成的逻辑需要基于数据划分的策略
  • 基本原则:验证集的划分应该模仿竞赛中训练/测试集的划分

验证的常见问题

  • 验证时出现的问题可以分为两个阶段:
    • 本地验证阶段
    • 提交阶段
  • 在本地验证阶段,如果得到了低于期望的分数,我们应该进行进一步的验证:
    • 进行不同的 K 保留验证,并求得分均值
    • 在一个分割上调试模型,在另一个分割上分析得分(对于 K 保留)
  • 在提交阶段,如果分数不如本地验证的得分,我们应该:
    • 检查公开排行榜的数据是否过少(无需处理)
    • 检查是否存在过拟合(需要处理)
    • 检查是否选择了正确的划分策略(需要处理)
    • 检查训练集和测试集是否属于不同的分布(需要处理)
      • 可以考虑对输出进行批量处理
  • 有时候,不用过分在意公开排行榜的得分,因为存在以下情况:
    • 随机化处理
      • 例如所有参赛者的得分过于接近,因此平台做了随机处理来区分得分
    • 数据量过小
    • 公开榜与私有榜的分布不同

数据泄露

  • 数据泄露是在竞赛中特有的一种现象
    • 本质上是一种因果关系的纰漏(倒因为果)
    • 有时候利用数据泄露可以拿到非常好的成绩
  • 常见的数据泄露包括:
    • 时间序列上的泄露
    • ID 信息
    • 元数据
    • 行的顺序
  • 与数据泄露相关的一项技术是排行榜探索(leaderboard probing)
    • 该技术是利用排行榜的得分来计算 id 与输出类别之间的关系
      • 对于二元分类的对数损失函数,其测试数据的均值可以用如下公式求出: \[ \frac{N_{1}}{N}=\frac{-L-\ln (1-C)}{\ln C-\ln (1-C)} \]
        • L:排行榜得分
        • C:预测的常数
    • 个人感想:不一定有用

作业:数据泄露

参考地址

整体思路:

  • 先提交全为 1 的预测,得到评分为 0.5
    • 说明测试集中正负样本各一半
  • 基于两个特征 id 的共现矩阵,计算每一组 id 对的相似性
    • 共现矩阵对称,通过向量点积计算
  • 发现相似性得分以 20 为分界,各占 50%
  • 基于该分界,预测正负样本,准确率接近 99%