算法简介
线性回归模型(Linear Regression),因为结构简单,可解释性好,实现简单,在工程领域得到广泛应用
线性回归模型是机器学习世界的"Hello World!"。完整、全面地掌握线性回归模型,有助于打通机器学习的任督二脉
线性回归基础
什么是线性?
- 例:汽车每小时,小时可以形式多长距离?
- 已知骑车的速度,则骑车行驶的距离只与时间唯一相关
- 特点:世界是普遍联系的,但又特例”一个事务唯一由另一个事务觉定“
- 线性:如上例,在二元的直角坐标系中,描出这个关系的图是一条直线,所以称为线性关系
什么是回归?
- 起源:19世纪80年代,英国统计学家弗朗西斯.高尔顿(Francis Galton)提出
- 研究:父代身高与子代身高之间的关系
- 结论:子代的身高又向族群平均身高”回归的趋势“
什么是回归分析?
- 回归分析
- 数理统计学中,回归分析着重在寻求变量之间近似的函数关系
- 线性回归分析
- 是在寻求变量之间近似的线性函数关系
线性函数
- 一元线性函数
- 一元线性方程
- 多元线性函数
- 写成向量的形式
- 写成向量的形式
线性回归原理
线性回归
- 什么是线性回归?
- 现设在一个问题中因变量及自变量,可以设想的值由两部分构成:一部分,由的影响所致,这一部分表为的函数形式。另一部分,则由其他众多未加考虑的因素,包括随机因素的影响,它可视为一种随机误差,记为。于是得到模型:
- 函数称为对的”回归函数“
- 回归函数为线性函数的情形——称为线性回归
- 函数称为对的”回归函数“
- 现设在一个问题中因变量及自变量,可以设想的值由两部分构成:一部分,由的影响所致,这一部分表为的函数形式。另一部分,则由其他众多未加考虑的因素,包括随机因素的影响,它可视为一种随机误差,记为。于是得到模型:
线性回归理论基础
- 一元线性回归理论基础
- 其中为回归函数,为随机误差
- 现在对理论模型中的变量进行次独立观察,得到样本
- 这组样本的构造可由方程来描述,这里是第次观察时随机误差所取得的值
- 多元线性回归理论基础
-
- 现在对和进行观察,第次观察时它们的取值分别记为和,随机误差,得到方程
- 统一规范:表示特征的第次观察
- 现在对和进行观察,第次观察时它们的取值分别记为和,随机误差,得到方程
-
线性回归模型
- 线性回归模型公式
- 在机器学习领域,线性回归模型记为:
-
- 则可以统一形式为:
-
- 是预测函数
- 是模型参数
- 是特征输入
- 是偏置量
-
- 则可以统一形式为:
- 线性回归模型假设
- 假设一:变量是相互无关的
- 各变量的作用与其他变量取值无关
- 假设二:变量的作用是可以叠加的
- 公式中个变量是相加的
- 假设一:变量是相互无关的
线性回归模型损失函数
- 损失函数的定义
- 损失函数(Loss Function)是度量模型一次预测的好坏,即真实值()与预测值()的误差
- 线性回归损失函数:
- 平方损失函数衡量模型的整体准确性
- 平方损失函数的集合意义:欧式距离
- 损失函数的公式
- 假设数据集有个训练样本,个特征工程,则平方损失函数:
线性回归模型训练
- 怎样对线性回归模型的参数进行训练?
- 训练目的:求模型参数
- 即求
- 训练原理:损失函数最小
- 即所有真实值与预测值的误差综合最小
- 训练方法:梯度下降
- 梯度下降公式:,顺着损失函数当前点梯度下降反方向,按规定步长进行迭代搜索
- 训练目的:求模型参数
- 线性回归模型的梯度下降训练
- 采样梯度下降法进行学习
- 由于
- 则:
-
迭代训练,计算每个参数,直至收敛预定的值为止
-
线性回归应用
线性回归的Python实现
import numpy as np
import matplotlib.pyplot as plt
x = np.array([[1, 5.56], [2, 5.70], [3, 5.91], [4, 6.40],[5, 6.80],
[6, 7.05], [7, 8.90], [8, 8.70],[9, 9.00], [10, 9.05]])
m, n = np.shape(x)
x_data = np.ones((m, n))
x_data[:, :-1] = x[:, :-1]
y_data = x[:, -1]
m, n = np.shape(x_data)
theta = np.ones(n)
def gradientDescent(iter, x, y, w, alpha):
x_train = x.transpose()
for i in range(0, iter):
pre = np.dot(x, w)
loss = (pre - y)
gradient = np.dot(x_train, loss) / m
w = w - alpha * gradient
cost = 1.0 / 2 * m * np.sum(np.square(np.dot(x, np.transpose(w)) - y))
print("第{}次梯度下降损失为: {}".format(i,round(cost,2)))
return w
result = gradientDescent(1000, x_data, y_data, theta, 0.01)
y_pre = np.dot(x_data, result)
print("线性回归模型 w: ", result)
plt.rc('font', family='Arial Unicode MS', size=14)
plt.scatter(x[:, 0], x[:, 1], color='b', label='训练数据')
plt.plot(x[:, 0], y_pre, color='r', label='预测数据')
plt.xlabel('x')
plt.ylabel('y')
plt.title('线性回归预测(梯度下降)')
plt.legend()
plt.show()
线性回归的Sklearn实现
# 数据集:Advertising
# 模型:Linear Regression Model
import matplotlib.pyplot as plt
%matplotlib inline
plt.rc('font', family='Arial Unicode MS', size=14)
import numpy as np
import pandas as pd
from sklearn import datasets, linear_model
# 数据处理
data = pd.read_csv('./data/Advertising.csv')
X = data[['TV', 'Radio', 'Newspaper']]
y = data[['Sales']]
# 划分训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=1)
# 求解线性模型参数
from sklearn.linear_model import LinearRegression
linreg = LinearRegression()
linreg.fit(X_train, y_train)
print(linreg.intercept_) # 常数项 [2.87696662]
print(linreg.coef_) # 变量系数 [[0.04656457 0.17915812 0.00345046]]
# 交叉验证
from sklearn.model_selection import cross_val_predict
from sklearn import metrics
predicted = cross_val_predict(linreg, X, y, cv=10)
print("MSE:",metrics.mean_squared_error(y, predicted))
print("RMSE:",np.sqrt(metrics.mean_squared_error(y, predicted)))
# 画图描述真实值和预测值的变化关系
fig, ax = plt.subplots()
ax.scatter(y, predicted)
ax.plot([y.min(), y.max()], [y.min(), y.max()], 'r--', lw=5)
ax.set_xlabel('真实值')
ax.set_ylabel('预测值')
plt.title('Advertising的真实值和预测值的变化关系')
plt.show()
线性回归的Sklearn实现
# TensorFlow 2.0 + Linear Regression
import tensorflow as tf
import numpy as np
x = np.float32(np.random.rand(100,1))
# y=a*x+b
y = np.dot(x,0.8) + 0.2
a = tf.Variable(np.float32())
b = tf.Variable(np.float32())
def model(x):
return a*x+b
def loss(predicted_y, desired_y):
return tf.reduce_sum(tf.square(predicted_y - desired_y))
optimizer = tf.optimizers.Adam(0.1)
for step in range(0, 100):
with tf.GradientTape() as t:
outputs = model(x)
current_loss = loss(outputs, y)
grads = t.gradient(current_loss, [a, b])
optimizer.apply_gradients(zip(grads,[a, b]))
if step % 10 == 0:
print("Step:%d, loss:%2.5f, weight:%2.5f, bias:%2.5f "
%(step, current_loss.numpy(), a.numpy(), b.numpy()))
线性回归总结
线性回归价值
- 概括了一大类实际问题
- 现实世界中,有许多问题可以用线性回归进行抽象
- 复杂问题近似转换(机器学习基本思想之一)
- 因为结构简单,处理比较方便,可以近似地处理其他问题
线性回归优缺点
- 优点
- 简单
- 解释性好
- 缺
- 无法反应变量之间的相关性
- 无法体现变量之间是相乘的