干货|如何提高机器学习项目的准确性?



今天,你AI了没?

关注:决策智能与机器学习,学点AI干货

在机器学习项目中工作是一个枯燥乏味的任务,尤其是当你收集到所有可用的数据,但是模型产出的结果糟糕。你可以跟着本篇推文中提供给你的方法来提高你在机器学习项目中的准确性。

 

总是先以数据为目标


这个章节旨在提供数据处理的技巧,你可以跟着它来产生一些高质量的训练集合。

 

创建一个高质量的数据集合是最重要的预测分析阶段。有时,它也是最消耗时间的部分。

 

普遍的数据质量问题

 

通常,在为机器学习模型准备数据时会遇到以下用例:


1、数据集中可能存在丢失或错误的值。


2、数据集中可能存在分类(文本,布尔)值,并非所有算法都适用于文本值。


3、某些特征可能具有比其他特征更大的值,并且需要进行转换以获得同等重要性。


4、有时,数据包含大量维度,并且需要减少维度数量。

 

提高数据质量的技巧  

用例1:填充缺失值

 

假设我们想要预测变量,例如公司销售,它取决于以下两个变量:公司的股价和员工总数。

 

股价和员工总数均包含数值。

 

我们还假设一系列日期的股价和员工总数存储在不同的csv文件中。

 

场景:一旦我们使用Python DataFrame Merge()方法连接两个数据集,我们可能会看到空值或占位符字符串(如NaN)表示该数字为空。


问题:当我们用缺失值提供它们时,大多数模型都无法拟合和预测值。


解决方案:Pandas的data frame提供了许多替换缺失值的特征。


第1步:将数据放入pandas的data frame中


640?wx_fmt=png

 

第2步:一个选择是删除空值的列/行,然而,我不建议这种方法:


640?wx_fmt=png


收集干净的数据是一项耗时的任务,删除列(特征)或行最终可能会丢失数据集中的重要信息。更好的选择:通过设置默认值来替换缺失值来替换NaN,在后面或前面填充数据集,插入或推断这个值等方法。

 

我们还可以使用模型并使用训练数据集对其进行训练,以便它可以返回适当的值来填充缺失值。其中一个合适的策略是使用sci kit learn Imputer来插入值。

 

举个例子,我们可以这样做:


640?wx_fmt=png

 

一旦我们替换了缺失值,我们现在需要查看数据集中是否有任何分类值。


用例2:处理分类值


假设我们想要预测变量,例如推文数量,它取决于以下两个变量:最活跃的当前新闻类型和活跃用户数。

 

在这种例子当中,最活跃当前新闻类型是一个分类特征。它可以包含文本数据,如“时尚”,“经济”等。此外,活跃用户数包含数字字段。

 

场景:在我们将数据集提供给机器学习模型之前,我们需要将分类值转换为数值,因为许多模型不适用于文本值。

 

解决方案:有许多策略可以处理分类特征:


1、创建字典以将分类值映射到数值


字典是数据存储结构。它包含 key-value配对的元素的列表。它使key值可以映射到value值。

 

640?wx_fmt=png


这种策略也适用于序数值。序数值是可以排序的那些文本值,例如衣服尺寸(小,中,大等)。

 

2、另一种策略是使用编码器为每个文本值分配唯一的数值。此策略更适用于具有大量不同值(> 30)的变量,例如用于管理组织作业层次结构。

 

我们可以使用手动或sci-kit编码器。

 

2.1 手动编码器


640?wx_fmt=png

 

2.2 Sci Kit学习编码器


640?wx_fmt=png


还有一个步骤经常被遗漏

 

我经常看到这种情况:在将文本值编码为数值后,我们将看到一些值将大于其他值。较高的值意味着它们具有更高的重要性。这可能导致我们的模型不同地处理特征。例如,时尚新闻类型的值可能为1,经济新闻类型的值可能为10.这使得机器学习模型假设经济新闻类型比时尚新闻类型更重要。


解决方案:我们可以通过使用One-Hot编码来解决这个问题

 

One Hot 编码

 

为了防止某些分类值比其他值更重要,我们可以在将编码数据提供给我们的机器学习模型之前使用one hot编码技术。

 

One hot编码技术实质上为我们的目标分类特征中的每个不同值创建了副本(虚拟)特征。一旦创建虚拟值后,将填充布尔值(0或1)以指示该特征的值是true还是false。因此,我们最终得到一个宽的稀疏矩阵,其中填充了0/1值。

 

例如,如果你的特征有“A”,“B”和“C”值,则将创建三个新特征(列):特征A,特征B和特征C。如果第一行的特征值为A,那么对于A,你会看到1,对于特征B和C,它将会是0。

 

解决方案:


我们可以使用Pandas get_dummies()方法,它只将分类值转换为整数。

 

640?wx_fmt=png


此外,我们可以使用sklearn.preprocessing.OneHotEncoder

 

提示:OneHot编码总是在编码文本值之后以避免排序


用例3:扩展特征

 

现在填充所有缺失值,并将分类值转换为数值。通常,当我们的数据集中有多个特征时,我们需要确保正确缩放数据集的值。

 

在特征中的值的范围应该反应他们的重要性。


更高价值的值反应更高的重要性。

 

场景:假设我们想要衡量股市收盘价。我们希望使用一个简单的最佳拟合线回归模型,该模型使用GBP到EUR的汇率和公司员工的数量来预测股票的价格。

 

因此,我们收集的数据集包含GBP到EUR的汇率以及公司员工的数量。


汇率将从0到1不等,而员工人数将会大得多,可能会达到1000s。


随后,该模型将考虑员工人数优先于汇率。

 

有两种方法可以扩展特征:


正则化:确保所有值的范围在0到1之间。可以通过以下实现来完成:


640?wx_fmt=png


sklearn.preprocessing.MinMaxScaler可以被用来实现正则化

 

标准化:确保特征中的值遵循正态分布,其中值的均值为0,标准差为1。


640?wx_fmt=png


sklearn.preprocessing.StandardScaler可以被用来实现标准化

 

在大多数情况下,标准化技术优于正则化技术,因为它保持异常值并将数据转换为正态分布。正态分布允许模型容易地预测值,并且还可以容易地确定权重,这再次有助于预测模型。

 

关键:只在训练集中训练Scalers,不能用于所有的训练集

 

当我们训练我们的模型时,即使我们正在训练imputers或标量,也总是使用训练集来训练测试模型。让测试或验证集仅用于测试。


用例4:删除现有特征

 

假设你在训练集上训练你的机器学习模型,并且你正在使用一个测量方法,例如Adjusted R Squared来评估你的机器学习模型的质量。你的模型的AdjustedR Squared是90%+意味着你的模型可以准确预测90%的值。

 

场景:当你将测试数据输入模型时, 你会得到一个非常低的Adjusted R Squared,这意味着模型不准确并且过度拟合训练数据。

 

这是一个典型的过度拟合的例子。

 

有些特征并不像我们首次从训练集中得出的结论那么重要。它最终可能会过度拟合我们的机器学习模型。

 

解决方案:


有几种方法可以防止过度拟合,例如添加更多数据和/或消除特征。我在文章中概述了一些解决方案:


1、我们可以删除彼此之间具有强相关性的特征。你可以使用相关矩阵来确定所有自变量之间的相关性。


2、我们还可以使用散布混合图来确定所有变量如何相互链接。

 

2、我们可以使用RandomForestClassifer,它可以让我们了解每个特征的重要性:

 

640?wx_fmt=png

 

最不重要的特征可以被排除。

 

用例5: 从已存在的特征中创建新的特征

 

偶尔地,我们希望从一个或多个特征中创建新的特征。有时,我们也可以从因变量中创建一个新特征,它是我们想要预测的变量。

 

例如,在时间序列预测分析中,我们可以从数据中提取趋势和季节性,然后将趋势和季节性作为单独的特征提供,以预测我们的目标变量。


用例6: 减少维度

 

场景:偶尔我们希望减少维度的数量。一个例子是我们想要通过使用文字到向量编码算法来爬取网站并将文本数据转换为向量。我们最终得到一个稀疏矩阵。

 

问题:稀疏矩阵会降低算法速度。


解决方案:分解矩阵,但确保不丢失有价值的信息。


我们可以使用主要成分分析(PCA),线性判别分析(LDA)或核主要成分分析来减少维度。

 

微调模型参数

微调机器学习预测模型是提高预测结果准确性的关键步骤。在最近几年,我写了很多文章来解释机器学习是如何工作的,以及如何丰富和分解特征集以提高机器学习模型的准确性。

 

本节发现以下细节:


1、使用评分指标检索模型性能的估计值


2、查找和诊断机器学习算法中的常见问题


3、微调机器学习模型的参数

 

第1步:理解调整机器学习模型是什么


有时,我们必须探索模型参数如何提高机器学习模型的预测准确性。


微调机器学习模型是一门黑色艺术。它可以证明是一项详尽的任务。我将介绍本文中的一些方法,我们可以遵循这些方法以在更短的时间内获得准确的结果。

 

我常常被问到一个问题,即当特征稳定并且特征集被分解时,可以用来调整预测模型的技术。一旦尝试了所有的方法,我们应该关注调整我们的机器学习模型。

 

调整机器学习模型就像旋转电视开关和旋钮,直到你获得更清晰的信号

 

该图说明了参数如何相互依赖。


640?wx_fmt=png


  • X训练 - 训练自变量数据,也称为特征

  • X测试 - 自变量的测试数据

  • Y训练 - 因变量训练数据

  • Y测试 - 因变量的测试数据

 

例如,如果你基于温度和湿度预测瀑布的体积,则水的体积表示为Y(因变量),温度和湿度表示为X(独立变量或特征)。 X的训练数据被称为X训练,你可以使用它来训练你的模型。

 

超参数是模型的参数,可以作为模型的参数输入。

 

第2步:涵盖基础知识

 

在对预测模型进行微调之前,简要了解机器学习是什么是非常重要的。


相比较于微调模型的参数,通常更容易改进我们提供给模型的数据。如果你想提高预测模型的准确性,请首先丰富特征集中的数据。

 

如果你提供质量较差的数据,则模型将产生较差的结果。

 

第3步:找到你的分数指标


最重要的先决条件是决定你将用于评估预测模型准确性的指标。

 

它可以是Rsquared,Adjusted R squared,ConfusionMatrix,F1,Recall,方差等。


第4步:获得准确的预测分数


一旦你准备好了训练集,丰富了其特征,缩放了数据,分解特征集,确定评分指标并在训练数据上训练模型后,你应该测试模型在看不见的数据上的准确性。看不见的数据称为“测试数据”。

 

你可以使用交叉验证来评估模型在看不见的数据上如何运作的。这称为模型的泛化错误。


交叉验证

有两种常见的交叉验证方法

 

Holdout交叉验证


这不是一种明智的机器学习实践,它训练在同一数据集上训练你的模型并对其准确性进行评分。在一个看不见的测试集上使用不同的模型参数值来测试模型是一种非常优越的技术。


将数据集分为三个部分是一种很好的做法:


1、训练集

2、验证集

3、测试集

 

在训练集上训练模型(60%的数据),然后在验证集上执行模型选择(调整参数)(20%的数据),一旦准备就绪,在测试集上测试模型(20%)数据)。

 

根据机器学习模型的需求和数据的可用性创建训练,验证和测试数据集比例。

 

K Fold交叉验证


K Fold交叉验证是一种优于Holdout交叉验证的机制。它的工作方式是将数据分成k个folds(部分)。 k-1 fold用于训练模型,最后1个fold用于测试模型。


然后重复该机制k次。此外,每次可以使用多个性能指标来评估和评分性能,然后报告性能指标的平均值。这些分类的比例保存在StratifiedKFold中。


n_jobs参数控制用于运行交叉验证的CPU数。

 

第5步:使用验证曲线诊断最佳参数值

 

一旦准确的预测分数被建立,找出你的模型所需的所有参数。然后,你可以使用验证曲线来探索其值如何提高预测模型的准确性。

 

在我们调整参数之前,我们需要诊断并确定模型是否低度拟合或者过度拟合。

 

具有大量参数的模型往往过度拟合。我们可以使用验证曲线来解决机器学习中过度拟合和低度拟合的问题。

 

这些参数也称为超参数


验证曲线用于传递模型参数的一系列值。它一次更改一个模型参数的值,然后可以根据模型参数值绘制精度值,以评估模型的准确性。

 

例如,如果模型采用名为“树的数量”的参数,则可以通过传入10个不同的参数值来测试模型。你可以使用验证曲线报告每个参数值的准确性,以评估准确性。最后取得最高准确度的分数,并在可接受的时间内为你提供所需的结果。

 

Sci-kitlearn提供验证曲线模块:


640?wx_fmt=png

 

第6步:使用网格搜索进行优化超参数组合

 

一旦我们检索到单个模型参数的最佳值,我们就可以使用网格搜索来获得模型的超参数值的组合,从而为我们提供最高的精度

 

网格搜索评估参数值的所有可能组合。

 

网格搜索是详尽的,并使用强力来评估最准确的值。因此,它是计算密集型任务。

 

使用sci-kit的GridSearchCV学习执行网格搜索


640?wx_fmt=png

 

第7步:连续调整参数以进一步提高准确性

 

这里的关键是,一旦有更多数据,就要始终增强训练集。

 

始终在模型以前没有见过的更丰富的测试数据上测试你的预测模型。


640?wx_fmt=png


始终确保为job选择正确的模型和参数值。

 

重要的是一旦可用就提供更多数据并连续测试模型的准确性,以便进一步优化性能和准确性。

 

总结

本文提供了一个概述,关于进一步提高机器学习模型准确性的两个关键步骤。希望能帮助到你。


 本文经《量化投资与机器学习》授权转载


相关推荐



  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Spark Streaming 和 Flink 都是流处理框架,但在一些方面有所不同。 1. 数据处理模型 Spark Streaming 基于批处理模型,将流数据分成一批批进行处理。而 Flink 则是基于流处理模型,可以实时处理数据流。 2. 窗口处理 Spark Streaming 的窗口处理是基于时间的,即将一段时间内的数据作为一个窗口进行处理。而 Flink 的窗口处理可以基于时间和数据量,可以更加灵活地进行窗口处理。 3. 状态管理 Spark Streaming 的状态管理是基于 RDD 的,需要将状态存储在内存中。而 Flink 的状态管理是基于内存和磁盘的,可以更加灵活地管理状态。 4. 容错性 Flink 的容错性比 Spark Streaming 更加强大,可以在节点故障时快速恢复,而 Spark Streaming 则需要重新计算整个批次的数据。 总的来说,Flink 在流处理方面更加强大和灵活,而 Spark Streaming 则更适合批处理和数据仓库等场景。 ### 回答2: Spark Streaming 和 Flink 都是流处理框架,它们都支持低延迟的流处理和高吞吐量的批处理。但是,它们在处理数据流的方式和性能上有许多不同之处。下面是它们的详细比较: 1. 处理模型 Spark Streaming 采用离散化流处理模型(DPM),将长周期的数据流划分为离散化的小批量,每个批次的数据被存储在 RDD 中进行处理,因此 Spark Streaming 具有较好的容错性和可靠性。而 Flink 采用连续流处理模型(CPM),能够在其流处理过程中进行事件时间处理和状态管理,因此 Flink 更适合处理需要精确时间戳和状态管理的应用场景。 2. 数据延迟 Spark Streaming 在处理数据流时会有一定的延迟,主要是由于对数据进行缓存和离散化处理的原因。而 Flink 的数据延迟比 Spark Streaming 更低,因为 Flink 的数据处理和计算过程是实时进行的,不需要缓存和离散化处理。 3. 机器资源和负载均衡 Spark Streaming 采用了 Spark 的机器资源调度和负载均衡机制,它们之间具有相同的容错和资源管理特性。而 Flink 使用 Yarn 和 Mesos 等分布式计算框架进行机器资源调度和负载均衡,因此 Flink 在大规模集群上的性能表现更好。 4. 数据窗口处理 Spark Streaming 提供了滑动、翻转和窗口操作等灵活的数据窗口处理功能,可以使用户更好地控制数据处理的逻辑。而 Flink 也提供了滚动窗口和滑动窗口处理功能,但相对于 Spark Streaming 更加灵活,可以在事件时间和处理时间上进行窗口处理,并且支持增量聚合和全量聚合两种方式。 5. 集成生态系统 Spark Streaming 作为 Apache Spark 的一部分,可以充分利用 Spark 的分布式计算和批处理生态系统,并且支持许多不同类型的数据源,包括Kafka、Flume和HDFS等。而 Flink 提供了完整的流处理生态系统,包括流SQL查询、流机器学习和流图形处理等功能,能够灵活地适应不同的业务场景。 总之,Spark Streaming 和 Flink 都是出色的流处理框架,在不同的场景下都能够发挥出很好的性能。选择哪种框架取决于实际需求和业务场景。 ### 回答3: Spark Streaming和Flink都是流处理引擎,但它们的设计和实现方式有所不同。在下面的对比中,我们将比较这两种流处理引擎的主要特点和差异。 1. 处理模型 Spark Streaming采用离散流处理模型,即将数据按时间间隔分割成一批一批数据进行处理。这种方式可以使得Spark Streaming具有高吞吐量和低延迟,但也会导致数据处理的粒度比较粗,难以应对大量实时事件的高吞吐量。 相比之下,Flink采用连续流处理模型,即数据的处理是连续的、实时的。与Spark Streaming不同,Flink的流处理引擎能够应对各种不同的实时场景。Flink的实时流处理能力更强,因此在某些特定的场景下,它的性能可能比Spark Streaming更好。 2. 窗口计算 Spark Streaming内置了许多的窗口计算支持,如滑动窗口、滚动窗口,但支持的窗口计算的灵活性较低,只适合于一些简单的窗口计算。而Flink的窗口计算支持非常灵活,可以支持任意窗口大小或滑动跨度。 3. 数据库支持 在处理大数据时,存储和读取数据是非常重要的。Spark Streaming通常使用HDFS作为其数据存储底层的系统。而Flink支持许多不同的数据存储形式,包括HDFS,以及许多其他开源和商业的数据存储,如Kafka、Cassandra和Elasticsearch等。 4. 处理性能 Spark Streaming的性能比Flink慢一些,尤其是在特定的情况下,例如在处理高吞吐量的数据时,在某些情况下可能受制于分批处理的架构。Flink通过其流处理模型和不同的调度器和优化器来支持更高效的实时数据处理。 5. 生态系统 Spark有着庞大的生态系统,具有成熟的ML库、图处理库、SQL框架等等。而Flink的生态系统相对较小,但它正在不断地发展壮大。 6. 规模性 Spark Streaming适用于规模小且不太复杂的项目。而Flink可扩展性更好,适用于更大、更复杂的项目。Flink也可以处理无限制的数据流。 综上所述,Spark Streaming和Flink都是流处理引擎,它们有各自的优缺点。在选择使用哪一个流处理引擎时,需要根据实际业务场景和需求进行选择。如果你的业务场景较为复杂,需要处理海量数据并且需要比较灵活的窗口计算支持,那么Flink可能是更好的选择;如果你只需要简单的流处理和一些通用的窗口计算,Spark Streaming是更为简单的选择。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值