提高机器学习模型准确率的八大方法

摘要:
本文将分享8个经过证实的方法,使用这些方法可以建立稳健的机器学习模型。让我们看看这些已被证实的,用于改善模型准确率的方法。

原文连接:http://www.techweb.com.cn/network/system/2016-01-27/2269274.shtml

此文仅是一个小品文,详细理论请读论文,参考书籍。


前言:我的概述

机器学习面对的是一个受限有穷空间 到 一个扩大的有穷空间 的泛化问题。若假设空间足以覆盖真实的数据空间,机器学习方法可以弃之不用,专家的人工归纳可以覆盖所有的规则时,基于规则的判定系统是准确无疑的。

对于一个不能充分描述的真实数据空间,假设空间的可信度就大打折扣,基于假设空间建立的模型就一直在欠拟合和过拟合之间摇摆。

下面总结的几个方法可以从直观上解决一些基本问题,并能体现立竿见影的效果。

导语

提升一个模型的表现有时很困难。如果你们曾经纠结于相似的问题,那我相信你们中很多人会同意我的看法。你会尝试所有曾学习过的策略和算法,但模型正确率并没有改善。你会觉得无助和困顿,这是 90% 的数据科学家开始放弃的时候。

提高机器学习模型准确率的八大方法第1张

不过,这才是考验真本领的时候!这也是普通的数据科学家跟大师级数据科学家的差距所在。你是否曾经梦想过成为大师级的数据科学家呢?

如果是的话,你需要这 8 个经过证实的方法来重构你的模型。建立预测模型的方法不止一种。这里没有金科玉律。但是,如果你遵循我的方法(见下文),(在提供的数据足以用来做预测的前提下)你的模型会拥有较高的准确率。

我从实践中学习了到这些方法。相对于理论,我一向更热衷于实践。这种学习方式也一直在激励我。本文将分享 8 个经过证实的方法,使用这些方法可以建立稳健的机器学习模型。希望我的知识可以帮助大家获得更高的职业成就。

模型的开发周期有多个不同的阶段,从数据收集开始直到模型建立。

不过,在通过探索数据来理解(变量的)关系之前,建议进行假设生成(hypothesis generation)步骤(如果想了解更多有关假设生成的内容,推荐阅读 why-and-when-is-hypothesis-generation-important )。我认为,这是预测建模过程中最被低估的一个步骤。

花时间思考要回答的问题以及获取领域知识也很重要。这有什么帮助呢?它会帮助你随后建立更好的特征集,不被当前的数据集误导。这是改善模型正确率的一个重要环节。

在这个阶段,你应该对问题进行结构化思考,即进行一个把此问题相关的所有可能的方面纳入考虑范围的思考过程。

现在让我们挖掘得更深入一些。让我们看看这些已被证实的,用于改善模型准确率的方法。

1. 增加更多数据

持有更多的数据永远是个好主意。相比于去依赖假设和弱相关,更多的数据允许数据进行“自我表达”。数据越多,模型越好,正确率越高。

我明白,有时无法获得更多数据。比如,在数据科学竞赛中,训练集的数据量是无法增加的。但对于企业项目,我建议,如果可能的话,去索取更多数据。这会减少由于数据集规模有限带来的痛苦。

2. 处理缺失值和异常值

训练集中缺失值与异常值的意外出现,往往会导致模型正确率低或有偏差。这会导致错误的预测。这是由于我们没能正确分析目标行为以及与其他变量的关系。所以处理好缺失值和异常值很重要。

仔细看下面一幅截图。在存在缺失值的情况下,男性和女性玩板球的概率相同。但如果看第二张表(缺失值根据称呼“Miss”被填补以后),相对于男性,女性玩板球的概率更高。

提高机器学习模型准确率的八大方法第2张

左侧:缺失值处理前;右侧:缺失值处理后

从上面的例子中,我们可以看出缺失值对于模型准确率的不利影响。所幸,我们有各种方法可以应对缺失值和异常值:

ȱʧֵ:对于连续变量,可以把缺失值替换成平均值、中位数、众数。对于分类变量,可以把变量作为一个特殊类别看待。你也可以建立模型预测缺失值。KNN 为处理缺失值提供了很好的方法。想了解更多这方面内容,推荐阅读《Methods to deal and treat missing values》。

异常值:你可以删除这些条目,进行转换,分箱。如同缺失值,你也可以对异常值进行区别对待。想了解更多这方面内容,推荐阅读《How to detect Outliers in your dataset and treat them?》。

3. 特征工程学

这一步骤有助于从现有数据中提取更多信息。新信息作为新特征被提取出来。这些特征可能会更好地解释训练集中的差异变化。因此能改善模型的准确率。

假设生成对特征工程影响很大。好的假设能带来更好的特征集。这也是我一直建议在假设生成上花时间的原因。特征工程能被分为两个步骤:

特征转换:许多场景需要进行特征转换:

A) 把变量的范围从原始范围变为从 0 到 1 。这通常被称作数据标准化。比如,某个数据集中第一个变量以米计算,第二个变量是厘米,第三个是千米,在这种情况下,在使用任何算法之前,必须把数据标准化为相同范围。

B) 有些算法对于正态分布的数据表现更好。所以我们需要去掉变量的偏向。对数,平方根,倒数等方法可用来修正偏斜。

提高机器学习模型准确率的八大方法第3张

C) 有些时候,数值型的数据在分箱后表现更好,因为这同时也处理了异常值。数值型数据可以通过把数值分组为箱变得离散。这也被称为数据离散化。

创建新特征:从现有的变量中衍生出新变量被称为特征创建。这有助于释放出数据集中潜藏的关系。比如,我们想通过某家商店的交易日期预测其交易量。在这个问题上日期可能和交易量关系不大,但如果研究这天是星期几,可能会有更高的相关。在这个例子中,某个日期是星期几的信息是潜在的。我们可以把这个信息提取为新特征,优化模型。

4. 特征选择

特征选择是寻找众多属性的哪个子集合,能够最好的解释目标变量与各个自变量的关系的过程。

你可以根据多种标准选取有用的特征,例如:

所在领域知识:根据在此领域的经验,可以选出对目标变量有更大影响的变量。

可视化:正如这名字所示,可视化让变量间的关系可以被看见,使特征选择的过程更轻松。

统计参数:我们可以考虑 p 值,信息价值(information values)和其他统计参数来选择正确的参数。

PCA:这种方法有助于在低维空间表现训练集数据。这是一种降维技术。 降低数据集维度还有许多方法:如因子分析、低方差、高相关、前向后向变量选择及其他。

5. 使用多种算法

使用正确的机器学习算法是获得更高准确率的理想方法。但是说起来容易做起来难。

这种直觉来自于经验和不断尝试。有些算法比其他算法更适合特定类型数据。因此,我们应该使用所有有关的模型,并检测其表现。

提高机器学习模型准确率的八大方法第4张

来源:Scikit-Learn 算法选择图

6. 算法的调整

我们都知道机器学习算法是由参数驱动的。这些参数对学习的结果有明显影响。参数调整的目的是为每个参数寻找最优值,以改善模型正确率。要调整这些参数,你必须对它们的意义和各自的影响有所了解。你可以在一些表现良好的模型上重复这个过程。

例如,在随机森林中,我们有 max_features, number_trees, random_state, oob_score 以及其他参数。优化这些参数值会带来更好更准确的模型。

想要详细了解调整参数带来的影响,可以查阅《Tuning the parameters of your Random Forest model》。下面是随机森林算法在scikit learn中的全部参数清单:

RandomForestClassifier(n_estimators=10, criterion='gini', max_depth=None,min_samples_split=2, min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features='auto', max_leaf_nodes=None,bootstrap=True, oob_score=False, n_jobs=1, random_state=None, verbose=0, warm_start=False,class_weight=None)

7. 集成模型

在数据科学竞赛获胜方案中最常见的方法。这个技术就是把多个弱模型的结果组合在一起,获得更好的结果。它能通过许多方式实现,如:

Bagging (Bootstrap Aggregating) Boosting

想了解更多这方面内容,可以查阅《Introduction to ensemble learning》。

使用集成方法改进模型正确率永远是个好主意。主要有两个原因:

集成方法通常比传统方法更复杂; 传统方法提供好的基础,在此基础上可以建立集成方法。

注意!

到目前为止,我们了解了改善模型准确率的方法。但是,高准确率的模型不一定(在未知数据上)有更好的表现。有时,模型准确率的改善是由于过度拟合。

8. 交叉验证

如果想解决这个问题,我们必须使用交叉验证技术(cross validation)。交叉验证是数据建模领域最重要的概念之一。它是指,保留一部分数据样本不用来训练模型,而是在完成模型前用来验证。


免责声明:文章转载自《提高机器学习模型准确率的八大方法》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇JavaWeb学习记录(一)——response响应头之缓存设置与下载功能的实现python爬虫学习笔记(二十五)-Scrapy框架 Middleware下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

C/C++指针内存分配小细节

char *pc = NULL; pc = new char[0]; pc[0] = '1'; 相信初学者看见上面这段代码,都会觉得奇怪,new char[n]中的n指定给指针变量分配多少内存空间,而n=0时代表什么呢? 其实上面的程序编译、运行都是正确的。因为编译器识别到指定大小为0时,会自动为其分配1BYTE的内存空间。 尝试过的小伙伴会发现,给p[1...

分水岭算法实现图像分割及其应用

将图像分割为多个同质区域, 分水岭算法是一种图像区域分割法,在分割的过程中,它会把跟临近像素间的相似性作为重要的参考依据,从而将在空间位置上相近并且灰度值相近的像素点互相连接起来构成一个封闭的轮廓,封闭性是分水岭算法的一个重要特征。 watershed原理:对图像中部分区域做标记,表明已知,根据这个已知区域确定其他区域(参考点问题) void waters...

Shell 变量

Shell 变量 定义变量时,变量名不加美元符号($,PHP语言中变量需要),如: your_name="runoob.com" 注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则: 命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号...

spark教程(14)-共享变量

spark 使用的架构是无共享的,数据分布在不同节点,每个节点有独立的 CPU、内存,不存在全局的内存使得变量能够共享,驱动程序和任务之间通过消息共享数据 举例来说,如果一个 RDD 操作使用了驱动程序中的变量,spark 会将这个变量的副本和 task 一起发送给 executor 中的执行者,对该变量的更新只存在于 task 的内部,并不会回传给驱动程...

RF设置全局变量

一般情况下,我们的测试用例会有很多公用数据,比如在测试购票功能的时候,可能是一直使用同一个列车号,这时候我们就没有必要在每一个Case中都去新建一个列车班次,而是设置一个全局变量: 1、Set Variable与Set Global Variable 翻译一下就可以知道这两个RF内置函数的区别:设置变量、设置全局变量 用法上的区别呢?前面已经说过,我们可...

[转]解决Xilinx Platform Studio无法打开 设置 环境变量

我安装好Xilinx ISE Design Suit 12.3后,ISE可以正常打开,但是Xilinx Platform Studio却无法打开,弹出的DOS窗口提示说——“Environment variable XILINX is not set - A compatible version of ISE tools must be installed...