Python机器学习入门(2.1)

本章主要探讨一些监督学习的算法,因为内容较多,学一点就更新一点。本节主要是K近邻和线性模型。

首先,监督学习问题分为两种,一是分类,二是回归。如垃圾邮件的学习识别就是分类问题,而房价预测就是回归问题。在监督学习中,我们通过利用训练集使程序能够对没有见过的数据进行预测的过程就是泛化的过程。在进行训练之前,我们首先要识别数据的某些特征,将他们作为训练的内容。过于关注细节,使得模型在训练集上表现很好,但是泛化到测试集上效果很差就代表过拟合,而无法抓住数据特征,使得模型在训练集上效果就很差就表示欠拟合。模型复杂度越高,训练精度越高,但是泛化能力可能先提高后下降,这就需要我们进行取舍。有效数据集越大,我们就能构建一个更复杂的模型。

下面开始介绍几种不同的算法:

k近邻

这种算法就是第一章预测花的种类所用到的算法。首先是k近邻分类。对于设定只有一个邻居的时候,算法就将离需要预测的点最近的那个点作为结果输出。对于多个邻居的时候,算法就会进行投票(计算有多少个邻居属于类别1,多少个邻居属于类别2……),最后选出票数最多的作为结果输出。

其次就是k近邻回归,类似的,单一邻居输出最近邻的目标值,多邻居时输出这些邻居的平均值。

k近邻算法很好理解,但是如果训练集很大,速度就会很慢。这种算法不太适用于很多特征值都是0的情况。

线性回归模型

线性模型利用输入特征的线性函数进行预测。对于一般的的回归问题,线性模型预测的一般公式是:y = w[0]*x[0]+w[1]*x[1]+……+w[p]*x[p]+b。其中x[n]代表特征,w代表相应特征给定的参数,b也是需要给定的参数。如果特征只有一个的话,就是高中学的直线方程。

第一个回归方法是线性回归,又称为普通最小二乘法。就是模型寻找参数w和b,使得预测值减去实际值的平方和除以样本数最小。对于一维数据集来说,以内模型非常受限,所以很容易欠拟合。对于高维数据集,经常会发生过拟合的情况。岭回归就是常见的替代方法。

岭回归的预测公式与线性回归相同,只是对模型对于w的选择加了约束(w应该尽可能小,即w应该尽可能接近0)。直观看来,即每一个特征对结果的输出影响尽可能小。这种约束是正则化的一个例子,正则化是指对模型进行显性约束。在岭回归下,模型的训练集分数一般低于线性回归下的分数,但是测试集分数高于线性回归下的分数,即一般来说泛化性能更好。在小数据集的情况下,线性回归基本学不到什么东西,岭回归效果要好很多。随着数据量的增加,两者的差异逐渐减小。

正则化的另一个例子是Lasso,也是约束w使其靠近0,但是用到的方法不同,lasso会自动忽略一些特征值,即使一些w为0,这样使模型更为容易解释。我们可以通过调整参数alpha的值来确定忽略的强度,当alpha的值很小的时候,约束就很小了,结果与线性回归的结果类似。

线性回归模型首选岭回归,如果参数很多,而只有一些是重要的就可以选择Lasso。

用于分类的线性模型

线性模型用于分类问题主要有两类,一是二分类,二是多分类。二分类主要用这个公式来进行预测:y=w[0]*x[0]+w[1]*x[1]+……+w[p]*x[p]+b>0。这看起来和线性回归的公式类似,只是没有返回一个求和值,而是在值小于0时预测类别-1,大于0预测类别+1。二分类主要通过直线、平面或者超平面来分类两个类别。

最常见的两种分类算法是Logistic回归和线性支持向量机。两个模型都默认使用L2正则化,决定正则化强度的是参数c,c越小正则化越强,w就越趋近于0.

多分类线性模型看起来像二分类的加强版,常见方法是一对多,就是对每个类别进行一次二分类,分为此类别和其他两种情况,尽可能将此类别和其他分开。每一个类别都对应一个二类分类器,使用置信方程:w[0]*x[0]+w[1]*x[1]+……+w[p]*x[p]+b。然后在每一个测试点上运行所有的二类分类器,得到分数最高的作为结果输出。

上图中,三条线中间的部分里的点会分配到最接近的线所在的类别。

线性模型的速度非常快,适用于有大量数据的数据集,特别是对于特征数量大于样本数量的时候。但在更低维的空间中,其他模型的泛化能力可能更好。