深入浅出Python机器学习4——广义线性模型

线性模型的基本概念
  • 线性模型的一般公式
           在机器学习领域,常用的线性模型包括线性回归、岭回归、套索回归、逻辑回归和线性SVC等。
           假如我们有一条直线,其方程是 y = 0.5x+3,
    深入浅出Python机器学习4——广义线性模型_第1张图片       通过两个点((1,3)和(4,5))的直线模型:

  • 线性模型的图形表示
    深入浅出Python机器学习4——广义线性模型_第2张图片
           打印直线方程:
    深入浅出Python机器学习4——广义线性模型_第3张图片
           当数据有三个点((1,3)、(4,5)和(3,3))时:
    深入浅出Python机器学习4——广义线性模型_第4张图片
           可以看出没有穿过任何一个点,而是位于一个和3个点的距离相加最小的位置,直线方程为:
    深入浅出Python机器学习4——广义线性模型_第5张图片
           我们以scikit-learn生成的make_regression数据集为例,用Python语句绘制一条线性模型的预测线,更加清晰地反映出线性模型的原理:
    深入浅出Python机器学习4——广义线性模型_第6张图片
           打印拟合直线的系数和截距:
    深入浅出Python机器学习4——广义线性模型_第7张图片
           注意:细心的读者可能注意到coef_和intercept_这两个属性非常奇怪,它们都是一下划线_结尾。这是scikit-learn的一个特点,它总是用下划线作为来自训练数据集的属性的结尾,以便于将它们与用户设置的参数分开。

  • 线性模型的特点
           在上面内容中,我们使用的特征数只有1个的数据集。用于回归分析的线性模型在特征数为1的数据集中,是使用一条直线来进行预测分析,而当数据的特征数量达到2时则是一个平面,而对于更多特征数量的数据集来说,则是一个高维的超平面。
           如果和K最近邻模型生成的预测进行比较的话,你会发现线性模型的预测方法是非常有局限性的——很多数据都没有体现在这条直线上。从某种意义上说,这是一个问题。因为使用线性模型的前提条件,是假设目标y是数据特征的线性组合。但需要特别注意的是,使用一维数据集进行验证会让我们有一点偏颇,而对于特征变量较多的数据集来说,线性模型就显得十分强大。尤其是,当训练数据集的特征变量大于数据点的数量的时候,线性模型可以对训练数据做出近乎完美的预测。
           用于回归分析的线性模型也有很多种类。这些模型之间的区别在于如何从训练数据中确定模型参数w和b,以及如何控制模型复杂度.

线性回归

       线性回归,也称为普通最小二乘法(OLS),是在回归分析中最简单也是最经典的线性模型。

  • 线性回归的基本原理
           线性回归的原理是,找到当训练数据集中y的预测值和其真实值的平方差最小的时候,所对应的 w 和 b 的值。线性回归没有可供用户调节的参数,这是它的优势,但也代表我们无法控制模型的复杂性。
    深入浅出Python机器学习4——广义线性模型_第8张图片
           分析上述代码可知,intercept_属性是一个浮点数,而coef_属性则是一个Numpy数组,其中每个特征对应数据中的一个数值,由于我们这次用的make_regression生成的数据集中有2个特征,所以lr.coef_是一个二维数组。
  • 线性回归的性能表现
    深入浅出Python机器学习4——广义线性模型_第9张图片
           在上图中的数据集中没有加入noise,故而训练集和测试集中都取得了满分的成绩。真实的世界并非如此简单,当我们增加噪声后如下图所示:
    深入浅出Python机器学习4——广义线性模型_第10张图片
           这次模型的得分降低了很多,由于真实世界的数据复杂程度要比我们手工合成的数据高的多,使得线性回归的表现大幅度下降了。此外由于线性回归自身的特点,非常容易出现过拟合的现象。在训练集和测试集上的得分之间的差异是过拟合问题的一个明确信号。
岭回归——L2正则化项
  • 岭回归的原理
           岭回归也是回归分析中常用的线性模型,它实际上是一种改良的最小二乘法。从实际应用角度看,岭回归实际上是一种能够避免过拟合的线性模型。
           在岭回归中,模型会保留所有的特征变量,但是会减小特征变量的系数值,让特征变量对预测结果的影响变小,在岭回归中是通过改变alpha参数来控制减小特征变量系数的程度。
           通过保留全部特征变量,只是降低特征变量的系数值来避免过拟合的方法,我们称之为L2正则化
    深入浅出Python机器学习4——广义线性模型_第11张图片
           可以看到得分有所调整,训练集和测试集得分一致。由于岭回归是一个相对受限的模型,所以降低了发生过拟合的可能性。
           可以说,复杂度越低的模型在训练数据集上的表现越差,但是其泛化能力会更好。如果我们更在意模型在泛化方面的表现,那么我们就应该选择岭回归模型,而不是线性回归模型。

  • 岭回归的参数调节
           岭回归是在模型的简单性(使系数趋于零)和它在训练集上的性能之间取得平衡的一种模型。
           注意:alpha的取值并没有一定之规。alpha的最佳设置取决于我们使用的特定数据集。增加alpha值会降低特征变量的系数,使之趋于零,从而降低在训练集的性能,但更有助于泛化。
    深入浅出Python机器学习4——广义线性模型_第12张图片
           提高了alpha,模型得分大幅度降低,然而测试集上的得分超过了训练集上的得分。这说明,如果我们的模型出现过拟合现象,可以通过提高alpha值来降低过拟合的程度。
    深入浅出Python机器学习4——广义线性模型_第13张图片
           这时相比于线性回归模型略微好点,可以尝试降低alpha值来降低过拟合程度。
    深入浅出Python机器学习4——广义线性模型_第14张图片
           可以看出较高的alpha值代表模型的限制更加严格,当alpha较高时coef_属性的数值 会更小,反之coef_属性的数值更大。
           当alpha=0.1时,特征变量的系数比较大,甚至大部分于线性回归的系数重合。而线性回归模型没有经过正则化处理,从而对应的系数会特别大,甚至跑出了图外。
    深入浅出Python机器学习4——广义线性模型_第15张图片
           通过固定alpha值,改变训练数据集的数据量。可以看出不论在岭回归还是线性回归中,训练数据集的得分都比测试数据集的得分要高。而由于岭回归时正则化处理过的模型,因此它在整个图像中训练数据集的得分要比线性回归的得分低。
           相比之下,岭回归在训练测试数据集的得分于训练数据集的得分差异就要小一些,尤其是在数据子集比较小的情况下。
           从图中我们也可以看出,如果有足够多的数据,正则化就显得不是那么重要了,岭回归和线性回归的表现也就相差无几。
           注意:随着数据量的增加,线性回归在训练数据集的得分是下降的,这说明随着数据增加,线性回归模型就越不容易产生过拟合的现象,或者说越难记住这些数据。

套索(lasso)回归——L1正则化项
  • 套索(lasso)回归的原理
           与岭回归一样,lasso回归也会将系数限制在非常接近0的范围内,但它进行方式略微有点不一样,称之为L1正则化。
           L1正则化会使lasso回归的一些特征系数正好为0,也就是说,有一些特征会被忽略,这可以看作模型对特征的进行自动选择的一种方式。把一部分系数变成0有助于让模型更加容易理解,而且可以突出体现模型中最重要的那些特征。
    深入浅出Python机器学习4——广义线性模型_第16张图片
           与岭回归类似,lasso回归也有一个正则化参数alpha,用它来控制特征变量系数被约束到0的强度。

  • 套索回归的参数调节
           在上面例子中用了alpha默认值1.0,为了降低欠拟合的程度,我们可以试着降低alpha的值。与此同时,我们还需要增加最大迭代次数(max_iter)的默认设置。
    深入浅出Python机器学习4——广义线性模型_第17张图片
           可以看出降低alpha值,可以拟合出更加复杂的模型,从而在训练数据集和测试数据集都能获取良好的表现。而且相比于岭回归,lasso回归表现稍好一点,只用了10个特征中的7个特征。
           但是,如果把alpha值设置的太低,就等于把正则化效果去除了,那么模型可能会像线性回归一样,出现过拟合。例如:
    深入浅出Python机器学习4——广义线性模型_第18张图片

  • 套索回归于岭回归的对比
           针对不同的alpha值,将lasso回归和岭回归做个对比:
    深入浅出Python机器学习4——广义线性模型_第19张图片
           分析上图发现,当alpha=1时,大部分系数为0,不为零的系数非常小;当alpha=0.1时,大部分系数为0,但是系数为0的相比于alpha=1时有所减少;当alpha=0.0001时,模型几乎没有被正则化,大部分系数都是非零的,而且数值比较大;当alpha=0.1时,lasso回归和岭回归在预测能力上一致,但是,使用岭回归模型的时候几乎所有系数不为0。
           在实践当中,岭回归往往是这两个模型中的优选。但是如果你的数据特征过多,而且其中一小部分是真正重要的,那么lasso回归就是更好的选择。同样如果你需要对模型进行解释的话,那么lasso回归会让你的模型更容易被人理解,因为它只是使用了输入特征的一部分。
           注意:scikit-learn还提供了一种模型,称为弹性网模型(Elastic Net)。弹性网模型综合了lasso回归和岭回归的惩罚因子。在实践中这两个模型的组合效果最好的,然而代价是用户需要调整两个参数,一个是L1正则化参数,另一个是L2正则化参数

你可能感兴趣的:(机器学习,深入浅出python机器学习)