线性回归
分类与线性回归
假设有以下两种场景:
-
场景一:假设你要开发一个垃圾邮件过滤器。通过收集大量的已标记为垃圾邮件和非垃圾邮件的电子邮件数据,利用分类算法训练模型,使其能够自动识别新收到的邮件是垃圾邮件还是正常邮件。
-
场景二:假设你想预测房屋价格。通过收集房屋的特征(如面积、卧室数量、地理位置等)和相应的实际销售价格数据,利用线性回归模型建立特征与房屋价格之间的关系,从而预测未来房屋的价格。
对比以上两个场景:
- 场景一旨在预测数据所属的类别,而场景二旨在预测连续数值输出。
- 场景一输出离散的类别标签,而场景二输出连续的数值。
在机器学习中,分类(即:场景一)和线性回归(即:场景二)是两种常见的学习任务。
什么是线性回归
人们早就知晓,相比凉爽的天气,蟋蟀在较为炎热的天气里鸣叫更为频繁。数十年来,专业和业余昆虫学者已将每分钟的鸣叫声和温度方面的数据编入目录,通过将数据绘制为图表如下:
此曲线图表明温度随着鸣叫声次数的增加而上升。我们可以绘制一条直线来近似地表示这种关系,如下所示:
事实上,虽然该直线并未精确无误地经过每个点,但针对我们拥有的数据,清楚地显示了鸣叫声与温度之间的关系(即y = mx + b)。如果我们输入一个新的每分钟的鸣叫声值 x1 推断(预测)温度 y′,只需将 x1 值代入此模型即可。
这个通过已有数据的关系(鸣叫声与温度的关系),来预测这个线性模型的过程称之为线性回归
。
线性回归的实践
下面我们将结合波士顿房价的预测示例,来实际体验在机器学习中如何应用线性回归。
第一步:下载波士顿房价数据
- 访问https://aistudio.baidu.com/datasetdetail/92436
- 将boston.csv文件下载到本地juypter notebook目录下
第二步:代码实现
import numpy as np
# 读取boston.csv文件
data = np.genfromtxt('boston.csv', delimiter=',', skip_header=1)
# 分别拆分特征和标签
X = data[:, :-1] # 特征列
y = data[:, -1] # 标签列
# 打印特征和标签的形状
print("特征的形状:", X.shape)
print("标签的形状:", y.shape)
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X,
y,
test_size=0.15,
random_state=0)
# KNN
from sklearn.neighbors import KNeighborsRegressor
# 1,构建模型
knn = KNeighborsRegressor()
# 2,训练模型
knn.fit(X=X_train, y=y_train)
# 3,预测
y_pred = knn.predict(X=X_test)
# 4,查看预测结果与真实结果的差别(偏差)
y_pred - y_test
评估指标
分类通常使用准确率、精确度等指标评估模型性能,而线性回归通常使用均绝对偏差、平均平方偏差 等指标评估模型拟合程度。
备注:平均平方偏差不如平均绝对偏差有数据解释性,但是在实际工程中仍然要使用平均平方偏差,因为该值方便求导数。
KNN线性回归过程示意
KNN在做分类任务时,是找到最近的K个邻居(例如:K=5),然后投票选出出现次数最多的类别;线性回归时与分类类似,所不同的是找到最近的K个邻居后,计算它们距离的均值。
除了上述可以使用KNN进行预测之外,也可以使用决策树来预测,代码如下:
# 决策树
from sklearn.tree import DecisionTreeRegressor
# 1,构建模型
dtr = DecisionTreeRegressor()
# 2,训练模型
dtr.fit(X=X_train, y=y_train)
# 3,预测
y_pred = dtr.predict(X=X_test)
# 4,平均绝对偏差
np.abs(y_pred - y_test).mean()
运行结果:
决策树线性回归过程示意
决策树在做分类任务时,找最佳分裂值是通过计算熵(或者gini系数)实现;线性回归与分类过程类似,所不同的是找分裂值时是通过计算方差实现。
有很多的算法都可以用来进行线性回归,在sklearn中也有LinearRegression线性回归可以进行预测,代码如下:
# 线性回归
from sklearn.linear_model import LinearRegression
# 1,构建模型
lr = LinearRegression()
# 2,训练模型
lr.fit(X=X_train, y=y_train)
# 3,预测
y_pred = lr.predict(X=X_test)
np.abs(y_pred - y_test).mean()
运行结果:
线性回归过程示意
-
输入:X(0 ~ 12)
-
输出:y
-
关系:在13维空间内的最简单的函数关系,这个关系又叫
线性关系
,也叫线性组合
或线性回归
。备注:
- 由于X与y的关系可以是无穷无尽的,所以再找这两者关系时首先使用的是线性关系,因为这是多个自变量(X)与一个因变量(y)所在空间中最简单的一种关系。
- 这个关系也叫一层神经网络(感知机层,也叫全连接层、稠密层),其本质是:参数相乘再相加。
-
训练过程:把样本数据代入,逐步把权重w(weight)和偏置b(bias)都确定下来。
-
推理过程:把样本特征X代入确定下来的方程,求解y即可。
上述w和b可以通过以下方式查看:
# 线性回归的权重
lr.coef_
# 线性回归的偏置
lr.intercept_
逻辑回归
什么是逻辑回归
逻辑回归是一种广义的线性回归分析模型,其核心在于使用Sigmoid函数将线性回归的结果映射到(0,1)的范围内,从而表示属于某一类别的概率。
y = f ( x ) = s i g m o d ( x 1 w 1 + x 2 w 2 + . . . + x 13 w 13 + b ) y=f(x)=sigmod(x_1w_1 + x_2w_2 + ... + x_{13}w_{13} +b) y=f(x)=sigmod(x1w1+x2w