UCB Data100:数据科学原理与技术
课程概述 Course Overview
在数据科学中有很多工具,但它们不会思考
The purpose of computing is insight, not numbers.
计算的目的是洞察,而不是数字
——Hamming
数据采样和概率 Data Sampling and Probability
偏差:
- 选择偏差:可能不包括或有利于特定的群体
- 回应偏差:人们不会真实回答
- 不回应偏差:人们不一定回答
有替换的随机取样:避免一个人被选到两次
简单随机取样:一个人可能被选到两次
在样本总量很大时,两者表现相似
二项式/多项式概率
Pandas
引入:
|
生成的是 DataFrame
类(类似于一张表):
|
这个类有丰富的API,这里只介绍其中的一部分
索引
elections.head(5)
:获取前五行;.tail
同理
loc
通过标签 label 选择物品,有行标签和列标签
loc
的参数可以是:
- 列表:
elections.loc[[87,25,179],["Year","Candidate","Result"]]
- 切片:
elections.loc[[87,25,179],"Popular vote":"%"]
,注意这里的对字符串的切片表示从Popular vote
到%
的所有列 - 值:
elections.loc[[87,25,179],"Popular vote"]
同样可以只使用 :
来选取所有元素
iloc
使用数字(0-xx)选取物品
[]
只接受一个参数:
- 行数字的切片
- 列标签的列表
- 单个列标签
在 pandas 中有三个基本数据结构:
- Data Frame:二维数据表格
- Series:一维数据
- Index:行标签序列
可以把 Data Frame 视为有相同 Index 的 Series 的集合
行标签不一定要唯一,列标签一般唯一
使用 Series.to_frame()
可以把 Series 转为 DataFrame 类型
条件选择
因为支持用 bool 列表索引,可以写成:elections[elections["Party"] == 'Independent']
表示选出所有符合的人物。支持更多运算符
还有一些函数可以用于筛选,如
.isin
- ``.str.startswith`
.query
:elections.query('Year >= 2000 and Result == "Win"')
,类似于 SQL 的操作- 用
@character
访问 python 变量
- 用
其它
.size
、.shape
同 Numpy
.describe()
统计了各列有用的值,包括数量、平均值、方差、最小值、25%、50%、75%、最大值
.sample(n)
随机取 n 行,默认是无重复的,可以使用 replace=True
改为有重复的
.value_counts()
计算 Series 中每个值的出现次数
Series.unique()
返回一个包括所有不重复的值的 Series
.sort_values()
给 DataFrame 排序,可指定的参数有 ascending
、key
、by
等
添加、修改与删除
添加一列非常简单:babynames["name_lengths"] = babyname_lengths
向 babynames
DataFrame 中添加标签为 name_lengths
的一列,数据是 babyname_lengths
删除一列:babynames.drop("name_lengths", axis = 'columns')
修改:使用 map
:babynames["dr_ea_count"] = babynames["Name"].map(dr_ea_count)
groupby 和 agg
在 agg
之前显式选择列 fbn.groupby("Name")[["Count"]].agg(ratio_to_peak)
groupby
返回一个 DataFrameGroupBy 对象,agg
是其中之一生成 DataFrame 的方法,其它的还有
max
:使用max
函数聚合size
:使用每个子 frame 的大小创建一个新的 Seriesfilter
:从原始 DataFrame 中复制一个新的,但只保留满足条件的行
Pivot Tables
|
合并表格
merged = pd.merge(left= elections, right= male_2020_babynames, left_on= "First Name", right_on= "Name")
数据整理和 EDA Data Wrangling and EDA
- 结构
- 表格,矩阵
- TSV,CSV,JSON
- xml,txt
- 定性 qualitative
- 定量 quantitative
- 粒度
- 范围
- 时效性
- 可靠性
可视化 Visualization
目的:
- 帮助你理解数据
- 与别人交流结果
画条形图:
-
Series.bar
-
plt.bar
-
sns.countplot
图表类型
-
histogram
-
box plot
-
violin plot
-
scatter plot
- contour plot
- hex plot
KDE Kernel density estimation:
- 在每个数据点放一个 kernel(一般是高斯 kernel,即正态分布)
- 标准化为 1
- 将所有 kernel 加起来
颜色的选择
取对数等方法转变为线性关系
建模和简单线性回归 Modeling and Simple Linear Regression
线性回归是最小化平均平方误差估计的直线
相关系数 correlation 是 x 和 y 乘积的平均值,并标准化:
协方差 covariance
表示了两个变量之间的线性,,越接近 1 则线性程度越高,为正表示两个变量正相关
线性回归:
模型 model 是一个系统的理想化表示
为什么要建模?
- 理解复杂的现象
- 对于未知的数据做出准确的估计
简单线性回归 Modeling and Simple Linear Regression (SLR) 是一个参数模型 parametric model,即可以基于数据选择最好的斜率和截距的参数
符号 | 含义 | 符号 | 含义 |
---|---|---|---|
真实观察值 | 估计值 | ||
模型参数 | 最优参数(定义最优) |
建模过程:
- 选择模型
- 选择损失函数
- 填充模型
- 估计模型表现
损失函数 loss function 特征化错误
平方损失:
绝对值损失:
平均损失:,其揭示了模型与数据的符合程度
通过求导的方法求出最优解中的 b
通过可视化等方法评估模型的好坏
常数模型,损失和转换 Constant Model, Loss, and Transformations
估计 estimation 是使用数据决定模型参数的工作
预计 prediction 是使用模型预计未知数据的工作
常数模型
通过最小平方可以得出
常数模型与线性回归模型比较:
- 常数模型:
- 是一维的
- 损失表面是二维的
- 预计轴须图 rug plot
- 线性回归模型:
- 是二维的
- 损失表面是三维的
- 预计散点图
如果使用绝对值损失,则
对比两个损失函数,不难发现:
- MSE
- 光滑
- 对异常值敏感
- MAE
- 分段
- 对异常值鲁棒
安斯库姆四重奏 Anscombe's quartet:有四组数据,它们的均值,方差,协方差都相同,但是分布大相径庭,即可视化很重要
Tukey-Mosteller Bulge Diagram:图像向那个方向弯,就使用哪个方向的函数
多重线性回归:
通常最小二乘法 Ordinary Least Squares
使用线性代数,期望向量写成:
最小二乘法估计:
通过投影等方法可以解得:
梯度下降 sklearn Gradient Descent, Sklearn
引入线性回归:from sklearn.linear_model import LinearRegression
创建一个模型:model = LinearRegression()
填入模型:model.fit(df[['total_bill']], df['tips'])
预期参数:model.predict(df[['total_bill']])
可以通过:model.intercept_
获取截距,model.coef_
获取系数
多重线性回归同理
最小化任意一维函数:
|
原理是每一步的都调整新的位置,不断朝下走
选择不同的 以达到最好的效果
梯度下降,特征工程 Gradient Descent, Feature Engineering
对于多参数的,有:
\vec{θ}^{(t+1)} = \vec{θ}^{(t)} - α ∇_\vec{θ} L(\vec{θ}, X, \vec{y})
小捆梯度下降 Mini-batch grandient descent:使用数据的每一捆计算梯度,如使用数据的前 10% 计算梯度,调整参数;再用下一个 10% 计算并调整
一般选择的 batch 大小为 32 个点,在每个训练阶段都要对数据重新洗牌
梯度下降找到的是局部最小值,对于凸函数,总是能找到全局最小值
对于满足非线性的数据,使用非线性变化,如添加一个新的特征 ,再使用线性回归,得到的就是多项式的关系
特征工程 feature engineering 是将原始特征转化为更有价值的特征的过程,有利于
- 获取域知识
- 使用简单线性模型表达非线性关系
- 将非数字的特征编码为输入
特征函数 feature function:将 d 维输入转换为 p 为输入
独热编码 one hot encoding:对于每个类别赋予 1,可以使用 get_dummies
函数
使用的多项式阶数越高,即复杂度 complexity 越高,对当前数据的拟合程度越高,即错误 error 越少,但过拟合 overfitting 越多,即方差 variance 越大
交叉验证,正则化 Cross Validation, Regularization
检测过拟合的方法:holdout method:将数据集中的一部分用于训练,剩余部分用于验证模型的准确性,注意要在分裂数据之前打乱数据
选择验证集误差最小的模型复杂度
超参数 hyperparameter 是控制学习过程自身的一个值,即选择模型的参数
k 折交叉验证法 k-fold cross-validation:将数据分成 k 份,每次使用其中一部分作为验证集,其余部分训练模型,重复 k 次,取验证误差的平均值为该模型的验证误差
测试集 test set 是未知解的一般数据集
- 训练集用于挑选参数
- 验证集用于挑选超参数,即在不同模型中选择
- 测试集用于最终提供一个无偏向的 MSE (均方误差)
测试误差通常与验证误差很接近
L2 正则化 L2 regularization:模型的参数约束在原点周围的一个球,找出最小化
其中
等价问题是找出最小的 ,使得
其中 是一个复杂度控制参数
可以使用 Ridge
类运行 L2 正则化
闭式解为
L1 正则化 L1 regularization:模型的参数约束在原点周围的一个立方体,找出最小化
其中
等价问题是找出最小的 ,使得
可以发现与 L1 和 L2 误差有关联
可以使用 Lasso
类运行 L1 正则化
无闭式解
概率 Probability
如果 IID 变量的尺寸大小 n 很大,则样本分布的概率接近于正态分布
预期 prediction 是使用模型预期未知的数据
推理 Inference 是使用模型得出特征和回应的真实关系
推理:关于仅给定一个随机的样本,得出总体参数的结论
对于一个新的独立点(x,Y),模型风险 model risk 是平均平方预期误差
模型风险由三个部分组成:
- 观察方差 observation variance:因为测量技术有限,所以真实的 Y 和测量值之间有 noise,即 其中 是随机误差,故观察方差为
- 模型方差 model variance:模型建立在随机样本上,所以若样本不同,则模型不同,模型方差 = ,其主要来源是过拟合
- 模型偏差 model bias:预期值和真实 的差异,即模型偏差 = ,其主要来源是欠拟合
得出等式:
模型风险 = 观察方差 + (模型偏差)^2 + 模型方差
即
如果模型的复杂度增加,则模型方差增大;若复杂度减小,则模型偏差增大,这就是测试误差会先减小后增大的原因
对于线性关系,如果系数 为 0,则表示结果和 没关系
假设测试:零假设:真正的 为 0
若一个特征能够通过另一个特征的一个线性函数精确预期,则这个特征和那个特征共线性 collinearity,此时该模型无效
SQL
数据库优点:
数据存储:
- 可靠存储
- 优化无法放入内存的数据的计算
- 使用特殊数据结构提高性能
数据管理:
- 配置了数据的逻辑组织和访问权限
- 保障数据
- 防止数据异常
- 保证对数据的并发操作的安全
加载 SQL 模块:%load_ext sql
使用 SQL 命令:%%sql
SQL 表的每个列都有三个属性:列名 colName,类型 Type,和 0 个或多个约束 constraints
主键 primary key 用于所有的优化,不能重复
SQL 语句格式:
|
选择时可以使用 AS
取别名,如:SELECT cute AS cuteness, year AS birth FROM Dragon;
连接条件用 AND
、NOT
和 OR
COUNT(*)
返回行数
排序:ORDER BY cute DESC
- 降序
DESC
- 升序
ASC
取前几个使用 LIMIT number
不从第一个开始取可以使用 OFFSET n
筛选:
- 行:
WHERE
- 组:
HAVING
DISTINCT
去掉相同的项,如 SELECT DISTINCT type, cost FROM Dish;
使用 sqlalchemy 库使用 SQL 命令
- 创建一个
sqlalchemy engine
- 调用
engine.connect()
连接 pd.read_sql(SQL 命令, connection)
,返回一个 dataframe
LIKE
关键词类似于简单的正则表达式,用于匹配,如 LIKE '%:00%'
用于匹配 8:00
等
CAST
类似强制类型转换,如 CAST(runtimeMinutes AS int)
如果什么都不做,如 SELECT * FROM s, t;
则新的表相当于两个表的笛卡尔积
所以内部 join 相当于去掉了错误行的交叉 join
左外部 join:让左边表的每个行出现在结果中,无论是否匹配,如 SELECT * FROM s LEFT JOIN t ON s.t = t.v;
右外部 join 同理
当然,也可以使用条件而不是相等来 join,如 SELECT * FROM student, teacher WHERE student.age > teacher.age;
主成分分析 PCA Pricipal Component Analysis
矩阵乘法的两种解释:
- 操作
- 坐标变换
矩阵分解:一个矩阵不能分解成秩小于原矩阵的两个矩阵
奇异值分解将矩阵分解为两个矩阵:
- 左矩阵 和原矩阵的维度相同
- 右矩阵 将 变换回 X
我们发现,去掉 的最后一列后变换回去的矩阵和原矩阵非常相似
- 是一个对角矩阵,对角线上的值由 X 的奇异值组成,且逐渐下降
- U 和 V 的列都是单位正交集
- 的列有一个名字:主成分 Pricipal Components
要先把每一列减去其平均值,也就是把数据中心化,因为 PC 一定是过原点的
第一维 PC 给每个国家一个在直观坐标轴上的分数:
PC2 更难解释,表示在 PC1 线上多“上”或多“下”
定义数据的总方差 total variance 为每个属性的方差之和,每一个 PC 捕捉的方差为
碎石图 scree plot:画出每个奇异值捕捉到的方差:
主成分分析 Pricipal Component Analysis(PCA):将数据转入到一个新的坐标系,其最大的方差在一维,第二大的在二维,以此类推
回归最小化竖直(或水平)线的平均平方错误:
SVD 找到了最小的投影误差:
PCA 对 EDA 的适用情况:
- 在高维度可视化相似的团簇观察值
- 仍然在探索数据(如果已经知道预期什么,不需要 PCA)
- 有很多属性,但只有一些(可能未被观察到)的属性最大程度上决定了线性关心的剩余
逻辑回归 Logistic Regression
回归和分类都是有监督学习 supervised learning
二项分类:
- 两类
- 回应 response y 不是 0 就是 1
可以发现,每个仓的 y 的平均值是一个概率:
但这个概率不是一个线性模型,所以需要进行变化:
- 比率 odd 不同于概率 Probability,它表示发生和不发生的比值,即
- 注意到其可能是指数的,所以取对数即可变成线性的
- 最终得出 sigmoid 函数,即:
所以预期:
逻辑函数光滑了从 0 到 1 的跳跃
线性回归用于 prediction,逻辑回归用于 classification
平方误差无法使用,因为:
- 非凸
- 有界(概率在 0 到 1 之间)
- 概念上难以解释
交叉熵损失 cross-entropy loss:
y 的两种情况分别对应两幅图:
LogisticRegression
模型的用法和线性回归相似
交叉熵损失实际上最大化训练数据的可能性,最优的 theta 就是将所有可能性“推向”真实的类
如果存在一个超平面,将输入特征 x 分成两类 y,则称该数据集线性可分 linearly separable
如果线性划分的话,该模型是过分自信的 overconfident
分类器的测量指标:
- 精度 accuracy = 正确分类的点数 / 总点数
将结构分为四类:
- accuracy = ,表示正确区分的点数
- precision = ,表示当其为阳性时,分类器检测出来的概率
- recall = ,表示分类器对于阳性的敏感度
两者面临权衡取舍
- 我们有时看着 precision,不能误判;有时重视 recall,宁错杀、不放过
分类门槛:
这个门槛影响着我们的选择
ROC(Receiver Operating Characteristic) 曲线对不同的分类门槛画出了 TRP - FPR 曲线
计算模型的 AUC(area under curve),最理想的情况是 AUC = 1,最坏情况是 AUC = 0.5(即随机选择)
决策树 Decision Trees
创建时加入参数:LogisticRegression(multi_class = 'ovr')
,其中 ovr
表示 one vs rest,即选择最大的那个
决策树 Decision Tree 是交替区分数据的方式:
可以发现,直接使用决策树会导致过拟合,决策树能保证几乎每个点都分类正确,除了重叠的几个点
对比 2 维和 4 维的决策树,可以发现 4 维的反而更简单,并不一定是维度越高越复杂
决策树生成算法:
- 所有数据在根结点开始
- 重复直到每个结点都是纯净的 pure 或不可分裂 unsplittable:
- 选择最好的特征 x 和最好的分裂值 β
- 把数据分成 和 两个结点
一个结点的熵:
可以看到熵并不是递减的,但倘若加上权重,即加权熵 weighted entropy 为熵乘以该结点处的样本比例,这是递减的
所以最优选择的依据是 最大
防止过拟合的方法:
- 设置一个或多个规则防止树成长:不创建 的结点
min_impurity_decrease
,限制树的最大深度max_depth
,不分裂 < 1 % 样本的结点min_samples_split
等 - 让树完全成长,然后砍掉树的一些分支:在创建树之前设定验证集,如果将一个结点用它最普通的预期替代对验证集错误没有影响,则不要分裂该结点
随机森林 random forest:控制方差,通过建立许多决策树并给它们投票
bagging:简单来说就是 bootstrap
- 对训练数据使用 bootstrap 重采样
- 对每个重采样建立模型
- 最终模型 = 每个小模型的平均预期
但是 bagging 对减少模型方差不够,所以只在每个分裂处使用 m 个特征的一个样本,通常 m = sqrt(p)
随机森林算法:bootstrap 训练数据 T 次,对每个重采样:
- 从一个结点开始数据,直到所有数据 pure
- 选择一个 impure 结点
- 选择 m 个特征的随机子集
- 分裂
询问 T 个决策树的预期,选择大多数的
这个方法有两个超参数 T 和 m
这些想法都是启发性 heuristic 的,即无法证明最优,但确实有效
团簇 Clustering
有监督学习:目标是创造一个把输入映射到输出的函数,如回归和分类
无监督学习:目标是在未标记的数据中识别模式,如 PCA 和 团簇
K-平均团簇 K-mean clustering:
- 任选一个 k,随机取 k 个中心,每个有不同的颜色
- 重复执行直到收敛:
- 将每个点的颜色改为最接近的中心的颜色
- 把中心移动到那个颜色的点群的中心
评估团簇结果的损失函数:
- 惰性 inertia:每个点到它的中心的距离平方的和
- 失真 distortion:每个点到它的中心的距离平方的加权和
K-Mean 算法无法找到全局最优解的原因:两个优化器交替工作:
- 第一个优化器保持中心位置不变,优化数据颜色
- 第二个优化器保持数据颜色不变,优化中心位置
最优化惰性的算法:NP-Hard
层次聚类算法 agglomerative clustering
- 开始时每个点都在它自己的团簇中
- 连接两个邻近的团簇,直到剩下 K 个团簇
可以通过树状图 dendrogram 可视化合并的层次结构:
还有很多其他的团簇算法,有不同的结果:
选择 K:
肘方法 elbow method:对许多不同的 K 画出 inertia 图,选择“肘部”的 K
轮廓系数 silhouette score 用于评估一个具体的数据点有多么“聚在一起”
- 高得分:接近它的某聚类中的其它点
- 低得分:远离它的聚类中的其它点
- 对于一个点 X,得分 ,其中
- $A = $ 聚类中其他点的平均距离
- $B = $ 最近聚类中的其他点的平均距离
- 可以看到 S 最大为 1,最小可能为负数