「ML 实践篇」机器学习项目落地

Posted Aurelius-Shu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了「ML 实践篇」机器学习项目落地相关的知识,希望对你有一定的参考价值。

文章目录

1. 项目分析

  • 目的:使用加州人口普查的数据建立加州的房价模型,从而根据所有其他指标,预测任意区域的房价中位数;

机器学习项目清单

  • 框出问题并看整体;
  • 获取数据;
  • 研究数据以获得深刻见解;
  • 准备数据以便将潜在的数据模式提供给机器学习算法;
  • 探索不同模型,并列出最佳模型;
  • 微调模型,并将它们组合成一个很好的解决方案;
  • 演示解决方案;
  • 启动、监视、维护这个系统;

1. 框架问题

  • 业务目标:模型的输出(对一个区域房价的中位数的预测)将会与其他信号一起传输给另一个机器学习系统;下游系统将用来决策这个区域是否值得投资;

  • 流水线,一个序列的数据处理组件;用于机器学习系统中的数据操作和数据转化;

流水线中的组件通常是异步的,每个组件拉取大量数据,进行处理,再将结果传输给另一个数据仓库,然后下一个组件拉取前面输出的数据,并给出自己的输出,以此类推;组件与组件之间独立,只通过数仓连接,系统组件保持简单,互不干扰;

需要实施适当的监控,否则坏掉的组件虽不影响其他组件的可用性,但长时间无补救措施会导致整体系统的性能下降;

  • 现有解决方案:由专家团队手动估算区域的住房价格(先持续收集最新的区域信息,计算房价中位数,若不能计算得到,则使用复杂的规则来估算);现行方案可供参考;

  • 专家系统,由人把知识总结出来,再教给计算机;实施过程昂贵,计算结果也未必令人满意;

这是一个典型的监督学习任务(已经给出了标记的训练示例),也是一个典型的多重回归任务、一元回归任务(系统要通过多个特征对某个值进行预测);这是一个批量学习系统(没有连续的数据流输入,也不需要针对变化的数据做特别调整,数据量也不很大);

2. 性能指标

  • 均方根误差RMSE),欧几里得范数;可用于体现系统通常会在预测中产生多大误差;

R M S E ( X , h ) = 1 m ∑ i = 1 m ( h ( x i ) − y i ) 2 RMSE(X, h) = \\sqrt \\frac1m \\sum_i=1^m (h(x^i) - y^i)^2 RMSE(X,h)=m1i=1m(h(xi)yi)2

  • m,表示测量 RMSE 的数据集中的实例个数(如在 2000 个区域的验证集上评估 RMSE,则 m=2000);
  • x i x^i xi,表示数据集中第 i 个实例的所有特征值(不包括标签)的向量;
  • y i y^i yi,表示标签(实例的期望输出值);

如数据集中第 1 个区域位于经度 -118.29°,纬度 33.91°,居民 1416 人,收入中位数 38372 美元,房屋价值中位数为 156400 美元,则

x 1 = ( − 118.29 33.91 1416 38372 ) x^1 = \\beginpmatrix -118.29 \\\\ 33.91 \\\\ 1416 \\\\ 38372 \\endpmatrix x1= 118.2933.91141638372

y 1 = 156400 y^1 = 156400 y1=156400

  • X,矩阵,包含数据集中所有实例的所有特征值(不包含标签),其中每一行代表一个实例,第 i 行等于 x i x^i xi 的装置,即 ( x i ) T (x^i)^T (xi)T

X = ( ( x 1 ) T ( x 2 ) T . . . ( x 1 999 ) T ( x 2 000 ) T ) = ( − 118.29 33.91 1416 38372 . . . . . . . . . . . . ) X = \\beginpmatrix (x^1)^T \\\\ (x^2)^T \\\\ ... \\\\ (x^1999)^T \\\\ (x^2000)^T \\endpmatrix = \\beginpmatrix -118.29 & 33.91 & 1416 & 38372 \\\\ ... & ... & ... & ... \\endpmatrix X= (x1)T(x2)T...(x1999)T(x2000)T =(118.29...33.91...1416...38372...)

  • h,系统的预测函数,也称假设;当给系统输入一个实例的特征向量 x i x^i xi 时, 它会为该实例输出一个预测值 y ^ i = h ( x i ) \\haty^i = h(x^i) y^i=h(xi)(如系统预测第一个区域的房价中位数为 158400 美元,则 y ^ 1 = h ( x 1 ) \\haty^1 = h(x^1) y^1=h(x1) = 158400,其预测误差为 y ^ 1 − y 1 \\haty^1 - y^1 y^1y1 = 2000);
  • RMSE(X, h),使用假设 h 在一组实例中测量的成本函数;

其他函数

  • 平均绝对误差Mean Absolute ErrorMAE平均绝对偏差),曼哈顿范数

M A E ( X , h ) = 1 m ∑ i = 1 m ∣ h ( x i ) − y i ∣ MAE(X, h) = \\frac1m \\sum_i=1^m | h(x^i) - y^i | MAE(X,h)=m1i=1mh(xi)yi

RMSE 和 MAE 都是测量两个向量(预测值向量和目标值向量)之间距离的方法;范数指标越高,越关注大值而忽略小值(RMSE 对异常值比 MAE 更敏感,当离群值呈指数形式稀有时,RMSE 表现非常好);

2. 获取数据

1. 准备工作区

  • 创建工作区目录
export ML_HOME="$HOME/Documents/workspace/projects/aurelius/lmsl/studying/ml/handson-ml2/workspace"
mkdir -p $ML_HOME
  • 安装 Python(这里省略安装细节)

Python 版本需要保持 python3 的较新版本,pip 版本则保持最新;

# 查看 pip 版本号
python3 -m pip --version

# 升级 pip 至最新版
python3 -m pip install --user -U pip
  • 创建专属 Python 环境
cd $ML_HOME
# 创建一个名为 `.venv` 的专属 Python 环境
python3 -m venv .venv

# 进入专属 Python 环境
source .venv/bin/activate     # on Linux or macOS
# $ .\\.venv\\Scripts\\activate  # on Windows

# 退出专属 Python 环境
deactivate
  • 安装依赖模块

    • requests
    • Jupyter
    • NumPy
    • pandas
    • Matplotlib
    • ScikitLearn
# 通过 pip 按照依赖模块
pip install requests jupyter matplotlib numpy pandas scipy scikit-learn

# 将专属环境注册到 Jupyter 并给它一个名字
python -m ipykernel install --user --name=ml-venv
# 若安装缓慢,可切换 pip 清华镜像源
cd ~/.pip
vi pip.conf
# 在 ~/.pip/pip.conf 加入如下配置
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple

[install]
trusted-host=pypi.tuna.tsinghua.edu.cn
  • 启用 Jupyter Notebook
jupyter notebook

启用 Jupyter Notebook 将在本地开启一个 Web Service,通过 http://localhost:8888 访问该服务;

推荐直接使用 VS Code 的 Jupter 插件使用 Jupyter Notebook,无须自己通过 jupyter notebook 命令启动 Jupyter Service(具体使用方法可自行探索);

2. 下载数据

这个项目的数据是 csv 格式的压缩包;可以通过浏览器下载并通过 tar 命令解压获得,但推荐创建一个 Python 函数来实现通用处理;

import tarfile
import requests

def fetch_data(url, path, tgz):
    if not os.path.isdir(path):
        os.makedirs(path)

    tgz_path = os.path.join(path, tgz)
    with open(tgz_path, 'wb') as w:
        w.write(requests.get(url).content)

    housing_tgz = tarfile.open(tgz_path)
    housing_tgz.extractall(path=path)
    housing_tgz.close()
  • 将数据下载并加压到工作区路径
import os

DOWNLOAD_ROOT = "https://raw.githubusercontent.com/ageron/handson-ml2/master/"
HOUSING_PATH = os.path.join("workspace", "datasets", "housing")
HOUSING_URL = DOWNLOAD_ROOT + "datasets/housing/housing.tgz"
HOUSING_TGZ = "housing.tgz"

fetch_data(HOUSING_URL, HOUSING_PATH, HOUSING_TGZ)
  • 使用 pandas 加载并查看数据
import pandas as pd

def load_data(path, csv):
    csv_path = os.path.join(path, csv)
    return pd.read_csv(csv_path)

housing = load_data(HOUSING_PATH, 'housing.csv')

3. 查看数据

查看数据集前 5 行

housing.head()

  • 实例属性
    • longitude: 经度
    • latitude: 纬度
    • housing_median_age: 住房中位数年龄
    • total_rooms: 房子总数
    • total_bedrooms: 卧室总数
    • population: 人口
    • households: 家庭(户数)
    • median_income: 收入中位数
    • median_house_value: 房价中位数
    • ocean_proximity: 海洋的距离

查看数据集简要描述

housing info()

<class 'pandas.core.frame.DataFrame'>
RangeIndex: 20640 entries, 0 to 20639
Data columns (total 10 columns):
 #   Column              Non-Null Count  Dtype
---  ------              --------------  -----
 0   longitude           20640 non-null  float64
 1   latitude            20640 non-null  float64
 2   housing_median_age  20640 non-null  float64
 3   total_rooms         20640 non-null  float64
 4   total_bedrooms      20433 non-null  float64
 5   population          20640 non-null  float64
 6   households          20640 non-null  float64
 7   median_income       20640 non-null  float64
 8   median_house_value  20640 non-null  float64
 9   ocean_proximity     20640 non-null  object
dtypes: float64(9), object(1)
memory usage: 1.6+ MB
  • 数据集摘要:包含 20640 个实例,total_bedrooms 只有 20433 个非空值;ocean_proximity 是 object 类型,其他所有属性都是数值类型

查看字段分类属性

housing['ocean_proximity'].value_counts()

<1H OCEAN     9136
INLAND        6551
NEAR OCEAN    2658
NEAR BAY      2290
ISLAND           5
Name: ocean_proximity, dtype: int64

ocean_proximity 有五个类型的值,分布如上输出;

查看数值属性的摘要

housing.describe()