基本步骤
①首先准备好数据集(DataSet)
②模型的选择或者设计(Model)
③进行训练(Train)大部分模型都需要训练,有些不需要。这一步后我们会确定不同特征的权重
④推理(inferring)
1,2,3hours会有一个结果2,4,6points。这个就是训练过程,把x和y都给模型,让他自己学。5hours这个没有一个对应的y,这个就是我们的预测过程(相当于上面的题目学完了后,现在写这个题,看能不能写对)。
对应的就是下图,表格中的就是DataSet,给机器学习后,传入4hours(Input)最后得到一个预测结果Output。
数据集DataSet
当然,其实在训练表中这个4hours其实可以为testSet测试集。在训练过程中这个对应的y看不见(引用我一位师兄的话,这个其实就是小测验,最后需要我们预测的那个过程才是期末考试)。因为不能训练完就直接用,因为这个太不够准确,需要test进行测试。
所以我们通常在训练的过程中,通常不会把我们所有的DataSet全部设置为训练集,还有一部分设测试集。
接下来有一个很大的问题就是数据集,如果我们给定的数据集很片面,不够完全,我们可能在训练后出现过拟合的现象(只认识这些训练的内容),我们希望最终可以有一个比较泛化的能力,在遇到没见过的图也可以识别我们学习的内容(也就是我们学习时常说的掌握方法,举一反三)。
设计模型(Design Model)
什么是一个比较好的模型?
先用线性模型先试试,因为这个比较基本且简单。如果效果不好再换其他模型。对于我们上面表格中的几个数据,我们看出,其实比较符合线性的规则。
上面这条线是我们真实值的线。
由于我们给的数据比较简单,但是现实是很少会出现这样的情况的。所以通常来说会线随机预测一个w(权重weight),然后通过在1,2,3hours对应的points与真实值进行对比,evaluate Model Error 。我们就把这个评估模型称为损失loss。
如果我们现在假设这个w为3,按照我们loss的公式。 分别计算出loss值,最后测得平均的loss值。
当然你也可以假设不同的w,看看哪一种的loss最小。
这个是两个可能会使用的公式。
通过计算得到这样的结果,当然通常很难算出0这个值,所以在找w的时候可以使用穷举法。也就是如下图,把在0-4之间的每个值都算一下,找到最小的loss。
但是我们无法在实数域中把所有的值都找出来,所以实现上图采用的代码如下。
import numpy as np
import matplotlib.pyplot as pltx_data = [1.0,2.0,3.0]
y_data = [2.0,4.0,6.0]def forword(x):return x*wdef loss(x,y):y_pred = forword(x)return (y_pred-y)*(y_pred-y)w_list = []
mse_lis = []for w in np.arange(0.0,4.0,0.1):print('w',w)l_sum = 0for x_val,y_val in zip(x_data,y_data):y_pred_val = forword(x_val)loss_val = loss(x_val,y_val)l_sum+=loss_valprint('\t',x_val,y_val,y_pred_val,loss_val)print('MSE=',l_sum/3)w_list.append(w)mse_lis.append(l_sum/3)
运行结果为:
画图:
plt.plot(w_list,mse_lis)
plt.ylabel('Lose')
plt.xlabel('W')
plt.show
但是这里需要提一下,通常我们的横坐标不是w,我们训练通常让横坐标为epoch(训练几轮)
下面这张图是昨天刚训练完的一个结果,注意在训练过程中一定要注意存盘,因为往往训练时间很长,如果出错就要重新训练,所以我们要记住定时存盘。还有要注意可视化问题,希望在训练过程中得到的结果可视化出来,让我们更好去判断结果。