天地一逆旅
同悲万古尘
前言
今天起便要正式开始学习《Hands-On Machine Learning with Scikit-Learn & TensorFlow》这本书了,因此之后的Blog都会基于这本书以及Python3.5、Scikit-Learn、TensorFlow,也希望自己有点产出,与大家多多分享知识,同时记录下自己的学习过程,成就感满满哦!
介绍
《Hands-On Machine Learning with Scikit-Learn & TensorFlow》
本书中译版名《机器学习实战:基于Scikit-Learn和TensorFlow》,此书兼顾理论与实践,对于初学者来说,一般很难直接上手晦涩难懂的TensorFlow API,且缺乏实践经验。本书则是一个相对容易的选择,本书以帮数据分析人员快速入门机器学习并找到工作为目标,逻辑清晰,学习路线合理,十分适合初学者。且已有中译版,可中英对照,对于提升自己有很大帮助。
Scikit-Learn
Scikit-learn项目最早由数据科学家David Cournapeau在2007年发起,需要NumPy和SciPy等其他包的支持,是Python语言中专门针对机器学习应用而发展起来的一款开源框架。
TensorFlow
Tensorflow是广泛使用的实现机器学习以及其它涉及大量数学运算的算法库之一。Tensorflow由Google开发,是GitHub上最受欢迎的机器学习库之一。
机器学习概览
定义
机器学习是一门能够让编程计算机从数据中学习的计算机科学。
机器学习与传统方法区别
传统的编程方法需要三个步骤:
- 研究问题,找到问题的规律
- 根据找到的规律,设计实现解决问题的算法
- 测试程序,重复1、2两步,直到满足需求
机器学习方法的步骤:
- 研究问题
- 基于数据,训练机器学习算法
- 测试模型
机器学习方法的优势
- 简化现有的需要大量手动调整或者规则特别复杂的程序,并提升执行表现
- 可应用于太过复杂以至于传统算法无法解决的问题
- 问题条件发生变化时,可以自适应新数据,不需要像传统方法一样手动回头重改
- 从复杂问题和海量数据中提取知识
机器学习的分类
- 是否在人类监督下训练:
- 监督式学习(supervised learning)
- 无监督式学习(unsupervised learning)
- 半监督式学习(semisupervised learning)
- 强化学习(Reinforcement Learning)
- 是否可以动态地进行增量学习:
- 在线学习(online learning)
- 批量学习(batch learning)
- 是否需要建立模型:
- 基于实例的学习(instance-based learning):
简单地将新数据点与已知的数据点进行匹配 - 基于模型的学习 (model-based learning):
对训练数据进行模式检测,然后建立一个预测模型
- 基于实例的学习(instance-based learning):
机器学习方法简介
监督/无监督式学习
在监督式学习中,需要经过标记的训练数据。分类问题是典型的监督式学习。另一种典型的监督式学习是回归问题,也就是给一定的特征来预测一个目标数值。以下是一些重要的监督式学习的算法:
- K-近邻算法(k-Nearest Neighbors)
- 线性回归(Linear Regression)
- 逻辑回归(Logistic Regression)
- 支持向量机(Support Vector Machines)
- 决策树和随机森林(Decision Trees and Random Forests)
- 神经网络(Neural networks)
PS:一些回归算法可以运用于分类任务,反之亦然。例如逻辑回归,因为它可以输出“属于某个特定类别的概率”
无监督式学习的训练数据是未经标记的,以下是一些重要的监督式学习的算法:
- 聚类算法
- k-平均算法(k-Means)
- 分层聚类分析(Hierarchical Cluster Analysis )
- 最大期望算法(Expectation Maximization)
- 可视化和降维
- 主成分分析(PCA)
- 核主成分分析(Kernel PCA)
- 局部线性嵌入(LLE)
- t-分布随机近邻嵌入(t-SNE)
- 关联规则学习
- Apriori
- Eclat
半监督式学习的训练数据则是部分标记的,通常是大量未标记数据和少量标记数据。例如照片托管服务,它会自动识别出照片中每一位人物,只需要你给每个人物命名,之后你上传每一张照片,系统都会自动识别那是谁了。大多数半监督式学习算法都是无监督式和监督式算法的组合,如深度信念网络(DBN),它基于一种互相堆叠的无监督式组件,叫做受限玻尔兹曼机(RBM),受限玻尔兹曼机以无监督方式训练,然后使用监督式学习对整个系统进行微调。
强化学习的学习系统能够观察环境,做出选择,执行操作,并获得回报,或者以负面回报方式获得惩罚。所以它必须自行学习什么事最优策略。例如AlphaGo。
批量/在线学习
在批量学习中系统无法进行增量学习,必须使用所有数据进行训练。如果有新数据引入,则需要在完整数据集(包括新旧数据)的基础上,重新训练一个新的系统,然后停用旧系统。这也许会耗费大量时间和资源,但整个训练、评估和启动机器学习系统的过程可以轻易实现自动化,所以批量学习系统也能够适应变化。
而在线学习可以循序渐进的提供训练数据,也可以采用小批量的小组数据进行训练。
如这类系统,需要接受持续的数据流(股票价格)同时对数据流的变化作出快速或自主的反应。
而对这种超大数据集的,算法则每次只加载部分数据,并针对这部分数据进行训练,然后不断重复这个过程,直到完成所有数据的训练。
基于实例/模型的学习
基于实例的学习会将新实例与已有的实例进行对比,从而进行判断或预测,一般来说这不是最好的选择,但也不会是最差的。
基于模型的学习首先会构建一个能够泛化当前实例的模型,然后通过模型对新实例进行判断或预测。
机器学习的挑战
训练数据的数量不足
一般样本集太小会导致采样噪声
训练数据不具有代表性
采样方式欠妥会导致样本偏差,代表性数据没有被纳入样本,导致拟合结果不准确
如图中的挪威、瑞士、卢森堡显著地改变了虚线代表的旧模型
数据质量差
训练集满是错误、异常值、噪声需要清理数据集:
- 剔除或修复异常值
- 如果某些实例缺少某些特征(比如%5的顾客缺少年龄),你必须决定是整体忽略这些特征,还是忽略这些缺失特征的实例,亦或是填充这些特征
无关特征
一个优秀的机器学习项目,关键是提取有效的特征,这个过程就是特征工程
- 特征选择
- 特征提取
- 创造新特征
训练数据过度拟合
训练出的模型在训练集上表现良好,但泛化时却不如人意
如图是一个过拟合的模型,其预测就十分不准确了。
可能解决过拟合的方案:
- 简化模型,选择较少参数的模型、减少训练数据中的属性数量、约束模型
- 收集更多的训练数据
- 减少训练数据中的噪声
训练数据拟合不足
与过拟合相对的概念,模型太过简单,无法描述复杂的现实问题,可能的解决方案:
- 选择更强大的模型
- 给学习算法更好的特征集(特征工程)
- 减少模型中的约束(如减少正则化超参数)
验证与测试
一般将数据集按80%训练、20%测试进行划分来评估模型好坏
资料
书籍资料
- 《Hands-On Machine Learning with Scikit-Learn & TensorFlow》 ——机器学习实战
网络资源
- Scikit-Learn ——官网及文档
- Tensorflow ——官网及文档
- Aurélien Geron ——《Hands-On Machine Learning with Scikit-Learn & TensorFlow》作者GitHub