机器学习通用框架

作者:Datartisan
链接:https://zhuanlan.zhihu.com/p/22833471
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

每个数据科学家每天都要处理成吨的数据,而他们60%~70%的时间都在进行数据清洗和数据格式调整,将原始数据转变为可以用机器学习所识别的形式。本文主要集中在数据清洗后的过程,也就是机器学习的通用框架。这个框架是我在参加了百余场机器学习竞赛后的一个总结。尽管这个框架是非常笼统和概括的,但是绝对能发挥强大的作用,仍然可以在专业人员的运用下变成复杂、高效的方法。
整个过程使用Python来实现。

数据

在用机器学习的方法之前,我们应该先把数据转变为表格的形式,这个过程是最耗时、最复杂的。我们用下图来表示这一过程。

这一过程也就是将原始数据的所有的变量量化,进一步转变为含数据(Data)和标签(Labels)的数据框形式。这样处理过的数据就可以用来机器学习建模了。数据框形式的数据是机器学习和数据挖掘中最为通用的数据表现形式,它的行是数据抽样得到的样本,列代表数据的标签Y和特征X,其中标签根据我们要研究的问题不同,有可能是一列或多列。

标签的类型

根据我们要研究的问题,标签的类型也不一:

  • 单列0-1值(二分类问题,一个样本只属于一类并且一共只有两类)
  • 单列连续值(单回归问题,要预测的值只有一个)
  • 多列0-1值(多分类问题,同样是一个样本只属于一类但是一共有多类)
  • 多列连续值(多回归问题,能够预测多个值)
  • 多标签(多标签分类问题,但是一个样本可以属于多类)

评价指标

对于多个机器学习方法,我们必须找到一个评价指标来衡量它们的好坏。比如一个二元分类的问题我们一般选用AUC ROC或者仅仅用AUC曲线下面的面积来衡量。在多标签和多分类问题上,我们选择交叉熵或对数损失函数。在回归问题上我们选择常用的均方误差(MSE)。

Python库

在安装机器学习的几个库之前,应该安装两个基础库:numpy和scipy。

  • Pandas 处理数据最强大的库
  • scikit-learn 涵盖机器学习几乎所有方法的库
  • xgboost 优化了传统的梯度提升算法
  • keras 神经网络
  • matplotlib用来作图的库
  • tpdm 显示过程

机器学习框架

2015年我想出了一个自动式机器学习的框架,直到今天还在开发阶段但是不久就会发布,本文就是以这个框架作为基础的。下图展示了这个框架:

上面展示的这个框架里面,粉红色的线就是一些通用的步骤。在处理完数据并把数据转为数据框格式后,我们就可以进行机器学习过程了。

确定问题

确定要研究的问题,也就是通过观察标签的类别确定究竟是分类还是回归问题。

划分样本

第二步是将所有的样本划分为训练集(training data)验证集(validation data)。过程如下:

划分样本的这一过程必须要根据标签来做。比如对于一个类别不平衡的分类问题,必须要用分层抽样的方法,比如每种标签抽多少,这样才能保证抽出来的两个样本子集分布类似。在Python中,我们可以用scikit-learn轻松实现。

对于回归问题,那么一个简单的K折划分就足够了。但是仍然有一些复杂的方法可以使得验证集和训练集标签的分布接近,这个问题留给读者作为练习。

上面我用了样本全集中的10%作为验证集的规模,当然你可以根据你的样本量做相应的调整。
划分完样本以后,我们就把这些数据放在一边。接下来我们使用的任何一种机器学习的方法都要先在训练集上使用然后再用验证集检验效果。验证集和训练集永远都不能掺和在一起。这样才能得到有效的评价得分,否则将会导致过拟合的问题。

识别特征

一个数据集总是带有很多的变量(variables),或者称之为特征(features),他们对应着数据框的维度。一般特征的值有三种类型:数值变量、属性变量和文字变量。我们用经典的泰坦尼克号数据集来示例。

在这里生还(survival)就是标签,船舱等级(pclass)、性别(sex)和登船港口(embarked)是属性变量。而像年龄(age)、船上兄弟姐妹数量(sibsp)、船上父母孩子数量(parch)是数值变量。而姓名(name)这种文字变量我们认为这和生还与否没什么关系,所以我们决定不考虑。
首先处理数值型变量,这些变量几乎不需要任何的处理,常见的方式是正规化(normalization)。
处理属性变量通常有两步:

  • 把属性变量转变为标签
  • 把标签转变为二元数值由于泰坦尼克号数据集没有很好的文字变量来示范,那么我们就制定一个通用的规则来处理文字变量。把所有的文字变量组合到一起,然后用某种算法来处理并转变为数字

我们可以用CountVectorizer或者TfidfVectorizer来实现一般来说第二种方法往往比较优越,下面代码框中所展示的参数长期以来都取得了良好的效果。如果你对训练集数据采用了上述处理方式,那么也要保证对验证及数据做相同处理。

特征融合

特征融合是指将不同的特征融合,要区别对待密集型变量和稀疏型变量。

当我们把特征融合好以后,可以开始机器学习的建模过程了,在这里我们都是选择以决策树为基学习器的集成算法,主要有:

  • RandomForestClassifier
  • RandomForestRegressor
  • ExtraTreesClassifier
  • ExtraTreesRegressor
  • XGBClassifier
  • XGBRegressor
    但是不能直接把没有经过规范化的数值变量直接用线性模型拟合,可以用scikitlearn里面的规范化(Normalized)标准化(StandardScaler)命令分别对密集和稀疏的数据进行相应的处理。

特征降维和特征选择

如果以上方式处理后的数据可以产生一个优秀的模型,那就可以直接进行参数调整了。如果不行则还要继续进行特征降维和特征选择。降维的方法有以下几种:

简单起见,这里不考虑LDA和QDA。对于高维数据来说,PCA是常用的降维方式,对于图像数据一般我们选用10~15组主成分,当然如果模型效果会提升的话也可以选择更多的主成分。对于其他类型的数据我们一般选择50~60个主成分。

文字变量转变为稀疏矩阵后进行奇异值分解,奇异值分解对应scikit learn库中的TruncatedSVD语句。一般在TF-IDF中SVD主成分的数目大约在120~200之间,但是也可以采用更多的成分,但是相应的计算成本也会增加。
在特征降维之后我们可以进行建模的训练过程了,但是有的时候如果这样降维后的结果仍不理想,可以进行特征选择:特征选择也有很多实用的方法,比如说常用的向前或向后搜索。那就是一个接一个地把特征加入模型训练,如果加入一个新的特征后模型效果不好,那就不加入这一特征。直到选出最好的特征子集。对于这种方法有一个提升的方式是用AUC作为评价指标,当然这个提升也不是尽善尽美的,还是需要实际应用进行改善和调整的。
还有一种特征选择的方式是在建模的过程中就得到了最佳特征子集。比如我们可以观察logit模型的系数或者拟合一个随机森林模型从而直接把这些甄选后的特征用在其它模型中。

在上面的处理中应该选择一个小的estimator数目这样不会导致过拟合。还可以用梯度提升算法来进行特征选择,在这里我们建议用xgboost的库而不是sklearn库里面的梯度提升算法,因为前者速度快且有着更好的延展性。

对于稀疏的数据集我们可以用随机森林、xgboost或卡方等方式来进行特征选择。下面的例子中我们用了卡方的方法选择了20个特征出来。当然这个参数值20也是可以进一步优化的。

同样,以上我们用的所有方法都要记录储存用以交叉验证。

模型选择和参数调整

一般而言,常用的机器学习模型有以下几种,我们将在这些模型中选择最好的模型:

  • 分类问题

    • 随机森林
    • 梯度提升算法(GBM)
    • Logistic 回归
    • 朴素贝叶斯分类器
    • 支持向量机
    • k临近分类器
  • 回归问题
    • 随机森林
    • 梯度提升算法(GBM)
    • 线性回归
    • 岭回归
    • Lasso
    • 支持向量回归

下表中展示了每种模型分别需要优化的参数,这其中包含的问题太多太多了。究竟参数取什么值才最优,很多人往往有经验但是不会甘愿把这些秘密分享给别人。但是在这里我会把我的经验跟大家分享。

RS*是指没有一个确切的值提供给大家。

在我看来上面的这些模型基本会完爆其他的模型,当然这只是我的一家之言。下面是上述过程的一个总结,主要是强调一下要保留训练的结果用来给验证集验证,而不是重新用验证集训练!

在我长时间的实践过程中,我发现这些总结出来的规则和框架还是很有用的,当然在一些极其复杂的工作中这些方法还是力有不逮。生活从来不会完美,我们只能尽自身所能去优化,机器学习也是一样。

原文作者:Abhishek Thakur
原文链接:Approaching (Almost) Any Machine Learning Problem
译者:Cup

时间: 2024-10-28 22:16:17

机器学习通用框架的相关文章

.NET数据挖掘与机器学习开源框架

1.    数据挖掘与机器学习开源框架 1.1 框架概述 1.1.1 AForge.NET AForge.NET是一个专门为开发者和研究者基于C#框架设计的,他包括计算机视觉与人工智能,图像处理,神经网络,遗传算法,机器学习,模糊系统,机器人控制等领域.这个框架由一系列的类库组成.主要包括有: AForge.Imaging -- 一些日常的图像处理和过滤器 AForge.Vision -- 计算机视觉应用类库 AForge.Neuro -- 神经网络计算库AForge.Genetic -进化算法

汇总从代数角度与几何角度理解相似度计算方法(以机器学习Mahout框架为主线)

相似度的计算是数据挖掘与机器学习中的一个永恒的话题,为了能更好地理解与比较各种相似度计算的方法,能灵活运用到各种计算模型中,自己在研究机器学习之Mahout框架时,源代码中也实现了很多相似度计算方法,本文结合机器学习Mahout框架中各种相似度计算方法的实现,并且从代数角度和几何角度来理解相似度的计算方法.并阐述其优缺点,及自己的适用场景.本文通过总结和归纳,一共总结了9中距离测量方法,方法一到方法七是Mahout中完完本本实现了,其中前面是方面名,破折号后是Mahout中各方法实现的类名,本文

linux epoll机制对TCP 客户端和服务端的监听C代码通用框架实现

1 TCP简介 tcp是一种基于流的应用层协议,其"可靠的数据传输"实现的原理就是,"拥塞控制"的滑动窗口机制,该机制包含的算法主要有"慢启动","拥塞避免","快速重传". 2 TCP socket建立和epoll监听实现 数据结构设计 linux环境下,应用层TCP消息体定义如下: typedef struct TcpMsg_s { TcpMsgHeader head; void* msg; }TcpM

前端通用框架可行性研究报告之弹窗

1. 研究Web框架的动态加载技术 针对移动互联网环境下移动端内存.流量.电池资源有限,通过使用动态加载技术,将程序文件打散成多个小文件,以延迟加载技术(LazyLoading),实现按需加载提升用户体验,降低移动端的资源使用率.在业务和样式上,前端开发人员只需要在JS代码块头部引用需要的js库和css样式即可.在逻辑上,开发人员只需调用后端提供的接口进行读取与显示.这种技术的主要优点包括可维护性高.动态加载快.前端性能优化好. 2. 研究模块化构建技术 在前端人员开发移动应用项目的基础上,通过

Tensorflow实现Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图)

Mask R-CNN实例分割通用框架,检测,分割和特征点定位一次搞定(多图) 导语:Mask R-CNN是Faster R-CNN的扩展形式,能够有效地检测图像中的目标,同时还能为每个实例生成一个高质量的分割掩码. 对Facebook而言,想要提高用户体验,就得在图像识别上做足功夫. 雷锋网此前报道<Facebook AML实验室负责人:将AI技术落地的N种方法>(上 ,下篇)就提到,做好图像识别,不仅能让Facebook的用户更精准搜索到想要的图片,为盲人读出图片中包含的信息,还能帮助用户在

.net通用框架(一)

一直做软件实施,用过一些二次开发平台,最近看了一些大神写的框架,于是参考写了一个B/S通用权限框架,项目使用MVC4+EF5+EASYUI(.net framework4),开发环境vs2010+sqlserver2008 解决方案分为 1. web网站部分MIS 2. 公共通用组件项目MISCOMM 3. MODEL和DAL项目(含IDAL)这三部分是可以分成三个项目的,我在这就合在一起了 整个通用框架截图 通用权限管理系统由 1. 组织机构管理 2. 员工管理 3. 导航菜单 4. 操作权限

【Android数据库优化】利用注解实现SQLite通用框架抽取

在开发Android应用的过程中,少不了要用到SQLite数据库操作,各种增删查改...一般看来,对于不同的实体类的数据库操作,貌似我们只能使用不同的"增删查改"方法来实现,本次的想法就是,能不能抽取出一个通用的框架,使得对于不同的实体类的数据库操作,可以使用同一个接口的实现来做...废话少说,进入正题. 一.普通的数据库操作的实现 现在有一个Book的类,里面有三个成员变量,id,tittle和summary,其中id将会作为主键,且自增.Book代码如下: package com.

Android通用框架设计与完整电商APP开发

第1章 课程介绍及APP效果展示(Java版)本章概述了本课程大家能学到什么,老师如何讲解,为什么这么讲解,并介绍了框架的整体架构设计与模块分解,最后展示了用自己设计的框架开发出来的完整电商APP的效果图(服务端API快速搭建教程:http://www.imooc.com/article/19001) ...1-1 课程导学1-2 项目架构设计与模块分解 第2章 项目初始化本章将从零搭建一个空项目,实践项目搭建的过程,并额外教大家搭建一个基于Go语言的Web版Git服务器,实现代码托管的自举.(

爬虫通用框架

1 爬虫通用框架 2 import requests 3 4 def get_html_text(url): 5 try: 6 r =requests.get(url,timeout=20) 7 8 r.raise_for_status() 9 10 r.encoding = r.apparent_encoding 11 12 return r.text 13 14 except: 15 return "产生异常" 16 17 if __name__ == '__main__': 18