机器学习建模过程可以总结为,建模”三部曲“:
而机器学习项目的实际过程,可以大致分为以下5个环节:
第一个环节是对问题的构建和概念化。
首先构建业务问题,目前业务痛点是什么、需要解决什么问题、机器学习的目标是什么。
要想在过去的数据的基础上预测未来,其实存在一个假设,就是未来的规律与过去相同。
原始数据可能从多种渠道获得,比如:
预处理工作包括:
数据预处理的原则:
特征工程广义上也算数据预处理。
特征工程是使用数据的领域知识来创建使机器学习算法起作用的特征的过程。特征工程是机器学习的重要环节。
特征提取是特征工程的一个类型,通过子特征的选择来减少冗余特征,使初始测量数据更简洁,同时保留最有用的信息。
机器学习之所以能够学到好的算法,关键看特征的质量。
需要考虑:
打开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)
先选择机器学习算法类型,然后才开始训练机器确定参数。
各种Python机器学习框架中有很多类型的算法,主要包括:
用哪个机器学习算法,这个要基于业务问题有关。适合的算法就是好的算法。
随机森林也许处理回归类型问题很给力,神经网络则适合处理特征量巨大的数据。只有通过实践和经验的积累,深入地了解各个算法,才能做到一看到问题就知道大概哪种算法比较适合。
#引入sklearn线性回归模型
from sklearn.linear_model import Ridge
确定机器学习模型的算法类型之后,就可以进行机器的学习了,训练机器以确定最佳的模型内部参数,并使用模型对新数据集进行预测。
机器学习模型的具体参数值,例如线性函数y=2x+1,其中的2和1就是模型内部参数。在机器学习里面叫做权重和偏置。
神经网络中,每一个节点都有自己的权重,网络的每一层也有偏置。
模型内部参数在机器的训练过程中被确定,机器学习的过程就是把这些参数的最佳值找出来。
位于机器学习模型的外部,属于训练和调试过程中的参数。
比如,机器学习应该迭代多少次?迭代时模型参数改变的速率(学习速率)是多大?正则化参数如何选择?
超参数是需要在反复调试的过程中被最终确定。
# alpha为学习速率,max_iter为最大迭代次数
model=Ridge(alpha=0.1,max_iter=1000)
# 开始训练
model.fit(X_train,y_train)
sklearn将模型训练的过程都封装在方法内部了,并没有显示出来。
机器学习重在评估,只有通过评估,才能知道当前模型的效率,才能在不同模型或同一模型的不同超参数之间进行比较。
两个重要的评估点:
为了进行模型的评估,一般把数据划分成3个集合:训练数据集、验证数据集和测试数据集,简称训练集、验证集和测试集。在训练集上训练模型,在验证集线上评估模型。感觉已经找到最佳的模型内部参数和超参数之后,就在测试集上进行最终测试,以确定模型。
OOT: 验时间窗的验证样本,与训练集、测试集无交集,作为上线前的验证。
机器学习模型训练时,会自动调节模型内部参数。这个过程中经常出现过拟合的现象。
过拟合: 模型对当前数据集的针对性过强了,虽然对训练集拟合效果很好,但是换一批新数据就不灵了,叫做模型的泛化能力弱。
信息泄漏:在继续优化模型的过程中,还需要反复地调整模型外部的超参数,这个过程是在训练集和验证集中共同完成的。这个调试、验证过程会导致模型在验证集上也可能过拟合,因为调试超参数本身也是一种训练。
所以,即使我们选择了对验证集效果最好的超参数,这个好结果也不一定能够真的能泛化到最终的测试集。
即使得到的模型在验证集上的性能已经非常好,我们关心的还是模型在全新数据上的性能。我们需要使用一个完全不同的、前所未有的数据集来对模型进行最终的评估和校正,就是测试集。在最终验证之前,我们的模型一定不能读取任何与测试集有关的任何信息,一次也不行。
print("给模型评分:",model.score(X_test,y_test))
如果有足够的数据可用的话,一般来说按照60%、20%、20%的比例来划分训练集、验证集和测试集。
调试和优化会导致最终的测试集又变成了一个新的验证集,这样子的话,数据集就会吃紧。
机器学习中有重用同一个数据集进行多次验证的方法,叫K折验证。
K折验证的思路是将数据划分为大小相同的K个分区,对于每个分区,都在剩余的K-1个分区上训练模型,然后在留下的分区上评估模型。最终分数等于K个分数的平均值。对于数据集的规模比较小或者模型性能很不稳定的情况,这是一种很有用的方法。
K折验证仍需要预留独立的测试集再次进行模型的校正。
优化和泛化是机器学习的两个目标,它们之间是此消彼长的状态。
可以通过predict方法得到模型的预测值。
y_pred=model.predict(X_test)
print('测试值-标签',y_test)
print('测试值-预测',y_pred)
在机器学习实战开始之前,以及过程当中,应关注以下几个问题:
如果机器学习模型的调试过程中出现了问题,可能出在任何一个环节: