申明:文章内容是作者自己的学习笔记,教学来源是开课吧讲师梁勇老师。
不要杠,开心学习!
1 线性回归
背景主题
讲述线性回归模型,用来实现连续类型变量的预测。
目标
- 掌握线性回归模型的原理
- 能够使用线性回归进行预测
- 能够对线性回归模型进行评估
2 线性回归知识要点
2.1 数据建模
2.1.1 模型概念
模型我们可以理解为一个函数(一种映射规则)。
通俗的讲:
从外层角度想——模型就是个黑盒子:输入一个值输出一个预测值。
从内层想——模型就类似一个函数(一种映射规则,例如:y= f (x) )。
由训练数据来确定函数的参数,当参数确定好后,我们就可以利用该模型(函数)对未知的数据(非训练时使用的数据)进行求值,也就是进行预测。
输入模型的数据,我们称之为训练数据。
通过不断的进行训练,最终得到一个合适的模型,从而可以对未知的数据进行预测。而这个过程,是与我们人类学习的过程是相似的。只不过人们的认知和判断是通过经验得到的,而机器的认知与判断是通过数据得到的。
我们使用样本数据训练模型,数据中的每个属性,我们称为特征。
每条数据的目标输出值,我们称为标签(监督学习)。
特征:x
标签:y
这与函数y = f (x) 相符
例如:
我们不难找出x与y之间的关系是:y=x+1
这样,当产生新的未知数据时(没有标签的数据),我们就可以使用该模型进行预测了。例如,当新数据x=7时,我们就可以轻松预测y=8。
然而,现实中的数据不可能像上例中那么简单,模型也不可能总是通过肉眼就能观察出来的。
例如:在鸢尾花数据集中,花瓣长度与花瓣宽度的部分数据如下:
对于这样的数据,我们是不容易发现二者之间的关系的。因此,这就需要我们通过机器学习算法来进行建模了。
2.1.2 回归分析
回归分析:
用来评估变量之间关系的统计过程。
用来解释变量X与变量Y的关系。
当自变量X发生改变时,因变量Y会如何发生改变。
2.1.2.1 线性回归
线性回归:
是回归分析的一种,评估的自变量X与因变量Y之间是一种线性关系。
当只有一个自变量X发生时,因变量Y会如何发生改变。
线性关系的理解:
- 画出来的图像是直的。
- 每个自变量的最高次项为1。
2.1.2.2 拟合
拟合:
是指构建一种算法(数学函数),使得该算法能够符合真实的数据。
从机器学习角度讲,线性回归就是要构建一个线性函数
,使得该函数与目标值之间的相符性最好。
从空间的角度看,就是要让函数的直线(面),尽可能靠近空间中所有的数据点(点到直线的平行与y轴的距离之和最短)。
线性回归会输出一个连续值。
y^
——预测值
y
——真实值
误差值越小越好,越小说明建立得到模型越准确
。
对于线性回归来说,他的本质就是要拟合出一条最佳的直线
,y^ = f (x) ,使得这个点到直线的距离最短
,使得真实值和预测值误差最小
,最短考量的是所有的情况。
2.2 线性回归模型
2.2.1 简单线性回归
我们以房屋面积(x)与房屋价格(y)为例,显而易见,这两者是一种线性关系,房屋价格正比于房屋面积,我们假设比例为w:
y^ = w * x
然而,这种线性方程一定是过原点的,即当x=0时,y也一定为0。这可能并不符合现实中的某些场景。为了能够让方程具有更广泛的适应性,我们这里再增加一个截距,设为b,即:
y^ = w * x + b
这个方程就是我们数据建模的模型。方程中的w和b就是模型的参数。
假定数据集数据如下:
线性回归是用来解释自变量和因变量之间的关系,但是,这种关系并非严格的函数映射关系。从数据集中,我们也看到了这一点。相同面积的房屋,价格并不完全相同,但是,也不会相差太大。
什么是严格的函数映射关系?
指的是x 相同,y一定是相同的。
2.2.2 多元线性回归
现实生活中数据可能是比较复杂的,自变量也很可能不是一个。
例如:影响房屋价格可能不止房屋面积一个因素,可能还有楼层,距地铁站的距离,距市中心的距离,房间数量等等。不过,这些因素对房屋价格影响的力度(权重)是不同的,例如:房屋所在楼层对房屋价格的影响就远不及房屋的面积,因此,我们可以使用多个权重来表示多个因素与房屋的关系:
我们可以进一步简化,为向量w和b 各加入一个分量w0和x0,并且令:
我们现在的目的就是,从现有的数据(经验)中,去学习(确定)w 与 b 的值,我们能够确定拟合数据的线性方程,这样就可以对未知得到数据 x (房屋面积)进行预测 y (房屋价格)。
平方和最小指的是:y^ - y (预测值-真实值)或 y - y^ (真实值-预测值)可能会出现负数,所以要用平方和去衡量。
正确的是:AD
A选型,对于w与b确定的方程,应该使得所有数据(点)到直线的距离(凭平行于y轴的距离)平方和最小。
正确
B选项,线性回归拟合的方程不可能穿过所有的点(每条数据)。
C选项,对于相同的输入数据,方程预测的结果肯定是相同的,y^ = f (x)。
D选项,线性回归模型输出的是连续值
,正确。
2.3 损失函数与参数求解
2.3.1 损失函数
损失函数,也称为目标函数和代价函数,简单的说,就是关于误差的一个函数
。
损失函数用来衡量模型预测值和真实值之间的差异。
机器学习的目标,就是建立一个损失函数,使得该函数的值最小。
损失函数我们通常用 J
来表示,例如, J(w) 则表示以 w 为自变量的函数。
在线性回归中,我们使用平方损失函数(最小二乘法)(最小平方法
),定义如下:
2.3.2 参数求解
2.4 简单线性回归程序
我们以鸢尾花数据集中,花瓣长度与花瓣宽度为例,通过程序来实现简单线性回归。
import numpy as np
# 用于线性回归的类。
from sklearn.linear_model import LinearRegression
# 用来切分训练集与测试集。
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_iris
# 设置输出的精度。默认为8。
np.set_printoptions(precision=2)
iris = load_iris()
# 获取花瓣长度作为X,花瓣宽度作为y。
X, y = iris.data[:, 2].reshape(-1, 1), iris.data[:, 3]
#定义线性回归LinearRegression
lr = LinearRegression()
# 将数据集划分为训练集与测试集。
# test_size:测试集大小。
# random_state:随机种子,可用来产生相同的随机数序列。
# X_train x的训练集,X_test x的测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
# 使用训练集数据,训练模型。
lr.fit(X_train, y_train)
print("权重:", lr.coef_) # 返回的就是 w 的值
print("截距:", lr.intercept_) #返回的就是 b 的值
# y^ = w * x + b
# 从训练集学习到了模型的参数(w与b),确定方程,就可以进行预测。
# 进行预测 predict
y_hat = lr.predict(X_test)
print("实际值:", y_test[:5])
print("预测值:", y_hat[:5])
补充笔记(fit、predict、score):
sklearn对Data Mining的各类算法已经有了较好的封装,基本可以使用fit、predict、score来训练、评价模型,并使用模型进行预测。
回归计算:
学习链接!!!
结果:
我们可以通过可视化将其呈现出来:
import matplotlib.pyplot as plt
plt.rcParams["font.family"] = "SimHei"
plt.rcParams["axes.unicode_minus"] = False
plt.rcParams["font.size"] = 15
plt.figure(figsize=(10, 6))
plt.scatter(X_train, y_train, c="orange", label="训练集")
plt.scatter(X_test, y_test, c="g", marker="D", label="测试集")
plt.plot(X, lr.predict(X), "r-")
plt.legend()
plt.xlabel("花瓣长度")
plt.ylabel("花瓣宽度")
接下来我们可以看下预测值和真实值之间有着怎样的差异呢?
plt.figure(figsize=(15, 6))
plt.plot(y_test, label="真实值", color="r", marker="o")
plt.plot(y_hat, label="预测值", ls="--", color="g", marker="o")
plt.xlabel("测试集数据序号")
plt.ylabel("数据值")
plt.legend()
从图中可以看到,预测值和真实值之间从总体上看效果不错,有的点(数据)甚至有重合的情况出现。
这就是在我们已知的数据上建立模型并且针对未知的数据实现了一种预测的效果。
2.5 回归模型评估
当我们建立好模型后,模型的效果如何呢?对于回归模型,我们可以采用如下的指标来进行衡量。
2.5.1 MSE (平均平方误差)
2.5.2 RMSE (平均平方误差的平方根)
2.5.3 MAE (平均绝对值误差)
数据集的不同导致无法判断MSE。
2.5.4 R²(决定系数)
在训练集中,R²的取值范围为 [0,1]
在测试集中,R²的取值范围为 [-∞,0]
也就是说,R² 越趋近于1效果越好,越趋近于0或者越趋近于负无穷效果越差。
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
print("均方误差(MSE):", mean_squared_error(y_test, y_hat))
print("根均方误差(RMSE):", np.sqrt(mean_squared_error(y_test, y_hat)))
print("平均绝对值误差(MAE):", mean_absolute_error(y_test, y_hat))
print("训练集R^2:", r2_score(y_train, lr.predict(X_train)))
print("测试集R^2:", r2_score(y_test, y_hat))
# socre其实求解的就是r^2的值。但是注意,r2_score方法与score方法传递参数的内容是不同的。
print("训练集R^2:", lr.score(X_train, y_train))
print("测试集R^2:", lr.score(X_test, y_test))
结果:
从结果看,R² 测试集等于 0.8931453922584154,接近1,效果不错。
R²
在评估的时候是经常使用的一个指标,好处在于不受数量集的影响
,它是一个有界的取值范围。
2.5.5 多元线性回归程序
类似的,我们可以实现多元线性回归。
我们以波士顿房价为例来进行演示。
波士顿房价的数据说明如下:
通过这些因素预测房屋的价格。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_boston
import pandas as pd
boston = load_boston()
X, y = boston.data, boston.target
df = pd.DataFrame(np.concatenate([X, y.reshape(-1, 1)], axis=1),
columns=boston.feature_names.tolist() + ["MEDV"])
df.head()
结果:
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25, random_state=0)
lr = LinearRegression()
lr.fit(X_train, y_train)
print("模型权重:", lr.coef_)
print("截距:", lr.intercept_)
y_hat = lr.predict(X_test)
print("训练集R^2:", lr.score(X_train, y_train))
print("测试集R^2:", lr.score(X_test, y_test))
结果:
3 总结
- 模型的概念及应用
- 线性回归模型的建立与预测
- 回归模型的评估方式