社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  机器学习算法

如何提高机器学习项目的准确性?我们有妙招!

量化投资与机器学习 • 4 年前 • 443 次点击  


标星★公众号     爱你们

作者:Farhad Malik

编译:Guiyang Wang | 公众号翻译部

近期原创文章:

♥ 5种机器学习算法在预测股价的应用(代码+数据)

♥ Two Sigma用新闻来预测股价走势,带你吊打Kaggle

 2万字干货:利用深度学习最新前沿预测股价走势

♥ 一位数据科学PhD眼中的算法交易

♥ 基于RNN和LSTM的股市预测方法

♥ 如何鉴别那些用深度学习预测股价的花哨模型?

♥ 优化强化学习Q-learning算法进行股市

♥ WorldQuant 101 Alpha、国泰君安 191 Alpha

♥ 基于回声状态网络预测股票价格(附代码)

♥ AQR最最最新 | 计量经济学应用投资失败的7个原因

♥ 关于高盛在Github开源背后的真相!

♥ 新一代量化带货王诞生!Oh My God!

♥ 独家!关于定量/交易求职分享(附真实试题)

♥ Quant们的身份危机!

♥ 拿起Python,防御特朗普的Twitter!


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

 

总是先以数据为目标


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

 

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

 

普遍的数据质量问题

 

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


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


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


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


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

 

提高数据质量的技巧
 

用例1:填充缺失值

 

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

 

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

 

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

 

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


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


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


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


 

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



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

 

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

 

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


 

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


用例2:处理分类值


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

 

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

 

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

 

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


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


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

 


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

 

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

 

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

 

2.1 手动编码器


 

2.2 Sci Kit学习编码器



还有一个步骤经常被遗漏

 

我经常看到这种情况:在将文本值编码为数值后,我们将看到一些值将大于其他值。较高的值意味着它们具有更高的重要性。这可能导致我们的模型不同地处理特征。例如,时尚新闻类型的值可能为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()方法,它只将分类值转换为整数。

 


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

 

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


用例3:扩展特征

 

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

 

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


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

 

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

 

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


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


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

 

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


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



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

 

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


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

 

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

 

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

 

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


用例4:删除现有特征

 

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

 

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

 

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

 

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

 

解决方案:


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


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


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

 

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

 

 

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

 

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

 

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

 

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


用例6: 减少维度

 

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

 

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


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


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

 

微调模型参数

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

 

本节发现以下细节:


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


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


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

 

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


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


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

 

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

 

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

 

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



  • 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提供验证曲线模块:


 

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

 

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

 

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

 

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

 

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


 

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

 

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

 

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



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

 

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

 

总结

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


—End—


量化投资与机器学习微信公众号,是业内垂直于QuantMFE CST等专业的主流量化自媒体。公众号拥有来自公募、私募、券商、银行、海外等众多圈内10W+关注者。每日发布行业前沿研究成果和最新资讯。

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/34815
 
443 次点击