End-to-End Machine Learning Project

/ 0评 / 0

数据准备

本章从一个现实问题接触机器学习, 做一个加州房产价格预测.
1. 全局概览
2. 获取数据
3. 探索和可视化数据
4. 为机器学习提供数据
5. 选择一个模型并训练其
6. 微调模型(fine-tune)
7. 呈现解决方案
8. 上线,监视,维持系统

#Frame the Problem

建立模型不是一个项目的终极目标, 我们应该清楚其商业目的. 为问题搭好框架. 选择什么算法,用什么评估模型, 时间精力的分配(数据or算法).考虑下游模型的需要.
在真实的解决方案中数据流在各大模型之间连接他们的称为管道($pipelines$), 因为各部分通常是异步进行的,所以数据流的形式使得整个架构健壮.随之而来的问题是如果缺少对数据的监控,可能会适得其反.
在正式选择模型时, 我们可以看看此问题在现实中是如何解决的?这有利于我们给问题一个偏好模型设定.
当模型选择完成后, 我们应该选择一个合适的评估方法(损失函数).对于回归问题常用的评估方法为均方根$RMSE$, 它测量预测系统的标准偏差.
$\displaystyle RMSE(\mathbf{X},h)=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(h(\mathbf{x}^{(i)})-y^{(i)})^2}$
其中$\mathbf{X}$: 所有特征向量转置后形成新向量 例如$\mathbf{X}=\begin{pmatrix}(\mathbf{x}^{(1)})^T \\ (\mathbf{x}^{(2)})^T \\ (\mathbf{x}^{(3)})^T \\ \cdot \cdot \cdot \\ (\mathbf{x}^{(m)})^T \end{pmatrix}$
$m$: 样本数
$\mathbf{x}^{(i)}$: $i-th$特征向量 例如$\mathbf{x}^{(1)}=\begin{pmatrix}-118.29\\ 33.91\\ 1.416\\ 38.372 \end{pmatrix}$
$\mathbf{y}^{(i)}$: $\mathbf{x}^{(i)}$对应的标记
$h$: 预测方程(假设) $\hat{y}^{(i)}=h(\mathbf{x}^i)$

均方根的结果满足高斯分布($Gaussian \ distribution$)即
$68\%$的数据低于$\sigma$
$95\%%$的数据低于$2\sigma$
$99.7\%$的数据低于3$\sigma$

当面对很多局外数据的时候我们更加偏向选择使用$MAE$(平均绝对误差)
$\displaystyle MAE(\mathbf{X},h)=\frac{1}{m}\sum_{i=1}^{m}|h(\mathbf{x}^{(i)})-y^{(i)}|$
$norms$与损失函数
$RMSE$对应向量的欧几里得距离($Euclidian \ norms$) 叫做$\mathcal{\ell_2} \ norms$记做$||\cdot||_2$或者$||\cdot||$
$MAE$对用曼哈顿距离($Manhattan \ norms$)记做$||\cdot||_1$
更一般的我们定义向量的范数$|| \ \mathbf{v} \ ||_k=(|\nu_0|^k+|\nu_1|^k+ \cdot \cdot \cdot \cdot + |\nu_n|^k)^{\frac{1}{k}}

fileId=5ac6085a823f55128f000009" alt="" />

通过直方图可见
1. 平均收入数据被按比例缩放到$[0.499, 15.0001]$
2. 房屋的平均年龄和售价均被封顶($capped$), 会造成训练的模型预测被封顶
3. 特征缩放不一致($feature \ scaling$)
4. 直方图头重脚轻, 最好的训练数据应是钟型分布($bell \ shape$)

创建测试集

测试集仅仅用来做最后的测试,避免依赖测试集造成$data \ snooping \ bias$(数据迁就偏差)

直接随机索引缺点

没给定种子导致每次随机不确定 np.random.seed(42)
但是当有新增数据时,仍然会导致随机索引不一致
解决方案,寻求一成不变的identifier,例如为每组数据取hash选last byte

除了使用reset_index建立行索引, 还可以自己建立一个独特的标签 比如经度与维度组合

分层采样 ($stratified \ sampling$)

如果数据规模很大可以采取上述的方法采样, 但对于小规模数据, 这种随机采样很大概率会造成采样偏差($sampling \ bias$)
假定收入水平是当地房价最为关键的特征,那么可以根据平均收入分层采样

可知收入已经被聚类, 但还可以进一步划分达到分层采样的标准, 比如呈现钟型分布

可视化数据

寻找关联性

引入标准相关系数($standard \ correlation \ coefficient$) 或皮尔逊相关系数($Pearson's \ r$)
简言之是中心化处理后的向量之间的余弦相似度
余弦相似度图例:余弦相似度图例
注意$Pearson's \ r$只能描述线性相关情况,观察底部尽管相关度为$0$,但不表示轴之间就没有一点关联
观察第二行,相关度都为$-1$,和斜率($slope$)显然无关,相关度只是轴之间数据的线性关系,与单位大小无关

尝试组合属性

出发点: 有些数据和目标属性存在一些有用的相关性, 有一些数据存在头重脚轻的分布
在这些数据中我们关心每处房产的房间数,每个房间的床位数,每户家庭人口,尝试把这些属性组合起来
房间数, 地产数,床位数本身无用, 我们可以把他们组合起来

观察可知最正相关的是median_income, 最负相关的是bedrooms_pre_room
我们称这种组合更informative

为机器学习算法准备数据

为机器学习算法设计自己的转型方法, 为了更好地适应新数据, 建立自己的转型库以便在未来的项目中应用.

数据清洗

对于丢失项我们有三种处理方式
1. 丢弃相应的行 housing.dropna[subset=["total_bedrooms"]
2. 丢弃整个属性 housing.drop("tot_bedrooms", axis=1)
3. 填充特定的值 housing["tot_bedroom"].fillna(median)
分别对应DataFrame的 dropna(), drop(), fillna()

观察info 发现缺失项被填补

处理文本和明确的属性

对于前期丢弃的非数值项属性, 应运用转换变标签为数值.

 

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

自定义转换器

由于sklearn的函数是鸭子类型因此很好编写自己的装换方法,不使用继承的情况下使用了多态。
创建类,实现三个方法:fit(), transform(), fit_transfom()
fit_transform() 可以通过继承TransformerMixin()实现
此外我们还可以通过继承BaseEstimator得到两个额外的方法:get_params()和set_params() 用来做自动化的超惨优化
下面是一个之前提到的特征组合使用自定义转换器实现

[/crayon]

[/crayon]

[/crayon]

[/crayon]

特征缩放 数据归一化(Normalization)

两种方式去缩放特征
1. $ Min-Max\ Scaling(normalization)\ $ $\displaystyle z=\frac{x_i-min}{max-min}$, $z\in [0,1]$
sklearn 提供超参数 feather_range制定数值范围,如果不想以0-1为范围
2. $Standardization $ $\displaystyle z=\frac{x_i-\mu}{\delta}$, ($\mu 均值, \delta 方差$)
标准化虽然不能把数值缩放到指定范围,但受局外数据影响较小
sklearn 提供StandardScaler来标准化

转换流水线Pipeline

Pipeline构造函数接受一系列的name/估计器fit_transform(),但要保证最后一个估计器必须是转换器,实现fit()功能
当流水线上的工作调用fit()时他会在所有转换器上顺序调用fit_transform(),把上一个输出作为参数传入到下一个转换器,直到最后一个工作实现训练fit() 流水线也可以串联起来工作

[/crayon]

[/crayon]

[/crayon]

[/crayon]

选择和训练模型

架构问题,获取数据,概览数据,获取训练集和测试集,通过转换器流水线洗数据为ML算法自动化准备数据.

训练和在训练集上评估

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

使用均方根评估线性模型

[/crayon]

[/crayon]

误差过大,欠拟合

原因:数据信息不全面, 模型不给力,这里我们先试着换模型

[/crayon]

[/crayon]

[/crayon]

[/crayon]

?! 可能已经过拟合

此时在模型还没有完全调好前, 千万不能拿测试集评估, 我们试着在训练集上划分来验证做Validation.

使用交叉验证来初期评估模型

使用$K-fold \ cross-validation$ 默认10折验证

[/crayon]

[/crayon]

[/crayon]

[/crayon]

[/crayon]

尝试随机森林模型

看起来随机森林的$rmse$和有前景, 但是经过交叉验证仍然表明过拟合

Fine-Tune Model

 

Randomized Search

分析调好的模型和误差

根据上面的相关性排序,可以选择性丢掉一些属性,或者增加额外的特征属性

在测试集上评估系统

上线, 监视,维护系统

随着数据的发展,模型可能会变坏,要监视系统的输入,做好快照

完整的流水线包含准备数据和预测

Execises

发表评论

电子邮件地址不会被公开。 必填项已用*标注