handson-ml3速记1:机器学习项目概览

165 阅读5分钟

Target

概念、直觉、工具,技术

  • Scikit-learn
    实现许多有效ML学习算法
  • TensorFlow 使用数据流图进行分布式数值计算的库,高效训练和运行神经网络,2015年开源

简单技术(随机森林等)==》深度学习(复杂问题:图像识别、语音识别、NLP)

1 机器学习概览

为什么使用ML?(垃圾邮件过滤 传统vs.ML) ML优势:

  • 需要大量手工任务或需要长串规则解决的问题:ML算法可以简化代码、提高性能
  • 问题复杂、传统方法难以解决
  • 环境波动:ML算法可以适应新数据

数据挖掘:使用ML挖掘大量数据,可以发现不显著的规律

ML类型
  • 监督/非监督学习
  • 在线学习/批量学习
  • 基于实例学习/基于模型学习

监督学习:用来训练算法的训练数据包含标签 重要监督学习算法:

  • K近邻算法
  • 线性回归
  • 逻辑回归
  • 支持向量机(SVM)
  • 决策树和随机森林
  • 神经网络

非监督学习:训练数据不含标签 重要非监督学习算法:

  • 聚类
  • 可视化和降维
  • 关联性规则学习

半监督学习:大量不带标签数据加小部分带标签数据,多数半监督学习算法是非监督+监督

强化学习:学习系统智能体(agent),对环境观察,选择执行动作,获得奖励,自己学习哪个策略最佳,得以获得长久最大奖励。

离线(批量)学习 vs 在线学习 离线学习:必须用所有可用数据训练,一般是线下做,通常会占用大量时间和计算资源 在线学习:使用数据实例持续进行训练,可以每次一个或几个实例,适合接受连续流数据。

基于实例学习:先用记忆学习案例,再使用相似度测量推广到新例子 基于模型学习:分析数据,选择模型,用训练数据训练,使用新模型对案例预测

挑战:
1 训练数据量不足
2 低质量数据
3 不相关特征(特征工程:特征选择、特征提取)
4 过拟合
5 欠拟合

理解训练集、验证集、测试集的作用: 一般是80%数据用作训练集、20%数据用作测试集;用训练集和多个超参数训练多个模型,用验证集选择性能最好的模型和超参数,用测试集做最后一次test。

2 一个完整的机器学习项目

关键步骤:

  • 1 项目概述
  • 2 获取数据
  • 3 可视化数据,发现规律
  • 4 为算法准备数据
  • 5 选择模型,训练
  • 6 微调模型
  • 7 给出解决方案
  • 8 部署、监控、维护
项目概览

利用加州普查数据学习,然后根据指标,预测任何街区的房价中位数

  • 划定问题 商业目标是模型输出,传递给另一个ML系统,确定某个区值不值得投资 当前的解决方案效果如何:当前是专家手工,费钱费时间,效果不理想

设计系统:监督or非监督,or强化学习,分类or回归,批量or线上学习? ans:监督学习,典型的回归任务,多变量回归

  • 选择性能指标 典型指标是均方根误差RMSE、MAE
准备数据
  • 数据清洗
    大部分算法不能处理缺失的特征,需要用函数处理特征缺失问题 举例:total_bedrooms有一些缺失值,对应3个解决选项:
    • 去掉对应街区
    • 去掉属性total_bedrooms
    • 赋值(0、平均值、中位数等)
housing.dropna(subset=["total_bedrooms"])    # 选项1
housing.drop("total_bedrooms", axis=1)       # 选项2
median = housing["total_bedrooms"].median()
housing["total_bedrooms"].fillna(median)     # 选项3
  • 处理文本和类别属性
    大多数算法处理数字,需要文本标签转换为数字 使用独热编码(One-Hot Encoding),Scikit-Learn OneHotEncoder,用于将整数分类值转变为独热向量(因为只有一个属性会等于 1(热),其余会是 0(冷))
>>> from sklearn.preprocessing import OneHotEncoder
>>> encoder = OneHotEncoder()
>>> housing_cat_1hot = encoder.fit_transform(housing_cat_encoded.reshape(-1,1))
>>> housing_cat_1hot
<16513x5 sparse matrix of type '<class 'numpy.float64'>'
    with 16513 stored elements in Compressed Sparse Row format>
  • 自定义转换器 为了让自制的转换器与 Scikit-Learn 组件(比如流水线)无缝衔接工作, 创建一个类并执行三个方法:fit()(返回self),transform(),和fit_transform()

  • 特征缩放 两种常见方法:归一化(normalization)和标准化

  • 转换流水线 Scikit-Learn 提供了类Pipeline

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

num_pipeline = Pipeline([
        ('imputer', Imputer(strategy="median")),
        ('attribs_adder', CombinedAttributesAdder()),
        ('std_scaler', StandardScaler()),
        ])

housing_num_tr = num_pipeline.fit_transform(housing_num)
选择、训练模型

简单的线性回归模型

from sklearn.linear_model import LinearRegression

lin_reg = LinearRegression()
lin_reg.fit(housing_prepared, housing_labels)

复杂点的决策树模型

from sklearn.tree import DecisionTreeRegressor

tree_reg = DecisionTreeRegressor()
tree_reg.fit(housing_prepared, housing_labels)

使用交叉验证评估: Scikit-Learn 的交叉验证功能,K 折交叉验证(K-fold cross-validation) 随机地将训练集分成十个不同的子集,成为“折”,然后训练评估决策树模型 10 次,每次选一个不用的折来做评估,用其它 9 个来做训练。结果是一个包含 10 个评分的数组:

from sklearn.model_selection import cross_val_score
scores = cross_val_score(tree_reg, housing_prepared, housing_labels,
                         scoring="neg_mean_squared_error", cv=10)
rmse_scores = np.sqrt(-scores)
模型微调

前提:你现在有了一个列表,列表里有几个有希望的模型,现在需要对列表中模型微调。

  • 网格搜索 Scikit-Learn的GridSearchCV试验超参

  • 随机搜索 RandomizedSearchCV

  • 集成方法
    把表现最好的模型组合起来

分析最佳模型和它们的误差

通过分析最佳模型,可以发现每个属性对于做出准确预测的相对重要性, 可以丢弃一些不那么重要的特征. 还可以看一下系统犯的误差,搞清为什么会有些误差,以及如何改正问题(添加更多的特征,或相反,去掉没有什么信息的特征,清洗异常值等等).

用测试集合评估系统

从测试集得到预测值和标签,运行full_pipeline转换数据, 再用测试集评估最终模型

评估结果通常要比交叉验证的效果差一点.