监督学习算法——线性模型——《python机器学习基础教程》

本文介绍了监督学习中的线性模型,包括用于回归和分类的线性模型,如线性回归、岭回归、lasso等。线性模型在实际应用中表现出良好的预测性能,尤其是在高维数据集上。通过正则化参数如Ridge和Lasso的调整,可以控制模型复杂度以防止过拟合。此外,线性模型在分类问题中,如Logistic回归和线性SVM,也能有效地进行决策边界划分。
摘要由CSDN通过智能技术生成

监督学习算法

常用的监督机器学习算法有:
1.K近邻(kNN,k-NearestNeighbor)
2.线性模型
3.朴素贝叶斯(Naive Bayesian)
4.决策树(Decision Tree)
5.决策树集成
6.核支持向量机(SVM,Support Vector Machine)
7.神经网络


线性模型

目录

1. 用于回归的线性模型

2. 线性回归(又名普通最小二乘法)

3. 岭回归

4. lasso

5. 用于分类的线性模型

6. 用于多分类的线性模型

7. 优点、缺点和参数


线性模型是在实践中广泛使用的一类模型,几十年来被广泛研究,它可以追溯到一百多年前。线性模型利用输入特征的线性函数(linear function)进行预测,稍后会对此进行解释。

1. 用于回归的线性模型

对于回归问题,线性模型预测的一般公式如下:

ŷ=w[0]∗x[0]+w[1]∗x[1]+…+w[p]∗x[p]+b

这里 x[0]到 x[p] 表示单个数据点的特征(本例中特征个数为 p+1),w 和 b 是学习模型的参数,ŷ 是模型的预测结果。对于单一特征的数据集,公式如下:

ŷ=w[0]∗x[0]+b

你可能还记得,这就是高中数学里的直线方程。这里 w[0]是斜率,b 是 y 轴偏移。对于有更多特征的数据集,w 包含沿每个特征坐标轴的斜率。或者,你也可以将预测的响应值看作输入特征的加权求和,权重由 w 的元素给出(可以取负值)。
下列代码可以在一维 wave 数据集上学习参数 w[0] 和 b:

import mglearn
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.linear_model import Ridge
mglearn.plots.plot_linear_regression_wave()
plt.show()


#输出如下:
w[0]: 0.393906  b: -0.031804

图 2-11:线性模型对 wave 数据集的预测结果

我们在图中添加了坐标网格,便于理解直线的含义。从 w[0] 可以看出,斜率应该在 0.4 左右,在图像中也可以直观地确认这一点。截距是指预测直线与 y 轴的交点:比 0 略小,也可以在图像中确认。

用于回归的线性模型可以表示为这样的回归模型:对单一特征的预测结果是一条直线,两个特征时是一个平面,或者在更高维度(即更多特征)时是一个超平面。

如果将直线的预测结果与上一章图 2-10 中 KNeighborsRegressor 的预测结果进行比较,你会发现直线的预测能力非常受限。似乎数据的所有细节都丢失了。从某种意义上来说,这种说法是正确的。假设目标 y 是特征的线性组合,这是一个非常强的(也有点不现实的)假设。但观察一维数据得出的观点有些片面。对于有多个特征的数据集而言,线性模型可以非常强大。特别地,如果特征数量大于训练数据点的数量,任何目标 y 都可以(在训练集上)用线性函数完美拟合。

有许多不同的线性回归模型。这些模型之间的区别在于如何从训练数据中学习参数 w 和 b,以及如何控制模型复杂度。下面介绍最常见的线性回归模型。

2. 线性回归(又名普通最小二乘法)

线性回归,或者普通最小二乘法(ordinary least squares,OLS),是回归问题最简单也最经典的线性方法。线性回归寻找参数 w 和 b,使得对训练集的预测值与真实的回归目标值 y 之间的均方误差最小。均方误差(mean squared error)是预测值与真实值之差的平方和除以样本数。线性回归没有参数,这是一个优点,但也因此无法控制模型的复杂度。

  • 方差是在概率论和统计方差衡量随机变量或一组数据时离散程度的度量。概率论中方差用来度量随机变量和其数学期望(即均值)之间的偏离程度。统计中的方差(样本方差)是每个样本值与全体样本值的平均数之差的平方值的平均数。(百度百科)
  • 均方误差是反映估计量与被估计量之间差异程度的一种度量。计算方法是预测值与真实值之差的平方除以样本数。

下列代码可以生成图 2-11 中的模型:

from sklearn.linear_model import LinearRegression
X, y = mglearn.datasets.make_wave(n_samples=60)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)

lr = LinearRegression().fit(X_train, y_train)

“斜率”参数(w,也叫作权重或系数)被保存在 coef_ 属性中,而偏移或截距(b)被保存在 intercept_ 属性中:

print("lr.coef_:", lr.coef_)
print("lr.intercept_:", lr.intercept_)
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))


#输出如下:
lr.coef_: [0.39390555]
lr.intercept_: -0.031804343026759746
Training set score: 0.67
Test set score: 0.66

intercept_ 属性是一个浮点数,而 coef_ 属性是一个 NumPy 数组,每个元素对应一个输入特征。由于 wave 数据集中只有一个输入特征,所以 lr.coef_ 中只有一个元素。

R^2 约为 0.66,这个结果不是很好,但我们可以看到,训练集和测试集上的分数非常接近。这说明可能存在欠拟合,而不是过拟合。对于这个一维数据集来说,过拟合的风险很小,因为模型非常简单(或受限)。然而,对于更高维的数据集(即有大量特征的数据集),线性模型将变得更加强大,过拟合的可能性也会变大。我们来看一下 LinearRegression 在更复杂的数据集上的表现,比如波士顿房价数据集。记住,这个数据集有 506 个样本和 105个导出特征。首先,加载数据集并将其分为训练集和测试集。然后像前面一样构建线性回归模型:

X, y = mglearn.datasets.load_extended_boston()

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)

比较一下训练集和测试集的分数就可以发现,我们在训练集上的预测非常准确,但测试集上的 R^2 要低很多:

X, y = mglearn.datasets.load_extended_boston()
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
lr = LinearRegression().fit(X_train, y_train)
print("Training set score: {:.2f}".format(lr.score(X_train, y_train)))
print("Test set score: {:.2f}".format(lr.score(X_test, y_test)))

#输出如下:
Training set score: 0.95
Test set score: 0.61

训练集和测试集之间的性能差异是过拟合的明显标志,因此我们应该试图找到一个可以控制复杂度的模型。标准线性回归最常用的替代方法之一就是岭回归(ridge regression),下面来看一下。

3. 岭回归

岭回归也是一种用于回归的线性模型,因此它的预测公式与普通最小二乘法相同。但在岭回归中,对系数(w)的选择不仅要在训练数据上得到好的预测结果,而且还要拟合附加约束。我们还希望系数尽量小。换句话说,w 的所有元素都应接近于 0。直观上来看,这意味着每个特征对输出的影响应尽可能小(即斜率很小),同时仍给出很好的预测结果。这种约束是所谓正则化(regularization)的一个例子。正则化是指对模型做显式约束,以避免过拟合。岭回归用到的这种被称为 L2 正则化。

关于正则化的一点个人理解:

  • 正则化:使系数接近0,斜率更小,图像趋于水平。
  • L2正则化:使所有系数接近0
  • L1正则化:使某些系数接近0

岭回归在 linear_model.Ridge 中实现。来看一下它对扩展的波士顿房价数据集的效果如何

from sklearn.linear_model import Ridge

ridge = Ridge().fit(X_train, y_train)
print("Training set score: {:.2f}".format(ridge.score(X_train, y_train)))
print("Test set score: {:.2f}".format(ridge.score(X_test, y_test)))

#输出如下:
Training set score: 0.89
Test set score: 0.75

可以看出, Ridge 在训练集上的分数要低于 LinearRegression ,但在测试集上的分数更高。这和我们的预期一致。线性回归对数据存在过拟合。 Ridge 是一种约束更强的模型,所以更不容易过拟合。复杂度更小的模型意味着在训练集上的性能更

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值