Joshua Gordon《TensorFlow 2.0讲解》PPT

Tensorflow2.0 对于新手来说更为易用,而对于老手来说,功能更为强大,Josh Gordon 为我们介绍了TensorFlow2.0  的一些新的特征与使用技巧。

在构建模型方面,针对不同的使用人群,TensorFlow2.0 提供了不同层面的 API,针对刚接触 TensorFlow 的新手,提供了Sequential API, 针对工程师,开放了 FunctionalAPI 与 build-in 层,针对有更高需求的工程师,开放了 FunctionalAPI 与可定制的层,评估指标,损失函数等,而针对科研工作者,开放了 Subclassing,可以定制一切函数。

在训练模型方面,从简单到复杂也分很多层次。从快速实验的 model.fit(),到定制回调函数 callbacks,到定制训练循环 batch (使用 GAN 时很有效),到完全定制训练过程,包括优化算法等 (GradientTape).

在数据方面,提供了 tensorflow_datasets,能够轻松地加载数据集。

在并行训练方面,得益于分布式策略,无需改变代码,就可以在多台机器、多个 GPU 上训练(MirroredStrategy, MultiWorkerMirroredStrategy)。

教程最后还介绍了两个项目:TinyML: 轻量级的机器学习项目 与 TF.js.

Joshua Gordon 《TensorFlow 2.0讲解》

数据分析技能全流程知识细节

进入一个全新的领域之前,最好能够对这个领域的知识体系、技能模型有全面的了解,这样你能知道哪些是应该学习,哪些是暂时不用学的,知道什么样的路径适合自己的状况。

基于数据分析这个技能,DC 学院 —— 准备了一份『超级技能地图』,帮你快速认识数据分析的技能模块,以及不同的分支下,有哪些必备的技能,以及有哪些好用的资源。

这一张图,可以帮助你快速认识数据分析这个领域,即便你从未接触过相关的内容,也可以很清晰地建立数据分析知识框架。

这是数据分析小白必备的数据分析技能图,因为包含了 Python 数据分析全方位的技能体系,比如数据获取、SQL 数据库、Python、统计学、数据分析核心模块、可视化、报告撰写等等都有详细拆解。

高效的学习路径是什么?就是按这样的顺序循序渐进,你会知道每个部分需要完成的目标是什么,需要学习哪些知识点,哪些知识是暂时不必要的。

1. 数据获取

一般数据获取有内部和外部两种渠道,内部数据可以通过企业数据库提取,需要掌握 SQL 相关的技能。

外部数据则可以通过公开数据集和爬取网络数据实现,需要了解相关的数据开放站点,以及掌握必要的 Python 爬虫技能。

数据获取
数据获取

2. SQL 数据库

SQL 技能是数据分析师职位必备的技能之一,需要你对企业的数据库进行管理,能够正常地存储和提取数据。当然 SQL 需要掌握的技能并不难,了解基本的语法,掌握基本的增删改查就可以满足常规的需求了。

SQL 数据库
SQL 数据库

3. 数据分析必备统计学

如果说数据分析需要什么数学基础,那统计学应该是设计最多的了,但不需要非常深入,因为大多数数据分析用到的无非是统计量、数据分布等基础知识。

数据分析必备统计学
数据分析必备统计学

4. 数据分析必备 Python 基础

利用 Python 进行数据分析,那 Python 的基础就非常重要了,这意味着你后续是否能够正常地用 Python 代码来实现你的分析想法。

基本的编程规范、数据结构、自定义函数 、控制语句(条件语句、循环语句)、文件读写和模块使用都是需要重点掌握的点。

数据分析必备 Python 基础
数据分析必备 Python 基础

5. 数据分析核心工具

在 Python 数据分析的体系内,Numpy / Pandas / Matplotlib 三个核心库是绕不过去的。也是这三个工具,能够让你实现数据清洗、科学计算、数据分析、数据可视化等核心的工作。

掌握这些,你就完全可以去实现描述型数据分析、探索型数据分析,再加上 Sklearn,你可以去实现预测型数据分析,一个完整的数据分析项目,也不过云云。

数据分析核心工具
数据分析核心工具

6. 数据报告撰写

数据报告撰写虽然看起来像是文档整理类的工作,但也是非常重要的,因为直接决定了你最终的输出成果。

对于如何撰写一份优秀的数据报告,问题拆解的逻辑、数据指标的选取、用户受众需求的分析、图形化的呈现形式都是非常重要的点。

数据报告撰写
数据报告撰写

零基础入门PyTorch深度学习

Pytorch 是 Torch 的 Python 版本,是由 Facebook 开源的神经网络框架,专门针对 GPU 加速的深度神经网络(DNN)编程。Torch 是一个经典的对多维矩阵数据进行操作的张量(Tensor )库,在机器学习和其他数学密集型应用有广泛应用。与 Tensorflow 的静态计算图不同,Pytorch 的计算图是动态的,可以根据计算需要实时改变计算图。

Vipul Vaibhaw 在 Github 开源了一份关于 Pytorch 深度学习的书册,《First steps towards Deep Learning with PyTorch》,这是一本关于深度学习的开源书籍。这本书应该是非数学的,迎合了那些没有深度学习经验,数学知识和兴趣很少的读者。这本书旨在帮助读者迈出深度学习的『第一步』。

主要内容覆盖了:

  1. 理解人工神经网络
  2. PyTorch 介绍
  3. 如何让计算机看见?
  4. 如何让计算机记忆?
  5. 下一步学习

GitHub地址项目 GitHub 地址

吴恩达《机器学习训练秘籍》完整中文版 – 更新

此前,我们发布了『吴恩达《机器学习训练秘籍》完整中文版』信息,目前该开源项目已迁移到新的地址。请在新的地址开始在线阅读《机器学习训练秘籍》样稿,相关代码开源地址如下:

Machine Learning Yearning
Machine Learning Yearning

GitHub地址项目 GitHub 地址

微软研究院新版书籍《数据科学基础》PDF 下载

随着大数据、深度学习在学术界和工业界的普及,人们越来越认识到数据对于科研和应用的重要性。虽然现在相关的工具和框架大大降低了构建数据应用的门槛,数据科学基础对应用的构建依然起着核心的作用。本文介绍微软研究院新版书籍《数据科学基础》。

计算机科学学科从 60 年代兴起,当时人们聚焦于编程语言、编译器、操作系统和相关的数学理论。70年代左右,算法被加入作为计算机科学理论中重要的一员。随着计算机的普及,自然科学、商业等领域有着更强的发现、收集和存储数据的能力。如何理解和应用这些数据成为了现在的一个刚需。互联网和社交网络成为人们日常生活一部分的事实,反映了数据理论的机遇与挑战。

微软研究院的新版书籍《Foundations of Data Science》(《数据科学基础》)详细介绍了许多重要的数据科学理论基础。这些理论基础例如奇异值分解(SVD)、马尔科夫链、随机游走等是支撑现在广泛使用在数据应用中的算法的支柱,如推荐系统、语音识别、图神经网络等。《数据科学基础》提纲及下载链接如下:

  • 简介
  • 高维空间
  • 最佳拟合子空间和奇异值分解(SVD)
  • 随机游走和马尔科夫链
  • 机器学习
  • 面向海量数据问题的算法:流式、概述和采样
  • 聚类
  • 随机图
  • 主题模型、非负矩阵分解、隐马尔科夫模型和图模型
  • 其他主题
  • 小波

Foundations of Data Science

《人工智能产品经理的新起点》PPT

原作者:黄钊;PPT 目录大纲:

  1. AI PM 在做什么、如何做?
    AI 的时代背景及真正瓶颈
    如何选行业方向 in AI
    如何找场景痛点 in AI 应用层 (2B/2C)
    如何做体验设计 in 对话聊天产品
  2. 如何从互联网 PM 转型成 AI PM
    AI PM 能力模型
    AI 技术概念厘清
    如何转型
  3. 人工智能的本质及脑洞 AI 的过去和现在
    AI 的未来和突破口
    AI 的本质、效用和终局
  • 下载地址 1:https://pan.baidu.com/s/1mjM5PQo 密码: gxmw
  • 下载地址 2:https://pan.baidu.com/s/1brbHw7d 密码: 9t5a

本地下载:人工智能产品经理的新起点

TensorFlow 2.0 实战教程

这是一份来自 IJCAI 2019上的一个 TensorFlow 2.0 实操教程,这个教程包含 117 页 PPT,由 Google 资深开发人员 Josh Gordon 讲授,提供了最新 TensorFlow 2.0 的实操介绍,重点介绍了最佳实践。读者将学习编写几种类型的神经网络(Dense, Convolutional, 和 Recurrent),以及生成对抗网络(Generative Adversarial Network)。

Hands on TensorFlow 2.0
Hands on TensorFlow 2.0

TensorFlow 是一个基于数据流编程(Dataflow Programming)的符号数学系统,被广泛应用于各类机器学习(Machine Learning)算法的编程实现,其前身是谷歌的神经网络算法库 DistBelief。

Tensorflow 拥有多层级结构,可部署于各类服务器、PC 终端和网页并支持 GPU 和 TPU 高性能数值计算,被广泛应用于谷歌内部的产品开发和各领域的科学研究。

如果你想学习新发布的 TensorFlow 2.0 版本,那么本教程非常适合您。不过您需要事先熟悉一些基本的机器学习知识。该教程将介绍深度学习中的关键概念。本教程的目标是帮助您高效地开始使用 TensorFlow,这样您就可以继续自学了。

《Hands on TensorFlow 2.0》教程下载

《动手学深度学习》PyTorch 版

我们知道,作为 MXNet 的作者之一,李沐的这本《动手学深度学习》也是使用 MXNet 框架写成的。但是很多入坑机器学习的萌新们,使用的却是 PyTorch。如果有教材对应的 PyTorch 实现代码就更好了!今天就给大家带来这本书的 PyTorch 实现源码。最近,来自印度理工学院的数据科学小组,把《动手学深度学习》从 MXNet 『翻译』成了 PyTorch,经过 3 个月的努力,这个项目已经基本完成,并登上了 GitHub 热榜。

d2l-pytorch
d2l-pytorch

其中,每一小节都是可以运行的 Jupyter 记事本,你可以自由修改代码和超参数来获取及时反馈,从而积累深度学习的实战经验。

GitHub地址项目 GitHub 地址

滴滴开源的 AoE:工程实践中的图像处理

近期,滴滴开源了 AOE 项目,很多人还是一脸懵逼,不太清楚 AOE 到底是干什么的,所以今天我们再来听听官方工程师是怎么介绍的吧,不信你还是听不懂:近期我们开发了一个银行卡 OCR 项目。需求是用手机对着银行卡拍摄以后,通过推理,可以识别出卡片上的卡号。

工程开发过程中,我们发现手机拍摄以后的图像,并不能满足模型的输入要求。以 Android 为例,从摄像头获取到的预览图像是带 90 度旋转的 NV21 格式的图片,而我们的模型要求的输入,只需要卡片区域这一块的图像,并且需要转成固定尺寸的 BGR 格式。所以在图像输入到模型之前,我们需要对采集到的图像做图像处理,如下图所示:

OCR 案例
OCR 案例

在开发的过程中,我们对 YUV 图像格式和 libyuv 进行了研究,也积累了一些经验。下文我们结合银行卡 OCR 项目,讲一讲里面涉及到的一些基础知识:

  1. 什么是YUV格式
  2. 如何对YUV图像进行裁剪
  3. 如何对YUV图像进行旋转
  4. 图像处理中的Stride
  5. 如何进行缩放和格式转换
  6. libyuv的使用

想要对采集到的 YUV 格式的图像进行处理,首先我们需要了解什么是 YUV 格式。

什么是 YUV 格式

YUV 是一种颜色编码方法,YUV,分为三个分量:

  • 『Y』 表示明亮度(Luminance 或 Luma),也就是灰度值;
  • 『U』和『V』 表示的则是色度(Chrominance 或 Chroma)。
  • 主流的采样方式有三种,YUV4:4:4,YUV4:2:2,YUV4:2:0。

这部分专业的知识,网络上有详细的解释。我们简单理解一下,RGB 和 YUV 都使用三个值来描述一个像素点,只是这三个值的意义不同。通过固定的公式,我们可以对 RGB 和 YUV 进行相互转换。工程里常见的 I420,NV21,NV12,都是属于 YUV420,每四个 Y 共用一组 UV 分量。YUV420 主要包含两种格式,YUV420SP 和 YUV420P。

  • YUV420SP,先排列Y分量,UV分量交替排列,例如:NV12: YYYYYYYY UVUV 和 NV21: YYYYYYYY VUVU (上文中我们在安卓上采集到的图像就是这种格式)。

    YUV420SP
    YUV420SP
  • YUV420P,先排列U(或者V)分量,再排列V(或者U)分量。例如:I420: YYYYYYYY UU VV 和 YV12: YYYYYYYY VV UU。

    YUV420P
    YUV420P

了解了 YUV 的图像格式以后,我们就可以尝试对图片进行裁剪和旋转了。我们的想法是先在图片上裁剪出银行卡的区域,再进行一次旋转。

对图片进行裁剪和旋转
对图片进行裁剪和旋转

如何对 YUV 图像进行裁剪

YUV420SP 和 YUV420P 裁剪的过程类似,以 YUV420SP 为例,我们要裁剪图中的这块区域:

YUV420SP
YUV420SP

在图上看起来就非常明显了,只要找到裁剪区域对应的 Y 分量和 UV 分量,按行拷贝到目标空间里就可以了。

我们再来看一张图,是否可以用上面的方法来裁剪图中的这块区域呢?

答案是否定的,如果你按照上面说的方法来操作,最后你会发现你保存出来的图,颜色基本是不对的,甚至会有内存错误。原因很简单,仔细观察一下,当 ClipLeft 或者 ClipTop 是奇数的时候,会导致拷贝的时候 UV 分量错乱。如果把错误的图像数据输入到模型里面,肯定是得不到我们期望的结果的。所以我们在做裁剪的时候,需要规避掉奇数的场景,否则你会遇到意想不到的结果。

如何对 YUV 图像进行旋转?

对上文裁剪后的图像做顺时针 90 度旋转,相比裁剪,转换要稍微复杂一些。

基本方法是一样的,拷贝对应的 Y 分量和 UV 分量到目标空间里。

在了解了裁剪和旋转的方法以后,我们发现在学习的过程中不可避免地遇到了 Stride 这个词。那它在图像中的作用是什么呢?

图像处理中的 Stride

Stride 是非常重要的一个概念,Stride 指在内存中每行像素所占的空间,它是一个大于等于图像宽度的内存对齐的长度。如下图所示:

Stride 是非常重要的一个概念
Stride 是非常重要的一个概念

回过头来看我们上面说到的裁剪和旋转,是否有什么问题?以 Android 上的 YV12 为例,Google Doc 里是这样描述的:

YV12 is a 4:2:0 YCrCb planar format comprised of a WxH Y plane followed by (W/2) x (H/2) Cr and Cb planes.

This format assumes
• an even width
• an even height
• a horizontal stride multiple of 16 pixels
• a vertical stride equal to the height

y_size = stride * height
c_stride = ALIGN(stride / 2, 16)
c_size = c_stride * height / 2
size = y_size + c_size * 2
cr_offset = y_size
cb_offize = y_size + c_size

所以在不同的平台和设备上,需要按照文档和 stride 来进行计算。例如计算 Buffer 的大小,很多文章都是简单的 “*3/2” ,仔细考虑一下,这其实是有问题的。如果不考虑 stride ,会有带来什么后果?如果 “运气” 足够好,一切看起来很正常。“运气”不够好,你会发现很多奇怪的问题,例如花屏,绿条纹,内存错误等等。这和我们平常工作中遇到的很多的奇怪问题一样,实际上背后都是有深层次的原因的。

经过裁剪和旋转,我们只需要把图像缩放成模型需要的尺寸,转成模型需要的 BGR 格式就可以了。

如何进行缩放和格式转换

以缩放为例,有临近插值,线性插值,立方插值,兰索斯插值等算法。YUV 和 RGB 之间的转换,转换的公式也有很多种,例如量化和非量化。这些涉及到专业的知识,需要大量的时间去学习和理解。

这么多的转换,我们是否都要自己去实现?

很多优秀的开源项目已经提供了完善的 API 给我们调用,例如 OpenCV,libyuv 等。我们需要做的是理解基本的原理,站在别人的肩膀上,做到心里有数,这样即使遇到问题,也能很快地定位解决。

经过调查和比较,我们选择了 libyuv 来做图像处理的库。libyuv 是 Google 开源的实现各种 YUV 与 RGB 之间相互转换、旋转、缩放的库。它是跨平台的,可在 Windows、Linux、Mac、Android 等操作系统,x86、x64、arm 架构上进行编译运行,支持 SSE、AVX、NEON等SIMD 指令加速。

libyuv 的使用

引入 libyuv 以后,我们只需要调用 libyuv 提供的相关 API 就可以了。在银行卡 OCR 工程使用的过程中,我们主要遇到了 2 个问题:

  1. 在Android开发的初期,我们发现识别率和我们的期望存在一定的差距。我们怀疑是模型的输入数据有问题,通过排查发现是使用libyuv的时候,没注意到它是little endian。例如这个方法:int BGRAToARGB(…),BGRA little endian,在内存里顺序实际是ARGB。所以在使用的时候需要弄清楚你的数据在内存里是什么顺序的,修改这个问题后识别率达到了我们的预期。
  2. 在大部分机型上运行正常,但在部分机型上出现了 Native 层的内存异常。

通过多次定位,最后发现是 stride 和 buffersize 的计算错误引起的。由于 libyuv 是 C/C++ 实现的,使用的时候不是那么的便捷。为了提高开发效率,我们提取了一个 AoeVision 组件,对libyuv封装了一层 JNI 接口,包括了一些基础的转换和一些 Sample,这样使用起来更加简单方便,AoeVision组件还在不断开发和完善中。

GitHub地址项目 GitHub 地址

联合国教科文组织正式发布《北京共识 – 人工智能与教育》

近日,联合国教科文组织正式发布国际人工智能与教育大会成果文件《北京共识 – 人工智能与教育》。这是联合国教科文组织首个为利用人工智能技术实现 2030 年教育议程提供指导和建议的重要文件。

2019 年 5 月,中国政府与联合国教科文组织合作在北京举办国际人工智能与教育大会。会议以『规划人工智能时代的教育:引领与跨越』为主题。国家主席习近平为大会致贺信。国务院副总理孙春兰出席会议并致辞。来自全球 100 多个国家、10 余个国际组织的约 500 位代表共同探讨智能时代教育发展大计,审议并通过成果文件《北京共识》,形成了国际社会对智能时代教育发展的共同愿景。

《北京共识》以联合国6种官方语言发布,共 44 条,从智能时代的教育政策规划、教育管理和供给、教学教师、学习评价、价值观和技能、全民终身学习、公平包容的应用、性别平等、伦理、监测评估和研究以及筹资和国际合作等方面,分别对教科文组织会员国政府和利益攸关方、国际组织及合作伙伴、教科文组织总干事提出建议。

《北京共识》提出,各国要引领实施适当的政策应对策略,通过人工智能与教育的系统融合,全面创新教育、教学和学习方式,并利用人工智能加快建设开放灵活的教育体系,确保全民享有公平、适合每个人且优质的终身学习机会,从而推动可持续发展目标和人类命运共同体的实现。

《北京共识》强调,要采用人工智能平台和基于数据的学习分析等关键技术构建可支持人人皆学、处处能学、时时可学的综合型终身学习体系。要确保人工智能促进全民优质教育和学习机会,无论性别、残疾状况、社会和经济条件、民族或文化背景以及地理位置如何。

《北京共识》倡议,要支持对与新兴人工智能发展影响相关的前沿问题进行前瞻性研究,推动探索利用人工智能促进教育创新的有效战略和实践模式,以期构建一个在人工智能与教育问题上持有共同愿景的国际社会。

序言

1. 我们 —— 国际人工智能与教育大会与会者,包括 50 名政府部长和副部长、来自 100 多个会员国以及联合国机构、学术机构、民间社会和私营部门的约 500 名代表,于 2019 年 5 月 16 –18 日齐聚中国北京。我们衷心感谢联合国教育、科学及文化组织和中华人民共和国政府合作举办此次大会,以及北京市政府的热情欢迎和盛情款待。

2. 我们重申了《2030 年可持续发展议程》中的承诺,特别是可持续发展目标 4 及其各项具体目标,并讨论了教育和培训系统在实现可持续 发展目标 4 时所面临的挑战。我们致力于引领实施适当的政策应对策略,通过人工智能与教育的系统融合,全面创新教育、教学和学习方式,并利用人工智能加快建设开放灵活的教育体系,确保全民享有公平、适合每个人且优质的终身学习机会,从而推动可持续发展目标和人类命运共同体的实现。

3. 我们回顾 2015 年通过的关于利用信息通信技术(信通技术)实现可持续发展目标 4 的《青岛宣言》,其中指出必须利用新兴技术强化教育体系、拓展全民教育机会、提高学习质量和效果以及强化公平和更高效的教育服务供给;当我步入人工智能广泛应用的时代时,我们认识到重申并更新这一承诺的迫切需要。

4. 我们研究了人工智能演变的最新趋势及其对人类社会、经济和劳动力市场以及教育和终身学习体系的深远影响。我们审视了人工智能对于未来工作和技能养的潜在影响,并探讨了其在重塑教育、教学和学习的核心基础方面的潜力。

5. 我们认识到人工智能领域的复杂性和迅猛发展速度、对人工智能的多元化理解、宽泛的外延和各种差异较大的定义、以及在不同场景中的多样化应用及其引发的伦理挑战。

6. 我们还认识到人类智能的独特性。忆及《世界人权宣言》中确立的原则,我们重申联合国教科文组织在人工智能使用方面的人文主义取向,以期保护人权并确保所有人具备在生活、学习和工作中进行有效人机合作以及可持续发展所需的相应价值观和技能。

7. 我们还申明,人工智能的开发应当为人所控、以人为本;人工智能的部署应当服务于人并以增强人的能力为目的;人工智能的设计应合乎伦理、避免歧视、公平、透明和可审核;应在整个价值链全过程中监测并评估人工智能对人和社会的影响。

我们建议,联合国教科文组织会员国政府及其他利益攸关方根据其法律、公共政策和公共惯例,考虑实施以下行动,应对人工智能带来的相关教育机遇和挑战:

规划教育人工智能政策

8. 认识到人工智能的多学科特性及其影响;确保教育人工智能与公共政策特别是教育政策有机配合;采取政府全体参与、跨部门整合和多方协作的方法规划和治理教育人工智能政策;根据本地在实现可持续发展目标 4 及其具体目标以及其他可持续发展目标的工作中遇到的挑战,确定政策的战略优先领域。从终身学习的角度规划并制定与教育政策接轨和有机协调的全系统教育人工智能战略。

9. 意识到推行教育人工智能政策和工程的巨大投资需求。审慎权衡不同教育政策重点之间的优先级,确定不同的筹资渠道,包括国家经费(公共和私人)、国际资金和创新性的筹资机制。还要考虑到人工智能在合并和分析多个数据来源从而提高决策效率方面的潜力。

人工智能促进教育的管理和供给

10. 意识到应用数据变革基于实证的政策规划方面的突破。考虑整合或开发合适的人工智能技术和工具对教育管理信息系统(EMIS)进行升级换代,以加强数据收集和处理,使教育的管理和供给更加公平、包容、开放和个性化。

11. 还考虑在不同学习机构和学习场境中引入能够通过运用人工智能实现的新的教育和培训供给模式,以便服务于学生、教职人员、家长和社区等不同行为者。

人工智能赋能教学和教师

12. 注意到虽然人工智能为支持教师履行教育和教学职责提供了机会,但教师和学生之间的人际互动和协作应确保作为教育的核心。意识到教师无法被机器取代,应确保他们的权利和工作条件受到保护。

13. 在教师政策框架内动态地审视并界定教师的角色及其所需能力,强化教师培训机构并制定适当的能力建设方案,支持教师为在富含人工智能的教育环境中有效工作做好准备。

人工智能促进学习和学习评价

14. 认识到人工智能在支持学习和学习评价潜能方面的发展趋势,评估并调整课程,以促进人工智能与学习方式变革的深度融合。在使用人工智能的惠益明显大于其风险的领域,考虑应用现有的人工智能工具或开发创新性人工智能解决方案,辅助不同学科领域中明确界定的学习任务,并为开发跨学科技能和能力所需的人工智能工具提供支持。

15. 支持采用全校模式围绕利用人工智能促进教学和学习创新开展试点测试,从成功案例中汲取经验并推广有证据支持的实践模式。

16. 应用或开发人工智能工具以支持动态适应性学习过程;发掘数据潜能,支持学生综合能力的多维度评价;支持大规模远程评价。

培养人工智能时代生活和工作所需的价值观和技能

17. 注意到采用人工智能所致的劳动力市场的系统性和长期性变革,包括性别平等方面的动态。更新并开发有效机制和工具,以预测并确认当前和未来人工智能发展所引发的相关技能需求,以便确保课程与不断变化的经济、劳动力市场和社会相适应。将人工智能相关技能纳入中小学学校课程和职业技术教育与培训(TVET)以及高等教育的资历认证体系中,同时考虑到伦理层面以及相互关联的人文学科。

18. 认识到进行有效的人机协作需要具备一系列人工智能素养,同时不能忽视对识字和算术等基本技能的需求。采取体制化的行动,提高社会各个层面所需的本人工智能素养。

19. 制定中长期规划并采取紧急行动,支持高等教育及研究机构开发或加强课程和研究项目,培养本地人工智能高端人才,以期建立一个具备人工智能系统设计、编程和开发的大型本地人工智能专业人才库。

人工智能服务于提供全民终身学习机会

20. 重申终身学习是实现可持续发展目标4的指导方针,其中包括正规、非正规和非正式学习。采用人工智能平台和基于数据的学习分析等关键技术构建可支持人人皆学、处处能学、时时可学的综合型终身学习体系,同时尊重学习者的能动性。开发人工智能在促进灵活的终身学习途径以及学习结果累积、承认、认证和转移方面的潜力。

21. 意识到需要在政策层面对老年人尤其是老年妇女的需求给予适当关注,并使他们具备人工智能时代生活所需的价值观和技能,以便为数字化生活消除障碍。规划并实施有充足经费支持的项目,使较年长的劳动者具备技能和选择,能够随自己所愿保持在经济上的从业身份并融入社会。

促进教育人工智能应用的公平与包容

22. 重申确保教育领域的包容与公平以及通过教育实现包容与公平,并为所有人提供终身学习机会,是实现可持续发展目标 4 — 2030 年教育的基石。重申教育人工智能方面的技术突破应被视为改善最弱势群体受教育机会的一个契机。

23. 确保人工智能促进全民优质教育和学习机会,无论性别、残疾状况、社会和经济条件、民族或文化背景以及地理位置如何。教育人工智能的开发和使用不应加深数字鸿沟,也不能对任何少数群体或弱势群体表现出偏见。

24. 确保教学和学习中的人工智能工具能够有效包容有学习障碍或残疾的学生,以及使用非母语学习的学生。

性别公平的人工智能和应用人工智能促进性别平等

25. 强调数字技能方面的性别差距是人工智能专业人员中女性占比低的原因之一,且进一步加剧了已有的性别不平等现象。

26. 申明我们致力于在教育领域开发不带性别偏见的人工智能应用程序,并确保人工智能开发所使用的数据具有性别敏感性。同时,人工智能应用程序应有利于推动性别平等。

27. 在人工智能工具的开发中促进性别平等,通过提升女童和妇女的人工智能技能增强她们的权能,在人工智能劳动力市场和雇主中推动性别平等。

确保教育数据和算法使用合乎伦理、透明且可审核

28. 认识到人工智能应用程序可能带有不同类型的偏见,这些偏见是训练人工智能技术所使用和输入的数据自身所携带的以及流程和算法的构建和使用方式中所固有的。认识到在数据开放获取和数据隐私保护之间的两难困境。注意到与数据所有权、数据隐私和服务于公共利益的 数据可用性相关的法律问题和伦理风险。注意到采纳合乎伦理、注重隐私和通过设计确保安全等原则的重要性。

29. 测试并采用新兴人工智能技术和工具,确保教师和学习者的数据隐私保护和数据安全。支持对人工智能领域深层次伦理问题进行稳妥、长期的研究,确保善用人工智能,防止其有害应用。制定全面的数据保 护法规以及监管框架,保证对学习者的数据进行合乎伦理、非歧视、公平、透明和可审核的使用和重用。

30. 调整现有的监管框架或采用新的监管框架,以确保负责任地开发和使用用于教育和学习的人工智能工具。推动关于人工智能伦理、数据隐私和安全相关问题,以及人工智能对人权和性别平等负面影响等问题的研究。

监测、评估和研究

31. 注意到缺乏有关人工智能应用于教育所产生影响的系统性研究。支持就人工智能对学习实践、学习成果以及对新学习形式的出现和验证产生的影响开展研究、创新和分析。采取跨学科办法研究教育领域的人工智能应用。鼓励跨国比较研究及合作。

32. 考虑开发监测和评估机制,衡量人工智能对教育、教学和学习产生的影响,以便为决策提供可靠和坚实的证据基础。

我们建议活跃在这一领域的国际组织和伙伴考虑实施下列行动:

筹资、伙伴关系和国际合作

33. 基于各国自愿提交的数据,监测并评估各国之间人工智能鸿沟和人工智能发展不平衡现象,并且注意到能够获取使用和开发人工智能和无法使用人工智能的国家之间两极分化的风险。重申解决这些忧虑的重要性,并特别优先考虑非洲、最不发达国家、小岛屿发展中国家以及受冲突和灾害影响的国家。

34. 在『2030 年教育』的全球和地区架构范围内,协调集体行动,通过分享人工智能技术、能力建设方案和资源等途径,促进教育人工智能的公平使用,同时对人权和性别平等给予应有的尊重。

35. 支持对与新兴人工智能发展影响相关的前沿问题进行前瞻性研究,推动探索利用人工智能促进教育创新的有效战略和实践模式,以期构建一个在人工智能与教育问题上持有共同愿景的国际社会。

36. 确保国际合作有机配合各国在教育人工智能开发和使用以及跨部门合作方面的需求,以便加强人工智能专业人员在人工智能技术开发方面的自主性。加强信息共享和有良好前景应用模式的交流,以及各国之间的协调和互补协作。

37. 通过联合国教科文组织移动学习周等方式并借助其他联合国机构,为各国之间交流有关教育人工智能领域的监管框架、规范文本和监管方式提供适当的平台,从而支持在发掘人工智能潜力促进可持续发展目标4方面开展南南合作和北南南合作,并从中受益。

38. 建立多利益攸关方伙伴关系并筹集资源,以便缩小人工智能鸿沟,增加对教育人工智能领域的投资。

我们请联合国教科文组织总干事努力实施下列行动:

39. 建立一个『人工智能服务于教育』的平台,作为开源人工智能课程、人工智能工具、教育人工智能政策实例、监管框架和最佳做法的信息交流中心,以期推动利用人工智能促进可持续发展目标4,支持就教育和学习的未来开展辩论,并使开源人工智能资源和课程向所有人开放。

40. 在与会员国开展咨询的基础上制定教育人工智能指导纲要并开发资源,以支持会员国制定促进教育领域有效和公平应用人工智能的政策和战略。支持对教育政策制定者的相关能力建设。

41. 通过强化相关部门及处室并动员联合国教科文组织的机构和网络,加强联合国教科文组织在教育人工智能领域的引领作用。

42. 支持将人工智能技能纳入教师信通技术能力框架,支持各国就教职人员如何在富含人工智能的教育环境下工作开展培训。

43. 在教育人工智能方面,进一步扩大联合国教科文组织与相关联合国机构和多边合作伙伴、地区开发银行和组织以及私营部门的合作。

44. 此次大会之后,采取适当的地区和国际性后续行动,与活跃在这一领域的发展伙伴合作,巩固并扩大本共识的影响。

知识图谱教程:从海量文本中挖掘和构建异构信息网络

第 25 届 ACM SIGKDD 知识发现与数据挖掘大会于  2019 年 8 月 4 日- 8 日在美国阿拉斯加州安克雷奇市举行。一年一度的 KDD 大会是最重要的跨学科会议,汇聚了数据科学、数据挖掘、知识发现、大规模数据分析和大数据等领域的研究人员和实践者。

今天整理了关于数据挖掘方面的内容:从文本中构建和挖掘异构信息网络,本文提供了一个全面的综述,总结了在这个方向最近的研究和发展。

第 25 届 ACM SIGKDD

摘要:

现实世界中的数据主要以非结构化文本的形式存在。数据挖掘研究的一个重大挑战是开发有效的、可伸缩的方法,将非结构化文本转换为结构化知识。基于我们的愿景,将这些文本转换为结构化的异构信息网络是非常有益的,可以根据用户的需求生成可操作的知识。

在本教程中,我们将全面概述这方面的最新研究和发展。首先,我们介绍了一系列从大规模、领域特定的文本语料库构建异构信息网络的有效方法。然后,我们讨论了基于用户需求挖掘这种文本丰富网络的方法。具体来说,我们关注的是可伸缩的、有效的、弱监督的、与语言无关的方法,这些方法可以处理各种文本。我们还将在实际数据集(包括新闻文章、科学出版物和产品评论)上进一步演示如何构建信息网络,以及如何帮助进一步的探索性分析。大纲:

一 .介绍

1. 动机:为什么要从大量文本中构建和挖掘异构信息网络?
2. 大量文本网络构建的综述
3. 关于构建网络应用探索的综述

二. 短语挖掘

1. 为什么短语挖掘以及如何定义高质量的短语?
2. 监督方法
2.1. 名词短语分块方法
2.2. 基于解析的方法
2.3. 如何在语料库级别对实体进行排序?

3. 无监督方法
3.1. 基于原始频率的方法
3.2. 基于协调的方法
3.3. 基于主题模型的方法
3.4. 对比方法

4. 弱/远程监督方法
4.1. 短语分词及其变体
4.2. 如何利用远程监督?

5. 系统演示和软件介绍
5.1. 一种多语言短语挖掘系统,它将 AutoPhrase,SegPhrase 和 TopMine 集成在一起,支持多种语言的短语挖掘(例如,英语,西班牙语,中文,阿拉伯语和日语)。

三. 信息抽取:实体,属性和关系

1. 什么是命名实体识别(NER)?

2. 传统的监督方法
2.1. CorNLL03 共享任务
2.2. 序列标注框架
2.3. 条件随机场
2.4 手工制作的特征

3. 现代端到端神经模型
3.1. 双向 LSTM 模型
3.2. 语言模型和语境化表示
3.3. Raw-to-end 模型

4. 远程监督的模型
4.1. 实体输入的数据编程
4.2. 学习特定领域的词典

5. 基于元模式的信息提取
5.1. 元模式挖掘
5.2. 元模式增强的 NER

6. 系统演示和软件
6.1 命名实体识别推理 Python 包:LightNER 。该模块可帮助用户以高效便捷的方式轻松地将预训练的NER 模型应用于他们自己的语料库。

四. 分类构建

1. 分类学基础
1.1. 分类法定义
1.2. 分类应用
1.3. 分类构建方法

2. 基于实例的分类构建
2.1. 使用的方法综述
2.2. 基于模式的方法
2.3. 监督方法
2.4. 弱监督方法

3. 基于聚类的分类构建
3.1. 分层主题建模
3.2. 一般图模型方法
3.3. 分层聚类

五. 挖掘异构信息网络(结构化分析)

1. 基本分析系统演示
1.1.  AutoNet 系统:它从 PubMed 论文(标题和摘要)构建了一个巨大的结构化网络,并支持在线构建(新文档)和智能探索(搜索)。

2. 概要
2.1. 基于图的总结
2.2. 聚类和排序的总结

3. 元路径引导探索
3.1. 基于元路径的相似性
3.2. 元路径引导节点嵌入

4. 链接预测
4.1. 任务引导节点嵌入
4.2. 构建网络中的链接增强

六. 总结和未来的方向

1. 摘要
1.1. 原理与技术
1.2. 优势和局限

2. 挑战和未来的研究方向

3. 与观众的互动
3.1 如何根据您的文本数据和应用需求构建和挖掘异构信息网络?

原文链接:https://shangjingbo1226.github.io/2019-04-22-kdd-tutorial/

如何阅读一份深度学习项目代码?

搞深度学习的人,两大必备日常除了读论文之外就是读代码。读论文笔者在第 4 问的时候讲了阅读路线,但如何读用什么技巧读每个人都有不同的见解,这里不多说。读代码跟读论文、读书多少有相似的地方,毕竟都是读的性质。但话又说回来,读代码又跟读 paper 读书大有不同,代码是一种将论文中的模型和算法进行实现的过程,是一种需要你思维时刻在线的过程。又因为我们读的是深度学习项目代码,不是像 Linux 内核代码那样的鸿篇巨制,所以在代码性质上多少又有些不同。

笔者这里说的一份深度学习项目代码,小到几百行的测试 demo ,大到成千万行的开源项目,读起来方法肯定各有不同。如下图 Mask R-CNN 项目代码和 PyTorch 源码的对比:

Mask R-CNN
Mask R-CNN
PyTorch
PyTorch

可以看到,Mask R-CNN 作为一个经典的实例分割框架,其代码量可以说是中规中矩,3k 的代码量在我们读完论文后集中花几天时间差不多可以过一遍。但 PyTorch 的源码对大多数人而言就不那么友善了,750k 的代码量,而且底层的 C++代码占到整个项目中的一半之多,作为深度学习研究而言,堪称巨无霸级别了。这样的代码量,就像初学者拿到一本 PRML ,往往投入巨大精力后不了了之。所以,对于这两种类型的项目代码,阅读方法肯定会有所区别。

因为我们读代码的目的、场景和对象不尽相同,下面笔者从三个方面来和大家探讨如何阅读一份深度学习项目代码。

首先读代码的一些通用方法。这一点而言不局限于深度学习项目代码,任何项目、任何语言的代码阅读都适用。我们日常读代码无非是两个工具,一是将代码下载到本地,打开 IDLE ,在 IDLE 里安静的阅读:

IDLE
IDLE

第二个就是直接在 GitHub 的 web 端直接阅读,但 GitHub 没有像编辑器那样在左侧设置阅读目录,每次进入一个代码文件就必须退出来才能进入另一个文件,用户体验极差。当然了,这都不是事。chrome 给我们提供了 Octotree 这样的辅助阅读插件,直接在 chrome 扩展程序里搜索安装即可。

Octotree
Octotree

安装后我们就可以直接在 web 端就有 IDLE 读代码的体验:

IDLE读代码的体验
IDLE读代码的体验

可以看到在页面左侧有一个类似 IDLE 的目录栏,大大方便了我们查看和阅读项目代码。这是通用方法中的工具层面,我们再来看一些基本的阅读规矩。有了 IDLE 和 Octotree 工具,我们第一点一定是仔细看代码目录,对整个项目代码结构和分布有一个整体的认识,对于深度学习而言通常目录中各个模块相对比较固定,比如是 models 目录下放着模型搭建和训练的代码,conifg 目录下放着模型的一些配置文件,data   目录下放着项目所使用的数据信息等等。如下面语义分割项目的目录结构:

IDLE的目录栏
IDLE的目录栏

对深度学习项目代码的结构熟络之后,读的多了自然就会轻车熟路起来,后面阅读效率也就提高了。

通用方法的第二个是快速找到 readme 文档。通常来说,根目录下的 readme 文档包含了这份代码的使用方法,里面有可以让你快速了解这个项目的关键信息。一般来说,开源项目的 readme 里作者都会写明如何使用代码和进行部署。下图是 DenseNet 的 readme 文档:

DenseNet的readme文档
DenseNet的readme文档

对于大型项目,可能每一个子目录下都有 readme 文档,这都是我们需要仔细阅读的部分,作者把关键信息都放里面了。所以不管这样,第一时间读找到 readme 进行阅读是你了解该项目的必备步骤和通用方法。

第三个通用方法就是具体如何读的问题。就是我们得确定一个阅读主线。这一点是针对于深度学习项目代码的通用方法,对于一个深度学习项目,我们一般想要了解的最关键点无非就是数据、模型和如何训练等几个方面。如果你想快速看看这个开源项目的测试效果,直接读 readme 看使用方法即可。如果这个项目作者提出了一个新的模型框架,比如说 bert,你想了解它的模型框架细节,直接定位到 models 目录下的带有 model 字眼的.py 文件开始读。或者是你想看这个项目是如何训练的,都用了哪些训练的 tricks ,它的参数初始化是如何做的,batchsize 用的多大,训练过程中学习率如何调整的等等,那么话不多说,直接定位到带 train 的.py 文件即可。如下图 faster-rcnn 的 3 个训练文件。

faster-rcnn的3个训练文件
faster-rcnn的3个训练文件

根据目的不管是 model 还是 train 的主线,在阅读过程中一定会涉及到其他分支,比如说数据和配置等其他分支线。在主线阅读过程中不断完善对分支的理解,久而久之,一个完整的项目就会被你消化了。

以上说的是深度学习项目代码阅读的一些通用方法。下面再具体讲两个场景的代码阅读。毕竟大家做事讲究目的性,往往带有较强的目的性去做某事效率一般会特别高。

第一个场景是在大家做研究做项目时遇到问题时。不知道这个问题如何解决,直接谷歌又找不到好合适的方法的时候。这时候我们可能会寄希望于在 GitHub 上搜罗一番。比如说我们想要知道对于极度数据不平衡时如何给损失函数加权重的方法,再比如对于多标签问题进行模型预测时如何找到最佳分类阈值等等。这些问题都是我们在做实际项目时都可能会碰上的,在这种情况下若是能在 GitHub 上找到类似场景的处理方法,相信你会瞬间来了精神。

下述基于 keras 的 CNN 多标签分类项目对于多标签分类阈值寻优使用了 matthews_corrcoef 来确定最佳分类预测阈值。至于什么是 matthews_corrcoef ,这些都是你在解决问题过程中需要学习和吸收的地方。总之,带有目的性的读某个项目的代码往往是只读某个 block 甚至是某几个关键行,数量不在多,在于能够解决你的问题。

matthews_corrcoef
matthews_corrcoef

第二个场景就是为了自我个人精进的读代码。所谓个人精进,就是有大量可支配的个人学习和研究时间,高度的自律性和超强的学习力的人进行能力跃迁的关键所在。笔者虽然平时偶尔会有去 GitHub 读一些代码,但说要达到个人精进的 level ,还远远不够。比如说前面的 PyTorch 750k 的源码,这么大的代码量,阅读策略一定是分治思想,分散包围和各个击破。把项目进行分解,设定阅读计划和目标,在超强的执行力下还是有可能完成的。这不是普通人干的事,但我相信能在深度学习领域精进的人都不会是普通人。

自我个人精进的读代码
自我个人精进的读代码

诚然,无论是读教材、读论文还是本篇所说的读代码,这些本身都是一个个人学习能力提升和知识汲取的过程。对于从事深度学习工作的我们而言,arxiv 上的论文和 GitHub 上的代码都无穷尽,关键在于保持学习的劲头,做一名终身学习者。

GitHub地址项目 GitHub 地址

特征工程系列:特征筛选的原理与实现(下)

0x00 前言

我们在《特征工程系列:特征筛选的原理与实现(上)》中介绍了特征选择的分类,并详细介绍了过滤式特征筛选的原理与实现。本篇继续介绍封装式和嵌入式特征筛选的原理与实现。

0x01 特征选择实现方法三:线性模型与正则化

1 .主要思想

当所有特征在相同尺度上时,最重要的特征应该在模型中具有最高系数,而与输出变量不相关的特征应该具有接近零的系数值。即使使用简单的线性回归模型,当数据不是很嘈杂(或者有大量数据与特征数量相比)并且特征(相对)独立时,这种方法也能很好地工作。

2 .正则化模型

正则化就是把额外的约束或者惩罚项加到已有模型(损失函数)上,以防止过拟合并提高泛化能力。损失函数由原来的 E(X,Y)变为E(X,Y)+alpha||w||,w 是模型系数组成的向量(有些地方也叫参数parameter,coefficients),||·||一般是 L1 或者 L2 范数,alpha 是一个可调的参数,控制着正则化的强度。当用在线性模型上时,L1 正则化和 L2 正则化也称为 Lasso 和 Ridge。

1)L1 正则化/Lasso regression

L1 正则化将系数w的l1范数作为惩罚项加到损失函数上,由于正则项非零,这就迫使那些弱的特征所对应的系数变成 0。因此 L1 正则化往往会使学到的模型很稀疏(系数 w 经常为 0 ),这个特性使得 L1 正则化成为一种很好的特征选择方法。

Lasso 能够挑出一些优质特征,同时让其他特征的系数趋于 0。当如需要减少特征数的时候它很有用,但是对于数据理解来说不是很好用。

2)L2 正则化/Ridge regression

L2 正则化将系数向量的 L2 范数添加到了损失函数中。

  • 由于 L2 惩罚项中系数是二次方的,这使得 L2 和 L1 有着诸多差异,最明显的一点就是,L2 正则化会让系数的取值变得平均。
  • 对于关联特征,这意味着他们能够获得更相近的对应系数。
  • Ridge 将回归系数均匀的分摊到各个关联变量上。

L2 正则化对于特征选择来说一种稳定的模型,不像 L1 正则化那样,系数会因为细微的数据变化而波动。所以 L2 正则化和 L1 正则化提供的价值是不同的,L2 正则化对于特征理解来说更加有用:表示能力强的特征对应的系数是非零。

3 .原理介绍

多元线性回归,具有 n 个特征值,

多元线性回归方程演变成求θ。

每个特征都有对应的权重系数coef,特征的权重系数的正负值代表特征与目标值是正相关还是负相关,特征的权重系数的绝对值代表重要性。

sklearn中 中LinearRegression的fit()方法就是通过训练集求出θ,LinearRegression的两个属性intercept和coef分别对应θ0和θ1-θn。
<h3>4 .代码实现</h3>
<h4>1)普通线性模型</h4>
#获取boston数据
boston=datasets.load_boston()
x=boston.data
y=boston.target
#过滤掉异常值
x=x[y&lt;50]
y=y[y&lt;50]
reg=LinearRegression()
reg.fit(x,y)
#求排序后的coef
coefSort=reg.coef_.argsort()
#featureNameSort: 按对标记值的影响,从小到大的各特征值名称
#featureCoefSore:按对标记值的影响,从小到大的coef_
featureNameSort=boston.feature_names[coefSort]
featureCoefSore=reg.coef_[coefSort]
print("featureNameSort:", featureNameSort)
print("featureCoefSore:", featureCoefSore)
# 输出:featureNameSort: ['NOX' 'DIS' 'PTRATIO' 'LSTAT' 'CRIM' 'INDUS' 'AGE' 'TAX' 'B' 'ZN' 'RAD' 'CHAS' 'RM']
featureCoefSore: [-1.24268073e+01 -1.21088069e+00 -8.38888137e-01 -3.50952134e-01
-1.05574295e-01 -4.35179251e-02 -2.36116881e-02 -1.37702943e-02 7.93577159e-03
3.52748549e-02 2.50740082e-01 4.55405227e-01 3.75411229e+00]

结果分析:

  • 正相关影响系数最大的特征值是 ”RM”:房间的平均数量,系数值为 3.75。
  • 负相关影响系数最大的特征值是 ”NOX”:一氧化氮浓度,系数值为 -1.24。

2)L1 正则化线性模型

#A helper method for pretty-printing linear models
def pretty_print_linear(coefs, names = None, sort = False):
if names == None:
names = ["X%s" % x for x in range(len(coefs))]
lst = zip(coefs, names)
if sort:
lst = sorted(lst, key = lambda x:-np.abs(x[0]))
return " + ".join("%s * %s" % (round(coef, 3), name)
for coef, name in lst)

from sklearn.linear_model import Lasso
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_boston

boston = load_boston()
scaler = StandardScaler()
X = scaler.fit_transform(boston["data"])
Y = boston["target"]
names = boston["feature_names"]

lasso = Lasso(alpha=.3)
lasso.fit(X, Y)

print("Lasso model: {}".format(
pretty_print_linear(lasso.coef_, names, sort = True)))
# 输出:Lasso model: -3.707 * LSTAT + 2.992 * RM + -1.757 * PTRATIO
+ -1.081 * DIS + -0.7 * NOX + 0.631 * B + 0.54 * CHAS + -0.236 * CRIM
+ 0.081 * ZN + -0.0 * INDUS + -0.0 * AGE + 0.0 * RAD + -0.0 * TAX

许多特征具有系数 0。L1 正则化回归的稳定性与非正则化线性模型类似,这意味着当数据中存在相关特征时,系数(以及特征等级)即使在小数据变化时也会发生显着变化。

3)L2正则化线性模型

from sklearn.linear_model import Ridge
from sklearn.metrics import r2_score
size = 100

#We run the method 10 times with different random seeds
for i in range(10):
print("Random seed {}".format(i))
np.random.seed(seed=i)
X_seed = np.random.normal(0, 1, size)
X1 = X_seed + np.random.normal(0, .1, size)
X2 = X_seed + np.random.normal(0, .1, size)
X3 = X_seed + np.random.normal(0, .1, size)
Y = X1 + X2 + X3 + np.random.normal(0, 1, size)
X = np.array([X1, X2, X3]).T

lr = LinearRegression()
lr.fit(X,Y)
print("Linear model: {}".format(pretty_print_linear(lr.coef_)))

ridge = Ridge(alpha=10)
ridge.fit(X,Y)
print("Ridge model: {}".format(pretty_print_linear(ridge.coef_)))

# 输出
Random seed 0
Linear model: 0.728 * X0 + 2.309 * X1 + -0.082 * X2
Ridge model: 0.938 * X0 + 1.059 * X1 + 0.877 * X2

Random seed 1
Linear model: 1.152 * X0 + 2.366 * X1 + -0.599 * X2
Ridge model: 0.984 * X0 + 1.068 * X1 + 0.759 * X2

Random seed 2
Linear model: 0.697 * X0 + 0.322 * X1 + 2.086 * X2
Ridge model: 0.972 * X0 + 0.943 * X1 + 1.085 * X2

Random seed 3
Linear model: 0.287 * X0 + 1.254 * X1 + 1.491 * X2
Ridge model: 0.919 * X0 + 1.005 * X1 + 1.033 * X2

Random seed 4
Linear model: 0.187 * X0 + 0.772 * X1 + 2.189 * X2
Ridge model: 0.964 * X0 + 0.982 * X1 + 1.098 * X2

Random seed 5
Linear model: -1.291 * X0 + 1.591 * X1 + 2.747 * X2
Ridge model: 0.758 * X0 + 1.011 * X1 + 1.139 * X2

Random seed 6
Linear model: 1.199 * X0 + -0.031 * X1 + 1.915 * X2
Ridge model: 1.016 * X0 + 0.89 * X1 + 1.091 * X2

Random seed 7
Linear model: 1.474 * X0 + 1.762 * X1 + -0.151 * X2
Ridge model: 1.018 * X0 + 1.039 * X1 + 0.901 * X2

Random seed 8
Linear model: 0.084 * X0 + 1.88 * X1 + 1.107 * X2
Ridge model: 0.907 * X0 + 1.071 * X1 + 1.008 * X2

Random seed 9
Linear model: 0.714 * X0 + 0.776 * X1 + 1.364 * X2
Ridge model: 0.896 * X0 + 0.903 * X1 + 0.98 * X2

从示例中可以看出,线性回归的系数变化很大,具体取决于生成的数据。然而,对于 L2 正则化模型,系数非常稳定并且密切反映数据的生成方式(所有系数接近 1 )。

0x02 特征选择实现方法四:随机森林选择

随机森林具有准确率高、鲁棒性好、易于使用等优点,这使得它成为了目前最流行的机器学习算法之一。随机森林提供了两种特征选择的方法:mean decrease impurity和mean decrease accuracy。

1.平均不纯度减少(mean decrease impurity)

1)原理介绍

随机森林由多颗 CART 决策树构成,决策树中的每一个节点都是关于某个特征的条件,为的是将数据集按照不同的响应变量一分为二。
CART 利用不纯度可以确定节点(最优条件),对于分类问题,通常采用基尼不纯度,对于回归问题,通常采用的是方差或者最小二乘拟合。
当训练决策树的时候,可以计算出每个特征减少了多少树的不纯度。对于一个决策树森林来说,可以算出每个特征平均减少了多少不纯度,并把它平均减少的不纯度作为特征选择的标准。
随机森林基于不纯度的排序结果非常鲜明,在得分最高的几个特征之后的特征,得分急剧的下降。
2)代码实现

from sklearn.datasets import load_boston
from sklearn.ensemble import RandomForestRegressor
import numpy as np

#Load boston housing dataset as an example
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
# 训练随机森林模型,并通过feature_importances_属性获取每个特征的重要性分数。rf = RandomForestRegressor()
rf.fit(X, Y)
print("Features sorted by their score:")
print(sorted(zip(map(lambda x: round(x, 4), rf.feature_importances_), names),
reverse=True))

2.平均精确度减少(mean decrease accuracy)

1)原理介绍

  • 通过直接度量每个特征对模型精确率的影响来进行特征选择。
  • 主要思路是打乱每个特征的特征值顺序,并且度量顺序变动对模型的精确率的影响。
  • 对于不重要的变量来说,打乱顺序对模型的精确率影响不会太大。
  • 对于重要的变量来说,打乱顺序就会降低模型的精确率。

2)代码实现

from sklearn.cross_validation import ShuffleSplit
from sklearn.metrics import r2_score
from collections import defaultdict
X = boston["data"]
Y = boston["target"]
rf = RandomForestRegressor()
scores = defaultdict(list)
#crossvalidate the scores on a number of different random splits of the data
for train_idx, test_idx in ShuffleSplit(len(X), 100, .3):
X_train, X_test = X[train_idx], X[test_idx]
Y_train, Y_test = Y[train_idx], Y[test_idx]
# 使用修改前的原始特征训练模型,其acc作为后续混洗特征值后的对比标准。r = rf.fit(X_train, Y_train)
acc = r2_score(Y_test, rf.predict(X_test))
# 遍历每一列特征
for i in range(X.shape[1]):
X_t = X_test.copy()
# 对这一列特征进行混洗,交互了一列特征内部的值的顺序
np.random.shuffle(X_t[:, i])
shuff_acc = r2_score(Y_test, rf.predict(X_t))
# 混洗某个特征值后,计算平均精确度减少程度。scores[names[i]].append((acc-shuff_acc)/acc)
print("Features sorted by their score:")
print(sorted([(round(np.mean(score), 4), feat) for feat, score in scores.items()], reverse=True))

0x03 特征选择实现方法五:顶层特征选择

顶层特征选择发建立在基于模型的特征选择方法基础之上的,例如线性回归和SVM等,在不同的子集上建立模型,然后汇总最终确定特征得分。

1.稳定性选择(Stability selection)

稳定性选择常常是一种既能够有助于理解数据又能够挑出优质特征的这种选择。

1)原理介绍

  • 稳定性选择是一种基于二次抽样和选择算法相结合较新的方法,选择算法可以是回归、SVM 或其他类似的方法。
  • 它的主要思想是在不同的数据子集和特征子集上运行特征选择算法,不断的重复,最终汇总特征选择结果。比如可以统计某个特征被认为是重要特征的频率(被选为重要特征的次数除以它所在的子集被测试的次数)。
  • 理想情况下,重要特征的得分会接近 100%。稍微弱一点的特征得分会是非 0 的数,而最无用的特征得分将会接近于 0。

2)代码实现

from sklearn.linear_model import RandomizedLasso
from sklearn.datasets import load_boston
boston = load_boston()
#using the Boston housing data.
#Data gets scaled automatically by sklearn's implementation
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
rlasso = RandomizedLasso(alpha=0.025)
rlasso.fit(X, Y)
print("Features sorted by their score:")
print(sorted(zip(map(lambda x: round(x, 4), rlasso.scores_), names),
reverse=True))

2.递归特征消除(Recursive feature elimination,RFE)

1)原理介绍

递归特征消除的主要思想是反复的构建模型(如 SVM 或者回归模型)然后选出最好的(或者最差的)的特征(可以根据系数来选),把选出来的特征放到一遍,然后在剩余的特征上重复这个过程,直到所有特征都遍历了。
这个过程中特征被消除的次序就是特征的排序。因此,这是一种寻找最优特征子集的贪心算法。
RFE 的稳定性很大程度上取决于在迭代的时候底层用哪种模型。
假如 RFE 采用的普通的回归,没有经过正则化的回归是不稳定的,那么 RFE 就是不稳定的。
假如 RFE 采用的是 Ridge,而用 Ridge 正则化的回归是稳定的,那么RFE 就是稳定的。

2)代码实现

from sklearn.feature_selection import RFE
from sklearn.linear_model import LinearRegression
boston = load_boston()
X = boston["data"]
Y = boston["target"]
names = boston["feature_names"]
#use linear regression as the model
lr = LinearRegression()
#rank all features, i.e continue the elimination until the last one
rfe = RFE(lr, n_features_to_select=1)
rfe.fit(X,Y)
print("Features sorted by their rank:")
print(sorted(zip(map(lambda x: round(x, 4), rfe.ranking_), names)))
结果输出
Features sorted by their rank:
[(1, 'NOX'), (2, 'RM'), (3, 'CHAS'), (4, 'PTRATIO'), (5, 'DIS'),
(6, 'LSTAT'), (7, 'RAD'), (8, 'CRIM'), (9, 'INDUS'), (10, 'ZN'),
(11, 'TAX'), (12, 'B'), (13, 'AGE')]

0xFF 总结

1.单变量特征选择可以用于理解数据、数据的结构、特点,也可以用于排除不相关特征,但是它不能发现冗余特征。

2.正则化的线性模型可用于特征理解和特征选择。相比起 L1 正则化,L2 正则化的表现更加稳定,L2 正则化对于数据的理解来说很合适。由于响应变量和特征之间往往是非线性关系,可以采用 basis expansion 的方式将特征转换到一个更加合适的空间当中,在此基础上再考虑运用简单的线性模型。

3.随机森林是一种非常流行的特征选择方法,它易于使用。但它有两个主要问题:

  • 重要的特征有可能得分很低(关联特征问题)
  • 这种方法对特征变量类别多的特征越有利(偏向问题)

4.特征选择在很多机器学习和数据挖掘场景中都是非常有用的。在使用的时候要弄清楚自己的目标是什么,然后找到哪种方法适用于自己的任务。

  • 当选择最优特征以提升模型性能的时候,可以采用交叉验证的方法来验证某种方法是否比其他方法要好。
  • 当用特征选择的方法来理解数据的时候要留心,特征选择模型的稳定性非常重要,稳定性差的模型很容易就会导致错误的结论。
  • 对数据进行二次采样然后在子集上运行特征选择算法能够有所帮助,如果在各个子集上的结果是一致的,那就可以说在这个数据集上得出来的结论是可信的,可以用这种特征选择模型的结果来理解数据。

5.关于训练模型的特征筛选,个人建议的实施流程 :

i. 数据预处理后,先排除取值变化很小的特征。如果机器资源充足,并且希望尽量保留所有信息,可以把阈值设置得比较高,或者只过滤离散型特征只有一个取值的特征。
ii. 如果数据量过大,计算资源不足(内存不足以使用所有数据进行训练、计算速度过慢),可以使用单特征选择法排除部分特征。这些被排除的特征并不一定完全被排除不再使用,在后续的特征构造时也可以作为原始特征使用。
iii. 如果此时特征量依然非常大,或者是如果特征比较稀疏时,可以使用PCA(主成分分析)和 LDA(线性判别)等方法进行特征降维。
iv. 经过样本采样和特征预筛选后,训练样本可以用于训练模型。但是可能由于特征数量比较大而导致训练速度慢,或者想进一步筛选有效特征或排除无效特征(或噪音),我们可以使用正则化线性模型选择法、随机森林选择法或者顶层特征选择法进一步进行特征筛选。

最后,特征筛选是为了理解数据或更好地训练模型,我们应该根据自己的目标来选择适合的方法。为了更好/更容易地训练模型而进行的特征筛选,如果计算资源充足,应尽量避免过度筛选特征,因为特征筛选很容易丢失有用的信息。如果只是为了减少无效特征的影响,为了避免过拟合,可以选择随机森林和 XGBoost 等集成模型来避免对特征过拟合。

最新《机器学习优化》教程

一、资源简介

普林斯顿大学在 19 年开设了 COS 598D《机器学习优化》课程的讲义,这个课程主要介绍机器学习中出现的优化问题,以及解决这些问题的有效算法。这份讲义内容详实循序渐进,非常适合想要入门机器学习优化的同学阅读。

官网:
https://sites.google.com/view/optimization4machinelearning/home

作者简介:
Elad Hazan :普林斯顿大学计算机系的教授,重点研究机器学习和优化的基本问题。曾获得贝尔实验室奖、2012 年和 2008 年 IBM 哥德堡最佳论文奖、欧洲研究理事会奖、居里夫人奖和谷歌研究奖。曾担任计算学习协会指导委员会委员,并担任 COLT 2015 项目主席。2017 年,创立了专注于高效优化与控制的In8 inc,并于 2018 年被谷歌收购。普林斯顿大学商学院的联合创始人和联合董事。

二、主要内容

下面是这份讲义的主要目录:

  1. 介绍
  2. 优化和分析的基本概念
  3. 随机梯度下降法
  4. 泛化和非光滑优化
  5. 正则化
  6. 自适应正则化
  7. 方差减少
  8. Nesterov加速度(Nesterov Acceleration)
  9. 条件梯度法
  10. 机器学习的二阶方法
  11. Hyperparameter优化(Hyperparameter Optimization)