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

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

机器学习项目实战架构

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

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

而机器学习项目的实际过程可以大致分为以下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))

2K折验证

如果有足够的数据可用的话一般来说按照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)

总结

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

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

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

  • 问题定义不好
  • 数据质量不好
  • 模型选的不好
  • 训练的不好
  • 评估调试的不好
    以上都有可能。
    模型训练是一个反复迭代的过程只有不断优化才能找到最完善的模型、达到最佳状态
阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: 机器学习