数据, 术→技巧

特征工程数据预处理之抽样

钱魏Way · · 597 次浏览

在分析数据或进行算法模型训练前有时需要先对数据进行抽样,这里整理了抽样的一些知识点。

什么情况下需要会用到抽样?

  • 数据量太大,计算能力不足。
  • 抽样调查,小部分数据即可反应全局情况。
  • 时效要求,通过抽样快速实现概念验证。
  • 定性分析的工作需要。
  • 无法实现全覆盖的场景,比如满意度调查等。
  • 解决样本不均衡问题。

常用数据抽样的方法

随机抽样(用的最多)

该抽样方法是按等概率原则直接从总中抽取n个样本,这种随机样本方法简单,易于操作;但是它并不能保证样本能完美的代表总体,这种抽样的基本前提是所有样本个体都是等概率分布,但真实情况却是很多数样本都不是或无法判断是否等概率分布。在简单随机抽样中,得到的结果是不重复的样本集,还可以使用有放回的简单随机抽样,这样得到的样本集中会存在重复数据。该方法适用于个体分布均匀的场景。

使用Pandas进行数据随机

DataFrame.sample(n=None, frac=None, replace=False, weights=None, random_state=None, axis=None)

参数说明:

  • n:需要抽样的数量
  • frac:需要抽样的比例,0-1之前的小数。n和frac只能传一个
  • replace:是否允许同一行被抽到多次,默认为False
  • weights:默认为等概率加权
  • random_state:随机数发生器种子
  • axis:取值为0时,抽取行。取值为1时,抽取列。

等距抽样

等距抽样是先将总体的每个个体按顺序编号,然后再计算出抽样间隔,再按照固定抽样间隔抽取个体。这种操作方法易于理解、简便易行,但当总体样本的分布呈现明显的分布规律时容易产生偏差,例如增减趋势、周期性规律等。该方法适用于个体分布均匀或呈现明显的均匀分布规律,无明显趋势或周期性规律的数据。

比如当需要对用户访问页面进行分析时,由于一个用户存在多个浏览记录,如果采用随机抽样可能会导致抽取到的用户访问页面不全的信息。改进方案为按照会员维度等距进行抽样。比如按会员号尾号进行抽样。

分层抽样

分层抽样是先将所有个体样本按照某种特征划分为几个类别,然后从每个类别中使用随机抽样或等距抽样的方法选择个体组成样本。这种操作方法能明显的降低抽样误差,并且便于针对不同类别的数据样本进行单独研究,因此是一种较好的实现方法。该方法适用于带有分类逻辑的属性、标签等特征的数据。

通过分层抽样解决样本不均衡的问题:

  • 过抽样:增加分类中少数类样本的数量,最简单的方法就是复制少数类样本形成多条记录。改进的过抽样方法是在少数类中加入随机噪声、干扰数据或通过一定规则产生新的合成样本。例如SMOTE算法。过抽样方法应用极广泛。
  • 欠抽样:减少分类中多数类样本的数量,最简单的方法就是随机去掉一些多数样本。

通过正负样本的惩罚权重来解决不均衡:对于分类中不同样本数量的类别分别赋予不同权重(一般小样本量类别权重大,大样本量类别权重小),然后进行计算和建模,例SVM。

机器学习需要多大的数据量?

很多机器学习研究者普遍存在的问题:“我的项目需要多少训练数据?”这个问题经常让不少开发者非常苦恼。实际上,这个问题回答起来比看上去要复杂的多,因为其中要涉及到很多因素,比如你使用的模型类型,模型在实际业务中的用途等等。

为何很难预估你的数据集大小?

确定目标数据量的许多困难源于训练过程的目标。有很多文章都讲到了模型训练过程的工作原理,但要记住,我们训练的目的是构建一个能理解数据背后模式和关系的模型,而不仅仅是理解数据本身。收集数据时,我们需要确保所拥有的数据数量能教会算法数据中的关系,以及数据和结果之间的关系。

这看起来很容易预测。但实际上机器学习项目的目标多种多样,可以产生大量的训练数据类型。因此,每个项目都有各自独特的多种因素,这使得提前计算数据需求变得非常困难,可能包括以下部分或全部内容:

  • 模型的复杂度:模型为完成任务而必须考虑的每个参数都会增加训练所需的数据量。例如,用于识别特定汽车品牌的模型具有少量的参数,主要与车辆的形状相关。而如果是一个必须从长远考虑汽车成本的模型,不仅要顾及到包括汽车品牌和状况的因素,还有经济和社会因素。由于这种复杂程度更高,第二个模型需要比第一个模型更多的数据。
  • 训练方法:由于模型必须理解更多的互连参数,由此导致的复杂性使得训练模型的方式也被迫发生改变。传统的机器学习算法使用结构化学习,这意味着它们很快就会出现附加数据投入产出比很低的情况。相反,深度学习模型可以找出自己的参数,并学习如何在没有结构的情况下进行改进。这意味着它们不仅需要更多的数据,而且还有更长的学习曲线,其中进一步增加数据具有积极的影响。因此,你使用的训练方法会导致对你的模型有用的训练数据量发生显著变化。
  • 标签需求:根据实际任务,我们会以不同方式注释数据点。这可能会导致数据生成的标签数量,以及创建这些标签所需的工作量发生明显变化。例如,如果我们有1000个输入数据句子用于情感分析,我们可能只需要将它们标记为正面情感或负面情感,因此每个句子产生一个标签。但是,如果对同样1000个句子进行注释用于实体提取,则可能需要为每个句子标记5个单词。尽管具有相同的原始输入数据,但是一个任务产生的标签比另一个任务多五倍。因此,我们准备数据的方式可能会影响项目所需的工作量和花费的成本。
  • 误差容忍度:模型在你的实际业务中的预期作用也会影响数据量。对于预测天气的模型,20%的误差率是可接受的,但如果用于检测有心脏病发作风险的患者,这个误差率万万不可。在边界案例方面的改进可以降低这种风险。如果你的算法具有高度风险规避或者对于项目能否成功至关重要,那么你需要的数据量会大幅增加,才能追求完美性能。
  • 输入的多样性:我们生活在一个复杂的世界中,可以向模型输入各种类型的输入数据。例如,聊天机器人必须能够理解各种语言,哪怕它们是用一系列正式,非正式甚至语法不正确的风格写就的。如果无法高度控制模型的输入,就需要更多数据来帮助你的模型在不可预测的环境中运行。

从上面这些因素可以清楚地看到,我们需要的数据量取决于项目的独特需求和预期目标。最后,项目负责人必须自己平衡这些因素,并提出自己的目标。那么有没有什么方法呢?

有,接下来就看看有哪些方法可以帮我们在刚开始时确定所需的数据量。

我们该如何计算数据需求?

确定任何给定算法所需的确切数据数量可能无法做到。幸好,基于整体预估的方法能帮你分析项目的训练数据需求量,以下两种方法均可:

  • 10 倍法则:一个常见的经验法则是模型通常需要超出其自由度 10 倍的数据量。这里的自由度可以是影响模型输出的参数,是数据点的一个属性,或者更简单地说,是数据集中的列。10 倍法则的目标就是是抵消这些组合参数为模型输入带来的变化。对于复杂模型而言,这可能没有帮助。但是,这条法则能让我们快速估算数据集的数量,保证项目保持运行。
  • 学习曲线:如果你已经有一些数据并希望根据更多事实情况做出决策,可以考虑创建一个研究示例,根据数据集的大小来评估模型的能力。通过把结果绘制在图表上,你应该能够找出数据集大小与模型能力之间的关系,同时还要确定什么时候添加更多数据的收益会不断递减。这种方法需要更多人力工作,包括创建一些逻辑回归问题,但至少比简单一猜要靠谱得多。

通常,最好在刚开始时用手头已有的数据训练模型,在你认为有必要时再添加更多数据。一旦项目取得一些结果,你对数据的需求会越来越明显。不过,有些朋友还是希望能在项目开水前有个确切的数字,下面是我们在网上找到的项目数据集大小的一些估计。也许这些例子能让你对自己项目所需的数据集大小心里有个数。

数量 VS 质量

数据的局限性也会是模型的局限性。但是,在所有关于你需要多少数据的讨论中,不要忘记这条也适用于数据质量和数量。对于模型来说,一百万个混乱的数据反而不如 100 个干净数据,后者实际上更有助于算法达成目标。无论你正在搭建什么样的模型,都要确保正在使用的数据能为你提供坚实的基础和最佳的成功机会。

看了上面的介绍,感觉还是云里雾里的,个人整理的大致方案:(没有什么理论支撑)

  • 大于 (数值型特征数量+每个类别型特征的类别数) * 10
  • 小于 100万

个人处理时,也没有考虑那么多内容,通常取100万数据进行作为训练集。

参考链接:

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注