深入浅出 Python 机器学习:9、线性模型的墓本概念

本贴最后更新于 1871 天前,其中的信息可能已经时移俗易

广义线性模型一-“概直”的算法模型:
别看小 C 对女朋友体贴得无微不至,但朋友们都知道他其实是一个“直男”,说话直,做事直,连最常用的算法都很“直”一一也就是我们在这一幸要介绍的线性模型。
线性模型是一类广泛应用于机器学习领域的预测模型,在过去的几十年里有众多学者都对其进行了深入的研究。线性模型是使用输入数据集的特征的线性函数进行建模,并对结果进行预测的方法。在这一章中,我们会介绍几种常见的线性模型。
本幸主要涉及的知识点有:

  • 线性模型的基本概念
  • 线性回归模型
  • 岭回归模型
  • 套索回归模型
  • 二元分类器中的逻辑回归和线性 SVC 模型

线性模型原本是一个统计学中的术语,近年来越来越多地应用在机器学习领域。实际上线性模型并不是特指某一个模型,而是一类模型。在机器学习领域,常用的线性模型包括线性回归、岭回归、套索回归、逻辑回归和线性 SVC 等。下面我们先来研究一下线性模型的公式及特点。

1、 线性模型的一般公式

在回归分析当中, 线性模型的一般预测公式如下:
\hat{y}=w[0]\cdotx[0]+w[1]\cdotx[1]+\cdots+w[p]\cdotx[p]+b

式中: x [0] , x[l1] ,…, x [p] 为数据集中特征变量的数量(这个公式表示数据集中的数据点一共有 p 个特征) ; w 和 b 为模型的参数: \hat{y}为模型对于数据结果的预测值。对于只有一个特征变量的数据集,公式可以简化为
\hat{y}=w[0]\cdotx[0]+b
是不是觉得这个公式看上去像是一条直线的方程的解析式?没错, w [0] 是直线的斜率, b 是 y 轴偏移量,也就是截距。如果数据的特征值增加的话,每个 w 值就会对应每个特征直线的斜率。如果换种方式来理解的话,那么模型给出的预测可以看作输入特征的加权和,而 w 参数就代表了每个特征的权重,当然, w 也可以是负数。

⚠️:\hat{y} 读作“ y hat ”,代表 y 的估计值。

假设我们有一条直线,其方程是 y = 0.5x+3,我们可以使用 Jupyter Notebook 将它画出来,在 Jupyter Notebook 中输入代码如下:

import numpy as np
import matplotlib.pyplot as plt

# 令x为- 5 到5 之间,元素数为100 的等差数列
x = np.linspace(- 5, 5, 100)

# 输入直线方程
y = 0.5 * x + 3
plt.plot(x, y, c='orange')

# 图题设为” Straight Line "
plt.title('Straight Line')
plt.show()

运行代码,我们可以得到如图所示:
image.png
{结果分析]图中的直线,便是直线方程 y=0.5x+3 的图像,而线性模型正是通过训练数据集确定自身的系数(斜率)和截距的。

下面我们来看一下线性模型的工作原理。

2、线性模型的图形表示

大家肯定还记得,我们在初中数学( 也可能是小学数学)中学过,两个点可以确定一条直线。假设有两个点, 它们的坐标是( 1, 3 )和( 4 , 5 ),那么我们可以画一条直线来穿过这两个点,并且计算出这条直线的方程。下面我们在 Jupyter Notebook 中输入代码如下:

# 导入线性回归模型
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pylab as plt

# 输入两个点的横坐标
X = [[1], [4]]

# 输入两个点的纵坐标
y = [3, 5]

# 用线性模型拟合这个两个点
lr = LinearRegression().fit(X, y)

# 画出两个点和直线的图形
z = np.linspace(0, 5, 20)
plt.scatter(X, y, s=80)
plt.plot(z, lr.predict(z.reshape(- 1, 1)), c='k')

# 设定图题为Straight Line
plt.title('Straight Line')

# 将图片显示出来
plt.show()

运行代码,将会得到如图所示的结果。
image.png

[结果分析] 图中表示的就是穿过上述两个数据点的直线,现在我们可以确定这条直线的方程。

在 Jupyter Notebook 中输入代码如下:

print("直线方程为:")
print('y={:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_))

运行结果:

直线方程为:
y=0.667 x +2.333

{结果分析] 通过程序的计算,我们很容易就可以得到这条直线的方程为 y = 0.667 x + 2 .333,这是数据中只有 2 个点的情况, 那如果是 3 个点会是怎样的情况呢?我们来实验一下,假设现在有第 3 个点,坐标是(3 ,3),我们把这个点添加进去,看会得到怎样的结果。

输入代码如下:

# 导入线性回归模型
from sklearn.linear_model import LinearRegression
import numpy as np
import matplotlib.pylab as plt

# 输入两个点的横坐标
X = [[1], [4],[3]]

# 输入两个点的纵坐标
y = [3, 5,3]

# 用线性模型拟合这个3个点
lr = LinearRegression().fit(X, y)

# 画出两个点和直线的图形
z = np.linspace(0, 5, 20)
plt.scatter(X, y, s=80)
plt.plot(z, lr.predict(z.reshape(- 1, 1)), c='k')

# 设定图题为Straight Line
plt.title('Straight Line')

# 将图片显示出来
plt.show()

运行结果:

image.png

[结果分析] 从图中我们可以看到,这次直线没有穿过任何一个点,而是位于一个和 3 个点的距离相加最小的位置。

下面我们可以在计算出这条直线的方程,输入代码如下:

print("直线方程为:")
print('y={:.3f}'.format(lr.coef_[0]),'x','+{:.3f}'.format(lr.intercept_))

运行结果:

直线方程为:
y=0.571 x +2.143

[结果分析] 从图中我们可以看到,新的直线方程和只有 2 个数据点的直线方程己经发生了变化。线性模型让自己距离每个数据点的加和为最小值。这也就是线性回归模型的原理。

当然,在实际应用中,数据量要远远大于 2 个或是 3 个,下面我们就用数量更多的数据来进行实验。

现在我们以 scikit-klearn 生成的 make_regr ssion 数据集为例,用 Python 语句绘制一条线性模型的预测线,更加清晰地反映出线性模型的原理。在 jupyter notebook 中输入代码如下:

# 导入线性回归模型
from sklearn.linear_model import LinearRegression
from sklearn.datasets import make_regression
import numpy as np
import matplotlib.pylab as plt

# 生成用于回归分析的数据集

X, y = make_regression(n_samples=50, n_features=1, n_informative=1, noise=50, random_state=1)

# 使用线性模型对数据进行拟合
reg = LinearRegression()
reg.fit(X, y)

# z是我们生成的等差数列,用来画出线性模型的图形

z = np.linspace(-3, 3, 200).reshape(-1, 1)

plt.scatter(X, y, c='b', s=60)
plt.plot(z, reg.predict(z), c='k')

plt.title('Linear Regression')
plt.show()

按下 shi 位 + 回车键后, 会得到结果如图所示的结果。
image.png

[结果分析] 从图中我们可以看出,黑色直线是线性回归模型在 make_regression 数据集中生成的预测线。接下来我们来看一下这条直线所对应的斜率和截距。

输入代码如下:

# 打印直线的系数和截距
print('直线的系数是:{:.2f}'.format(reg.coef_[0]))
print('直线的截距是:{:.2f}'.format(reg.intercept_))

运行结果:

直线的系数是:79.52
直线的截距是:10.92

[结果分析] 从图中我们可以看到,在我们手工生成的数据集中,线性模型的方程为 y=79.52x+10.92,而这条直线距离 50 个数据点的距离之和是最小的。这便是一般线性模型的原理。

⚠️: 细心的读者可能注意到 coef_和 intercept_这两个属性非常奇怪, 它们都是以下划线结尾。这是 sciki-learn 的一个特点,它总是用下划线作为来自训练数据集的属性的结尾,以便将它们与由用户设置的参数区分开。

3、 线性模型的特点

在上面的内容中,我们使用的都是特征数只有 l1 个的数据集。用于回归分析的线性。模型在特征数为 l1 的数据集中,是使用一条直线来进行预测分析,而当数据的特征数量达到 2 个时则是一个平面,而对于更多特征数量的数据集来说, 则是一个高维度的超平面。

如果和 K 最近邻模型生成的预测进行比较的话,你会发现线性模型的预测方法是非常有局限性的一一很多数据都没有体现在这条直线上。从某种意义上说,这是一个问题。

因为使用线性模型的前提条件,是假设目标 y 是数据特征的线性组合。但需要特别注意的是,使用一维数据集进行验证会让我们有一点偏颇,而对于特征变量较多的数据集来说,

线性模型就显得十分强大。尤其是,当训练数据集的特征变量大于数据点的数量的时候,线性模型可以对训练数据做出近乎完美的预测。

用于回归分析的线性模型也有很多种类。这些模型之间的区别在于如何从训练数据中确定模型参数 w 和 b,以及如何控制模型复杂度。下面的小节我们来看看几种回归分析中最流行的线性模型。

  • 机器学习

    机器学习(Machine Learning)是一门多领域交叉学科,涉及概率论、统计学、逼近论、凸分析、算法复杂度理论等多门学科。专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构使之不断改善自身的性能。

    83 引用 • 37 回帖 • 1 关注
  • Python

    Python 是一种面向对象、直译式电脑编程语言,具有近二十年的发展历史,成熟且稳定。它包含了一组完善而且容易理解的标准库,能够轻松完成很多常见的任务。它的语法简捷和清晰,尽量使用无异义的英语单词,与其它大多数程序设计语言使用大括号不一样,它使用缩进来定义语句块。

    541 引用 • 672 回帖 • 1 关注

相关帖子

欢迎来到这里!

我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。

注册 关于
请输入回帖内容 ...