精通数据科学 从线性回归到深度学习(异步图书出品),唐亘 著,2018年出版。
本书电子版:http://reader.epubee.com/books/mobile/73/73b7f8a2316099abeee293c71d136140/
序
本书强调的是数学(包括概率,统计,微积分等),机器学习和计算机科学三门学科的融会贯通。
个人的数据科学能力实际上应该是编程,数学(包括基于数学的统计分析和机器学习),业务理解三项能力的融汇贯通。
数学解决数据科学“道”的问题:数据模型,算法模型的理论内涵和适应范围。
编程解决数据科学“术”的问题:模型的落地。
数学和编程解决的问题来自业务,最终又回到业务中去。
前言
数据科学的两大学派:
- 统计学派:以统计分析为基础
- 注重假设和模型解释
- 研究和使用的模型都只是一些线性模型,太过简单,无法处理复杂的现实数据
- 人工智能学派:以机器学习为基础。
- 注重模型预测效果
- 搭建的模型缺乏理论依据,无法解释,很难帮助我们通过模型去理解数据
- 在图像识别等应用场景中表现惊艳
- 可解释性差不能怪模型,只能怪人类的理解能力
模型工程实现的基础:计算机估算模型参数的随机梯度下降法。
本书作者提供的代码: https://github.com/GenTang/intro_ds
第1章 数学科学概述
The purpose of computing is insight, not numbers.
数据科学的兴起可以看做数学更多的回归到了现实世界,或者说在计算机广泛应用的今天人们更多的用基于数学的算法重塑现实社会。
传统的商业智能BI是对不同维度的数据进行维度上的交叉分组,然后对每个组使用统计分析方法(更多的可能只是描述性统计)进行分析,得到的是每个组的信息而不是数据的全貌。现实世界中,我们能够使用的资源总是受限的,只够解决一部分发现的问题。能够从局部数据得到洞见有时候已经足够了。
数据科学家与数据工程师
- 数据科学家:数学,特别是统计学知识比较深厚;
- 数据工程师:编程能力比较强
现实中的数据科学工作者:同时具备良好的数理知识和工程实现能力。
数据科学的挑战
对应数据科学家与数据工程师关注的不同部分。
1.工程实现的挑战
对于个人项目来讲,主要还是数据准备和特征提取的问题。
- 特征提取:决定了项目成败。数据维护和特征提取花费的时间要远远大于选择和编写模型算法的时间。模型的实现都是现成的模块,并不会耗费太多时间。 和做菜一样,准备时间永远是那么长久而默默无闻。
- 矩阵运算。计算机需要通过类似随机梯度下降的最优算法估算模型参数。其实这部分算力相关的挑战对大部分问题已经不是问题,GPU基本都可以迅速解决。
- 分布式机器学习:算法并行化适配问题,框架来解决。
2.模型搭建的挑战
1.模型预测效果
模型的预测效果取决于模型的假设条件是否被满足。从数学上讲,除去假设,模型的其他部分都是没有瑕疵的逻辑推导,模型的假设是唯一有瑕疵的。模型的假设实际就是对问题本身的描述,即:对业务的深刻理解。对问题本身数理化描述的深度决定了模型预测效果的好坏。
对问题的描述取决于人,不同的人对同一问题的理解不可能完全相同,可以通过特征提取等手段,尽量抽取到和问题强相关的假设。
所有的模型都是错的,但是其中有一些是有用的。记住,所有模型都是错误的;关键的问题是模型错到什么程度就没有用处了。All models are wrong, but some are useful.Remember that all models are wrong; the practical question is how wrong do they have to be to not be useful.
--- 英国统计学家George Edward Pelham Box
2.模型参数的稳定性和正确性
从数学的角度看,模型参数的估计值是一个随机变量,模型参数的估计值由训练模型使用的数据决定。
所谓的模型参数的正确性指的是模型参数的估计值要围绕真实值上下波动,即:模型参数的估计值等于其真实值。
所谓模型参数的稳定性指的是波动性不能太大,即:方差比较小。
模型参数的可接受性由模型参数的正确性和稳定性决定。
3.对模型结果的解释。
这部分需要业务人员和建模人员紧密配合沟通实现。
两种搭建模型的思路
1.传统的统计模型建模
这种思路假设:数据之间的生成逻辑是已知的,即特征之间的依赖关系是已知的,只需要根据数据估算模型参数。
这种建模天然能够很好的满足可解释性和稳定性,但预测效果差:简单粗暴的先入为主确定特征间关系,现实世界和人容易理解的直觉画面并不相符。
2.机器学习建模
机器学习建模过程实际是经历现实的毒打(用现实数据纠偏),一切以现实为准绳,预测效果好,但模型的可解释性差,对模型稳定性的分析方法少。后两者只能怪人类自己。
现实的数据分析实践中,两者是互补的。
传统编程与机器学习
- 传统编程是硬编码人类总结的规则或数学公式
- 机器学习是算法根据数据输入输出规则,并根据数据的不断丰富不断升级
机器学习唯一依赖的是数据。
监督式学习和非监督式学习
- 监督式学习:训练数据有标注
- 标签是离散的:分类
- 标签是连续的:回归
- 非监督学习:训练数据没有标注
- 聚类:将距离相近的点归为一类
- 降维:将高维空间的数据映射到低维空间
模型幻觉
表面上找到了数据变动的规律,但实际上只是由随机扰动引起的数字巧合。
统计学会小心翼翼的处理各种模型,以确保模型能够摆脱数据中随机因素的干扰,得到稳定并且正确的结论,刚好能够弥补机器学习在这方面的不足。
从另一方面理解模型幻觉:从部分个例集合推导总体的特征,但个例不能代表总体,容易得到错误的。结论。
脚本 源文件,注释修改版:
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# -*- coding: UTF-8 -*-
"""
此脚本用于展示随机变量引起的模型幻觉
"""
import numpy as np
import matplotlib.pyplot as plt
def generateData(seed, num):
x = 0
# seed 固定时,即指定seed时,生成的随即数是固定的
np.random.seed(seed)
data = []
for i in range(num):
x += np.random.normal() # 高斯分布
data.append(x)
return data
def visualizeData(series1, series2):
"""
根据给定的fpr和tpr,绘制ROC曲线
"""
# 为在Matplotlib中显示中文,设置特殊字体
plt.rcParams["font.sans-serif"]=["SimHei"]
# 在Matplotlib中显示负号
plt.rcParams['axes.unicode_minus']=False
# 创建一个图形框
fig = plt.figure(figsize=(12, 6), dpi=80)
# 在图形框里只画两幅图
ax = fig.add_subplot(1, 2, 1)
ax.plot(series1)
ax1 = fig.add_subplot(1, 2, 2)
ax1.plot(series2)
plt.show()
if __name__ == "__main__":
series1 = generateData(4096, 200)
series2 = generateData(2046, 200)
visualizeData(series1, series2)
其他
- 数学功底不深厚的数据分析者应该有意识的深入理解各个模型的假设和适用范围
- 统计学和机器学习两者的结合能够更深入的挖掘数据背后的洞见,即:业务的本质。统计学是严谨的科学,统计学的思想可能比统计学的公式本身更重要,因为机器学习的特征毕竟不等同于统计学中的统计变量,机器学习最终应该拥有自己的像统计学一样严谨的理论分析论证。
- 机器学习专业的人容易忽略:模型的稳定性和可靠性,以至于得到的是错误的结论


第2章 Python安装指南与简介:告别空谈
If you are immune to boredom, there is literally nothing you cannot accomplish.(如果你能忍耐乏味,你将无往不利。)
数据科学,数据科学家:

统计分析工作流程:

Python在数据科学中的地位:

数据科学中最常用的Python库:
- 数据预处理
- NumPy 科学计算基础库。它提供高效的N 维数组和向量运算
- SciPy 科学计算库。它依赖于NumPy,提供高效的数值计算,以及用于函数最优化、数值积分等任务的模块
- pandas 数据结构和数据分析库。包含高级数据结构和类SQL语句,让数据处理变得快速、简单
- 数据可视化
- Matplotlib 数据可视化库。它提供大量专业数据图形制作工具
- 标准模型库
- scikit-learn 标准机器学习库。它主要用于分类、回归和聚合等,依赖于NumPy、SciPy、Matplotlib
- Statsmodels 标准统计模型库。它主要用于假设检验和参数置信区间分析
- Spark ML 分布式机器学习算法库。它可在分布式集群上,如Hadoop,对大量数据建模。Spark ML由Scala开发,但提供Python API
- TensorFlow 成熟的深度学习算法库。它提供GPU运算模块
python安装
- Conda相当于 pip + virtualenv
- 函数名下面的字符串它是函数的说明文档,记录着函数功能的描述,以及函数参数和返回值的定义。
- 在Python中,所有东西都是对象,连函数也是对象
- 在Python中,lambda表达式类似于函数。它以关键字“lambda”开头,之后就是函数的参数列表,并以“:”结尾。紧接着就是表达式主体,整个只是一行语句。
- 从本质上讲,Python的库其实就是一个包含__init__.py文件的目录。
- 当要导入一个库时,需要确保它对应的目录在系统路径下可见。说得通俗一点就是在“sys.path”下面能找到对应的库目录。如果没有,则需要将相应的路径加到“sys.path”里(读者有没有发现,“sys.path”其实就是一个list。)。
- Python书籍推荐:Dive into Python
我注意过,即便是那些声称一切都是命中注定的而且我们无力改变的人,在过马路之前都会左右看。——史提芬·霍金