《零基础学机器学习》读书笔记五之机器学习项目实战架构

机器学习项目实战架构

机器学习建模过程可以总结为,建模”三部曲“:

  • 选择函数模型,
  • 评估函数的优劣,
  • 确定最优的函数。

而机器学习项目的实际过程,可以大致分为以下5个环节:

  1. 问题定义
  2. 数据的收集和预处理
  3. 选择机器学习模型
  4. 训练机器,确定参数
  5. 超参数调试和性能优化
    每一步处理是否得当,都直接影响机器学习项目的成败。
    在这里插入图片描述

1、问题定义

第一个环节是对问题的构建和概念化。
首先构建业务问题,目前业务痛点是什么、需要解决什么问题、机器学习的目标是什么。
要想在过去的数据的基础上预测未来,其实存在一个假设,就是未来的规律与过去相同。

2、数据的收集和预处理

(1)原始数据的准备

原始数据可能从多种渠道获得,比如:

  • 自有数据
  • 网络公开数据
  • 开源数据网站下载
    数据的获取和使用,需要符合数据安全法。

(2)数据的预处理

预处理工作包括:

  • 可视化
    对数据做基本的了解,可以通过列表、直方图、散点图等来看数据,可以用Excel来看,也可以通过使用Matplotliib或Seaborn等数据分析工具来画图看。
  • 数据向量化
    把原始数据格式化,目的是让机器可以读取。
  • 处理坏数据和缺失值
    借助数据处理工具,处理冗余数据、离群数据、错误数据,以及补充缺失值。
  • 特征缩放
    • 标准化。是对数据特征分布的转换,目标是符合正态分布(均值为0,标准差为1)。如果数据特征不符合正态分布的话,会影响机器学习效率。在实战中,会去除特征的均值来转换数据,然后除以特征的标准差来进行缩放。
    • 归一化。标准化的一种变体是将特征缩放到给定的最小值和最大值之间,通常是0~1。归一化不会改变数据的分布状态。
    • 规范化。将样本缩放为具有单位范数的过程,然后放入机器学习模型,这个过程消除了数据中的离群值。
    • 在sklearn的preprocessing工具中可以找到很多特征缩放的方法。要根据数据集和项目特点选择合适的特征缩放方法。

数据预处理的原则:

  • 全部数据应转换成数字格式的数组(张量)。
  • 大范围数据值要压缩成较小值,分布不均的数据特征要进行标准化。
  • 异质数据要同质化,也就是说同一个特征的数据类型要尽量相同。

(3)特征工程

特征工程广义上也算数据预处理。
特征工程是使用数据的领域知识来创建使机器学习算法起作用的特征的过程。特征工程是机器学习的重要环节。
特征提取是特征工程的一个类型,通过子特征的选择来减少冗余特征,使初始测量数据更简洁,同时保留最有用的信息。
机器学习之所以能够学到好的算法,关键看特征的质量。
需要考虑:

  • 如何选择最有用的特征给机器进行学习?
  • 如何把现有的特征进行转换、强化、组合,创建出来新的、更好的特征?

(4)载入数据集

打开IDE,可以安装ANACONDA Navigator,安装成功后,可以有很多IDE可以选择,jupyter notebook和spyder都是可以免费使用的。jupter notebook可以一边写代码,一边做笔记,对新手非常友好,学习神器,还可以分段执行代码。不过spyder更符合本人以前编码的习惯,只需要创建一个main.py文件(文件名可以根据实际情况取),然后在文件里面写代码,直接run。大家可以根据自己的喜好来选择IDE。
下面给一下载入数据集的示例代码:

import numpy as np
import pandas as pd
# 从csv文件中读取数据,注意文件路径,本例子中test.csv文件放在main.py文件同目录下。
df_test=pd.read_csv('test.csv')
# 构建特征集,test.csv中最后一列target是标签,所以在构建特征集的时候,需要删除这一列,X包含3个特征,200个样本
X=np.array(df_test.drop("target",axis=1))
print("张量X的阶:",X.ndim)  #张量X的阶:2
print("张量X的形状:",X.shape)  #张量X的形状:(200,3)
# 构建标签集,留下target标签列,其他特征不需要。
y=np.array(df_test.target)
print("张量y的形状:",y.shape) #张量y的形状,(200,)
y=y.reshape(-1,1)  #reshape是为了后面向量点积的时候符合计算格式
print("reshape后张量y的形状:",y.shape) #reshape后张量y的形状: (200,1)
from sklearn.model_selection import train_test_split
# 拆分80%为训练集,20%为测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)

from sklearn.model_selection import train_test_split
# 拆分80%为训练集,20%为测试集
X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.2,random_state=0)

3、选择机器学习模型

先选择机器学习算法类型,然后才开始训练机器确定参数。
各种Python机器学习框架中有很多类型的算法,主要包括:

  • 线性模型(线性回归、逻辑回归);
  • 非线性模型(支持向量机、k最邻近分类);
  • 基于树和集成的模型(决策树、随机森林、梯度提升树等);
  • 神经网络(人工神经网络、卷积神经网络、长短期记忆网络等)。

用哪个机器学习算法,这个要基于业务问题有关。适合的算法就是好的算法。
随机森林也许处理回归类型问题很给力,神经网络则适合处理特征量巨大的数据。只有通过实践和经验的积累,深入地了解各个算法,才能做到一看到问题就知道大概哪种算法比较适合。

#引入sklearn线性回归模型
from sklearn.linear_model import Ridge

4、训练机器,确定参数

确定机器学习模型的算法类型之后,就可以进行机器的学习了,训练机器以确定最佳的模型内部参数,并使用模型对新数据集进行预测。

内部参数

机器学习模型的具体参数值,例如线性函数y=2x+1,其中的2和1就是模型内部参数。在机器学习里面叫做权重和偏置。
神经网络中,每一个节点都有自己的权重,网络的每一层也有偏置。
模型内部参数在机器的训练过程中被确定,机器学习的过程就是把这些参数的最佳值找出来。

超参数

位于机器学习模型的外部,属于训练和调试过程中的参数。
比如,机器学习应该迭代多少次?迭代时模型参数改变的速率(学习速率)是多大?正则化参数如何选择?
超参数是需要在反复调试的过程中被最终确定。

# alpha为学习速率,max_iter为最大迭代次数
model=Ridge(alpha=0.1,max_iter=1000)
# 开始训练
model.fit(X_train,y_train)

sklearn将模型训练的过程都封装在方法内部了,并没有显示出来。

5、超参数调试和性能优化

机器学习重在评估,只有通过评估,才能知道当前模型的效率,才能在不同模型或同一模型的不同超参数之间进行比较。

两个重要的评估点:

  • 在机器训练过程中,对于模型内部参数的评估是通过损失函数进行的。这些损失函数指出了当前模型针对训练集的预测误差。在调用model.fit方法后就已经完成了。
  • 在机器训练结束后,还要进行验证,验证过程采用的评估方式包括R2分数、均方误差函数、平均绝对误差函数、交叉熵函数等各种标准。验证过程中的评估,既评估了模型的内部参数,也评估了模型的超参数。

(1)训练集、验证集和测试集

为了进行模型的评估,一般把数据划分成3个集合:训练数据集、验证数据集和测试数据集,简称训练集、验证集和测试集。在训练集上训练模型,在验证集线上评估模型。感觉已经找到最佳的模型内部参数和超参数之后,就在测试集上进行最终测试,以确定模型。
OOT: 验时间窗的验证样本,与训练集、测试集无交集,作为上线前的验证。
机器学习模型训练时,会自动调节模型内部参数。这个过程中经常出现过拟合的现象。
过拟合: 模型对当前数据集的针对性过强了,虽然对训练集拟合效果很好,但是换一批新数据就不灵了,叫做模型的泛化能力弱
信息泄漏:在继续优化模型的过程中,还需要反复地调整模型外部的超参数,这个过程是在训练集和验证集中共同完成的。这个调试、验证过程会导致模型在验证集上也可能过拟合,因为调试超参数本身也是一种训练。
所以,即使我们选择了对验证集效果最好的超参数,这个好结果也不一定能够真的能泛化到最终的测试集。
即使得到的模型在验证集上的性能已经非常好,我们关心的还是模型在全新数据上的性能我们需要使用一个完全不同的、前所未有的数据集来对模型进行最终的评估和校正,就是
测试集
在最终验证之前,我们的模型一定不能读取任何与测试集有关的任何信息,一次也不行

print("给模型评分:",model.score(X_test,y_test))

(2)K折验证

如果有足够的数据可用的话,一般来说按照60%、20%、20%的比例来划分训练集、验证集和测试集。
调试和优化会导致最终的测试集又变成了一个新的验证集,这样子的话,数据集就会吃紧。
机器学习中有重用同一个数据集进行多次验证的方法,叫K折验证。
在这里插入图片描述K折验证的思路是将数据划分为大小相同的K个分区,对于每个分区,都在剩余的K-1个分区上训练模型,然后在留下的分区上评估模型。最终分数等于K个分数的平均值。对于数据集的规模比较小或者模型性能很不稳定的情况,这是一种很有用的方法。
K折验证仍需要预留独立的测试集再次进行模型的校正。

(3)模型的优化和泛化

优化和泛化是机器学习的两个目标,它们之间是此消彼长的状态。

  • 如何成功地拟合已有的数据,这是性能的优化
  • 但是更为重要的是如何把当前的模型泛化到其他数据集。
    模型能否泛化,也许比模型在当前数据集上的性能优化更重要。

(4)怎么看预测结果

可以通过predict方法得到模型的预测值。

y_pred=model.predict(X_test)
print('测试值-标签',y_test)
print('测试值-预测',y_pred)

总结

在机器学习实战开始之前,以及过程当中,应关注以下几个问题:

  • 要解决的问题是什么,也就是机器学习项目的最终目标是什么?
  • 我们目前拥有或者要搜集的数据集是哪种类型?数值型、类别型还是图像?
  • 有现成的数据吗?数据集搜集整理过程中可能会遇到哪些困难?
  • 以目前的知识来看,哪些算法可能是比较好的选择?
  • 如何评判算法的优劣,即如何定义和衡量机器学习的“准确率”?

如果机器学习模型的调试过程中出现了问题,可能出在任何一个环节:
在这里插入图片描述

  • 问题定义不好
  • 数据质量不好
  • 模型选的不好
  • 训练的不好
  • 评估调试的不好
    以上都有可能。
    模型训练是一个反复迭代的过程,只有不断优化,才能找到最完善的模型、达到最佳状态
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
)">
下一篇>>