机器学习项目的通用工作流程

定义问题

选择模型评估指标

  • 测量预测值和目标值两个向量距离的方法:RMSE和MAE
  • 回归问题的典型指标是均方根误差RMSE
    $$RMSE(X,h)=\sqrt{\frac{1}{m}\sum_{i=1}^{m}(h(x^{i})-y^{i})^2}$$
    均方根误差测量的是系统预测误差的标准差。例如,RMSE等于50000,意味着,68%的系统预测值位于世纪值的50000美元以内,95%的系统预测值位于实际值的100000美元以内(一个特征通常都符合高斯分布,即满足“68-95-99.7”规则:大约68%的值落在$$1\sigma$$以内,等。
    MAE:平均绝对误差
    $$MAE(X,h)=\frac{1}{m}\sum_{i=1}^{m}\lvert(h(x^{i})-y^{i})^2\rvert$$

获取数据

加载数据使用Pandas

快速查看数据结构

  • 使用DataFrame的head()方法和info()方法
    head()方法可以查看该数据集的前五行
    info()可以快速查看数据的描述
    value_counts()查看Object类型的项中有哪些类别,每个类别中包含多少数据
    describe()展示数值属性的概括
  • 调用hist()方法画出每个数值属性的柱状图

创建测试集

如何创建数据集?避免数据透视偏差,测试集中数据的分布规律应与完整数据集是一致的。

  • 纯随机抽样
train_set, test_set = train_test_split(housing, test_size=0.2, random_size = 42)
  • 分层抽样
  • 创建测试集时,应用场景中数据集总是更新,如何保证新的测试数据集中不会出现以前的训练集中的实例?
    利用Hash值,根据id
  • 平判依据:需要避免抽样偏差,即测试集中数据的分布规律应与完整数据集是一致的。

研究数据

  • 可视化数据
  • 寻找数值类属性之间的相关性
    使用corr()方法计算出每对属性间的标准相关系数(standard correlation coefficient,也称为皮尔逊相关系数) 。相关系数的范围是-1到1,负相关到正相关。
    使用pandas的 scatter_matrix函数,画出每个数值属性对每个其他数值属性的图
  • 深入观察
  • 试验不同属性的组合,创建新的属性

准备数据

  1. 数据清理:处理缺失值
    去掉对应的行(数据样本):用DataFrame的dropna()方法
    去掉整个属性:用DataFrame的drop()方法
    进行赋值(0、平均值、中位数等)用DataFrame的fillna()方法或者Scikit-Learn中的
ample_incomplete_rows1 = sample_incomplete_rows.dropna(subset=["total_bedrooms"])    # option 1
sample_incomplete_rows1
sample_incomplete_rows2 = sample_incomplete_rows.drop("total_bedrooms", axis=1)       # option 2
sample_incomplete_rows2
median = housing["total_bedrooms"].median()
sample_incomplete_rows["total_bedrooms"].fillna(median, inplace=True) # option 3	
from sklearn.impute import SimpleImputer
imputer = SimpleImputer(strategy="median")
  1. 处理文本和分类属性:将文本类型的属性转换为数字类型:利用转换器LabelEncoder、利用编码器OneHotEncoder
  2. 自定义转换器
  3. 特征缩放(最重要的转换之一—):让所有的属性有相同的量度
  4. 转换流水线:保障数据转换的步骤以正确的顺序来执行

特征缩放

线性函数归一化(Min-Max scaling)(normaliaztion)

  • 通过减去最小值,然后再除以最大值与最小值的差值,来进行归一化
  • scikit-learn提供了一个转换器MinMaxScaler来实现这个功能,该转换器中的超参数(feature_range)可以指定缩放后的范围

标准化

  • 首先减去平均值(所以标准化值的平均值总是0),然后除以方差,使得到的分布具有单位方差
  • StandardScaler
    Tips:与所有的转换一样,缩放器只能基于训练集进行拟合,而不是面向完整的数据集(包括测试集)

研究模型

目标:确定验证集上的评估方法、列出可能的模
型并训练,选择最有希望的3~5个模型

在训练集上训练

选择模型,设计一个损失函数,找到最佳函数(在训练集上进行训练、学习
拟合)

在训练集上评估性能

使用Scikit-Learn的mean_squared_error函数,在全部训练集上计算该回归模型的RMSE来评估其性能

评估模型性能: 基于验证集

  • 用函数train_test_split来分割训练集,得到一个更小的训练集和一个验证集,然后用更小的训练集来训练模型,用验证集来评估。
  • 使用Scikit-Learn的交叉验证功能: k折交叉验证

微调模型

目标:提高泛化性能

  1. 选择最佳超参数,找到最好的模型
    网格搜索、随机搜索
  2. 集成模型
  3. 分析最佳模型和它们的误差
  4. 用测试集评估系统

Q.E.D.


南七技校练习时长四年的练习生