「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=1∑m(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^1−y1 = 2000);RMSE(X, h)
,使用假设 h 在一组实例中测量的成本函数;
其他函数
平均绝对误差
(Mean Absolute Error
,MAE
,平均绝对偏差
),曼哈顿范数
;
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=1∑m∣h(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()
std
,标准差(用于测量数值的离散程度);25%
/50%
/75%
,百分位数,表示在观测值组中给定百分比的观测值都低于该值以上是关于「ML 实践篇」机器学习项目落地的主要内容,如果未能解决你的问题,请参考以下文章