机器学习概览
Machine Learning
wangzf / 2023-02-24
目录
机器学习系统的种类
- 监督、无监督、半监督学习
- 批量学习、在线学习
- 基于实例、基于模型的学习
机器学习的主要挑战
- 训练数据的数量不足
- 训练数据不具有代表性
- 数据质量差
- 无关特征
- 模型在训练数据上过度拟合
- 改进模型过拟合的方法之一是提供更多的训练数据,直到模型验证误差接近训练误差
- 模型复杂度高,对模型进行正则化:
- 多项式模型:降低多项式的阶数
- 岭回归,Ridge Regression
- Lasso 回归,Lasso Regression
- 弹性网络,Elastic Net
- 模型在训练数据上欠拟合
- 模型复杂度低:如果模型对训练数据欠拟合,添加更多的训练样本也没用, 此时需要使用更复杂的模型,或找到更好的特征
- 偏差/方差权衡
- 模型的泛华误差可以被表示为三个不同的误差之和:
- 偏差:这部分泛化误差的原因在于错误的假设:比如假设数据是线性的:而实际上是二次的。 高偏差模型最有可能对训练数据拟合不足
- 方差:这部分误差是模型对训练数据的微小变化过度敏感导致的。 具有高自由度的模型,很可能有高方差,所以很容易对训练数据过拟合
- 不可避免的误差: 这部分误差是因为数据本身的噪声所致,减少这部分误差的唯一方法是清理数据
- 增加模型的复杂度通常会显著提升模型的方差,减少偏差;反过来,降低模型的复杂度则会提升模型的偏差,降低方差
- 模型的泛华误差可以被表示为三个不同的误差之和:
机器学习建模法则
架构问题,关注蓝图
- 用商业术语定义目标;
- 方案如何使用?
- 目前的解决方案/办法是什么?
- 应该如何架构问题(有监督/无监督,在线/离线…)?
- 如何测量性能?
- 性能指标是否与业务目标一致?
- 每个业务目标需要的最低性能是什么?
- 有没有一些相似的问题?能重用一些经验和工具吗?
- 有没有相关有经验的人(专家)?
- 如何手动解决此问题?
- 列出目前为止你(或其他人)的假设;
- 如果可能的话,验证假设;
获取数据
- 列出需要的数据及其体量;
- 查找并记录获得数据的途径;
- 检查需要的空间;
- 检查法律义务,必要时获得授权;
- 获取访问权限;
- 创建工作空间,确保具有足够的存储空间;
- 获取数据;
- 将数据转换为可操作的格式,不改变数据本身;
- 确保删除或保护敏感信息;
- 检查数据的类型和大小;
- 采样一个测试数据集,放在一边,永远不要使用它;
- 尽可能地自动化,以便获取最新数据
研究数据
- 创建数据的副本用于研究;
- 如果需要,可以将其抽样为可管理的大小;
- 创建一个 Jupyter 笔记本来记录数据研究;
- 研究每个属性及其特征:
- 特征名称
- 特征类型
- 类别型
- 有序
- 无序
- 数值型
- 整型
- 浮点型
- 有界
- 无界
- 文本
- 结构
- 类别型
- 缺失值的百分比
- 噪音和噪音类型
- 随机
- 异常
- 舍入误差
- 可能有用的任务
- 分布类型
- 高斯分布
- 均匀分布
- 对数分布
- 对于有监督学习任务,确认目标属性;
- 可视化数据;
- 研究特征之间的相关性;
- 研究如何手动解决问题;
- 确认希望使用转换;
- 确认可能有用的额外数据;
- 记录学习到的东西;
- 试着从这些步骤的领域专家那里获取灵感
准备数据
- 清理数据:
- 修复或删除异常值;
- 填充缺失值;
- 特征选择:
- 删除不能为任务提供任何有用信息的特征;
- 0 方差或者近似 0 方差特征
- 删除不能为任务提供任何有用信息的特征;
- 处理特征(在适当的情况下):
- 离散化连续特征;
- 分解特征:
- 分类
- 日期/时间
- 添加期望的特征转换
$log(x)$
$\sqrt{(x)}$
$x^{2}$
- 在数据的副本上工作(保持原始数据集不变);
- 编写适用于所有数据转换的函数:
- 可以很容易准备下一次得到新数据时的数据;
- 可以在未来的项目中使用这些转换;
- 清理和准备测试数据集(testing);
- 一旦解决方案失败,用来清理和准备新数据集;
- 可以轻松地将准备作为超参数;
列出期望的模型
- 使用标准参数,从不同类别的模型中训练需求快速地不成熟的模型;
- 线性
- 朴素贝叶斯
- SVM
- 随机森林
- 神经网络
- 评估并比较这些模型的性能;
- 对于每个模型使用交叉验证计算性能的测试的均值和标准差;
- 分析每个算法最终要的变量;
- 分析模型产生的错误类型;
- 人类用什么样的数据避免这些错误;
- 快速进行特征选择和处理;
- 对前面5步进行一到两次快速迭代;
- 列出前3到5个最优希望的模型,倾向于选择有不同错误类型的模型;
- 如果数据很大,可能需要采样为较小的训练集,以便于在合理的时间内训练不同的模型;
- 尽可能地自动化这些步骤;
微调模型
- 使用交叉验证微调超参数;
- 把数据转换当做超参数,尤其是不确定时
- 缺失值的填充
- 需要研究的超参数值很少: Grid Search
- 需要研究的超参数值很多: Random Grid Search
- 把数据转换当做超参数,尤其是不确定时
- 尝试组合方法,组合多个好魔性往往比单独运行效果好;
- 一旦对最终模型有信息,在测试集上测量性能以估计泛化误差;
- 使用尽可能多的数据,特别是在微调结束时;
- 自动化
展示解决方案
- 文档化所做的工作
- 创建完美的演示;
- 确保突出蓝图;
- 解释为什么解决方案达到了业务目标;
- 展示发现的一些有趣的内容;
- 描述什么可以工作,什么不行;
- 列出假设和系统的局限性
- 确保关键发现被完美展示或易于记忆的称述;
启动、监视、维护系统
- 准备好生产环境的解决方案;
- 插入生产数据输入
- 写单元测试
- 编写监控代码,定期检查系统的性能,出问题时及时报警;
- 需要考虑缓慢退化: 随着数据的增加,模型往往会不合适;
- 测量性能可能需要人工流水线;
- 监控输入质量
- 定期对新数据重新建模(自动化);
模型优化
- 研究模型学习曲线
- 判断模型是否过拟合或者欠拟合,并作出相应的调整
- 对模型权重参数进行分析
- 对于权重绝对值高或低的特征,可以进行更细化的工作,也可以进行特征组合
- 进行 Bad-Case 分析,针对错误的例子确定是否还有地方可以修改挖掘
- 进行模型融合
机器学习项目
泰坦尼克之灾
Titanic(泰坦尼克之灾)
房价预测
House Prices: Advanced Regression Techniques(房价预测)
数字识别
Digital Recognition(数字识别)