标签是我们要预测的事物,即简单线性回归中的 y
变量。标签可以是小麦未来的价格、图片中显示的动物品种、音频剪辑的含义或任何事物。
特征是输入变量,即简单线性回归中的 x
变量。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:
样本是指数据的特定实例:x。(我们采用粗体 x 表示它是一个矢量。)我们将样本分为以下两类:
模型定义了特征与标签之间的关系。例如,垃圾邮件检测模型可能会将某些特征与“垃圾邮件”紧密联系起来。我们来重点介绍一下模型生命周期的两个阶段:
训练是指创建或学习模型。也就是说,向模型展示有标签样本,让模型逐渐学习特征与标签之间的关系。
推断是指将训练后的模型应用于无标签样本。也就是说,使用经过训练的模型做出有用的预测 (y'
)。例如,在推断期间,您可以针对新的无标签样本预测 medianHouseValue
。
以鸢尾花数据集为例,一个样本是指数据表的一行记录,它记录了一朵鸢尾花的四个特征(‘SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm')。标签是指花的分类,可以用0,1,2...代替。模型就是我们执行的预测的工具,即给定四种特征,输出标签。还比如,垃圾邮箱分类。样本是邮件,包括发件人邮箱地址、发件内容、标题等特征,标签为0与1,0代表正常邮件,1代表垃圾邮件。通过建立分类模型,即可执行分类工作,给定样本一封邮件,通过模型预测,判定是否为垃圾邮件!
看一个练习题:
人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录。Ruth 阿姨将她喜爱的蟋蟀数据库作为生日礼物送给您,并邀请您自己利用该数据库训练一个模型,从而预测鸣叫声与温度的关系。
首先建议您将数据绘制成图表,了解下数据的分布情况:
图 1. 每分钟的鸣叫声与温度(摄氏度)的关系。
毫无疑问,此曲线图表明温度随着鸣叫声次数的增加而上升。鸣叫声与温度之间的关系是线性关系吗?是的,您可以绘制一条直线来近似地表示这种关系,如下所示:
图 2. 线性关系。
事实上,虽然该直线并未精确无误地经过每个点,但针对我们拥有的数据,清楚地显示了鸣叫声与温度之间的关系。只需运用一点代数知识,您就可以将这种关系写下来,如下所示:
y=mx+b
其中:
按照机器学习的惯例,您需要写一个存在细微差别的模型方程式:
y′=b+w1x1
其中:
要根据新的每分钟的鸣叫声值 x1 推断(预测)温度 y′,只需将 x1 值代入此模型即可。
下标(例如 w1 和 x1)预示着可以用多个特征来表示更复杂的模型。例如,具有三个特征的模型可以采用以下方程式:
y′=b+w1x1+w2x2+w3x3
简单来说,训练模型表示通过有标签样本来学习(确定)所有权重和偏差的理想值。在监督式学习中,机器学习算法通过以下方式构建模型:检查多个样本并尝试找出可最大限度地减少损失的模型;这一过程称为经验风险最小化。
损失是对糟糕预测的惩罚。也就是说,损失是一个数值,表示对于单个样本而言模型预测的准确程度。如果模型的预测完全准确,则损失为零,否则损失会较大。训练模型的目标是从所有样本中找到一组平均损失“较小”的权重和偏差。例如,图 3 左侧显示的是损失较大的模型,右侧显示的是损失较小的模型。关于此图,请注意以下几点:
图 3. 左侧模型的损失较大;右侧模型的损失较小。
请注意,左侧曲线图中的红色箭头比右侧曲线图中的对应红色箭头长得多。显然,相较于左侧曲线图中的蓝线,右侧曲线图中的蓝线代表的是预测效果更好的模型。
您可能想知道自己能否创建一个数学函数(损失函数),以有意义的方式汇总各个损失。
接下来我们要看的线性回归模型使用的是一种称为平方损失(又称为 L2 损失)的损失函数。单个样本的平方损失如下:
= the square of the difference between the label and the prediction
= (observation - prediction(x))2
= (y - y')2
均方误差 (MSE) 指的是每个样本的平均平方损失。要计算 MSE,请求出各个样本的所有平方损失之和,然后除以样本数量:
其中:
虽然 MSE 常用于机器学习,但它既不是唯一实用的损失函数,也不是适用于所有情形的最佳损失函数。
有梯度下降方法,牛顿法,拟牛顿法等等优化方法。下面介绍两种方法:
梯度下降法博客链接:https://www.jianshu.com/p/c7e642877b0e
拟牛顿法博客链接:https://www.jianshu.com/p/0f864a4c3b38
只介绍(多元线性)梯度下降:
只分为三步:
第一:求各个变量的偏导即梯度,梯度代表的是延当前点上坡最快的方向,梯度是一个向量;
第二:设置步长,过大可能得不到收敛,但是下降速度快;过小速度极慢,可以收敛;
第三:更新变量值;
例如:
/**
给定y=a*x+b与一组x,y的值,求参数 a,b
*/
#include
int main()
{
int x[10];
int y[10];
int i,j;
for(int i=0;i<10;i++)
{
x[i]=i;
y[i]=2*i+3;
}
double k=0.01; //设置步长系数;
double a,b;
a=10,b=20; //随便取两个值;其实 a=2,b=3;
for(j=0;j<200;j++)
{
for(i=0;i<10;i++)
{
double error=(a*x[i]+b-y[i]);
a=a-k*error*x[i];
b=b-k*error*1;
}
}
printf("a=%f,b=%f",a,b);
return 0;
}
如求y=x1^2+x2^2函数的最小值,用C语言求得为( 0,0);
#include
/**
求图像y=x1^2+x2^2的最小值
*/
int main()
{
double x1,x2;
double k;
x1=120;x2=80; //假设初始值为(120,80)
k=0.1; //k为步长系数
int i;
for(i=0;i<100;i++)
{
x1=x1-k*(x1*2);//更新x1,括号中的是梯度(求偏导)
x2=x2-k*(x2*2);
}
printf("x1=%f,x2=%f",x1,x2);
return 0;
}