线性回归
线性回归是建立因变量与一个或多个自变量之间线性关系的模型。它试图通过找到一条直线(或超平面)来最小化预测值与实际值之间的误差。
应用场景
- 房价预测
- 销售趋势分析
- 气温预测
- 金融市场预测
优缺点
优点 | 缺点 |
---|---|
简单直观,易于理解和实现 | 假设变量间线性关系 |
计算效率高 | 对异常值敏感 |
不需要调整太多参数 | 无法捕捉非线性关系 |
原理
线性回归是利用连续的变量来估计实际数值(例如房价、呼叫次数和总销售额等)。线性回归算法就是找到一个自变量x与因变量y的最佳线性关系,尽可能贴近所有的点,一条最佳的直线,这条直线就是回归线。
回归关系方程为:Y = wX + b
回归损失函数:均方误差
线性回归原理代码
"""
# 公式y = wx + b
# w为权重,b为偏置值
import numpy as np
from matplotlib import pyplot as plt
class Line:
def __init__(self):
# 设置初始的w与b
self.w = 1
self.b = 0
# 设置每次移动步幅
self.learn_rate = 0.01
# 创建一个两行一列的窗口和两个画布
self.fig, (self.ax1, self.ax2) = plt.subplots(2, 1)
# 创建一个获取损失值的数组
self.loss_list = []
# 获取传入的数据,散点
def get_data(self, data):
# 获取数据的初始x与y
self.X = np.array(data)[:,0]
self.y = np.array(data)[:,1]
# 将函数组合
def predict(self, x):
return self.w * x + self.b
# 进行模型训练,提供训练次数
def train(self, epoch_times):
for epoch in range(epoch_times):
# 统计损失次数
totle_loss = 0
# 遍历数据中所有对应的x与y
for x, y in zip(self.X, self.y):
# 计算在函数上的y值
y_pred = self.predict(x)
# 自求导,求出当前w与b
# 梯度w与b就是离最佳线的距离
gradient_w = -2 * x * (y - y_pred)
gradient_b = -2 * (y - y_pred)
# 更新新的w与b,不断靠近最佳线
self.w -= self.learn_rate * gradient_w
self.b -= self.learn_rate * gradient_b
# 计算均值方差,使用原y值减去在函数上的y值,计算损失值e
loss = (y - y_pred) ** 2
totle_loss += loss
epoch_loss = totle_loss / len(self.X)
self.loss_list.append(epoch_loss)
# 训练10次后打印训练十次后的缺失值
if epoch % 10 == 0:
print(f"loss: {epoch_loss}")
self.plot()
plt.ioff()
plt.show()
def plot(self):
plt.ion()
self.ax1.clear()
self.ax2.clear()
x = np.linspace(0, 10, 100)
self.ax1.scatter(self.X, self.y, c = "g")
self.ax1.plot(x, self.predict(x), c = "b")
self.ax2.plot(list(range(len(self.loss_list))), self.loss_list)
plt.show()
plt.pause(0.1)
if __name__ == '__main__':
data = [(1, 1), (1.8, 2), (2.5, 3), (4.2, 4), (5, 5), (6, 6), (7, 7)]
s = Line()
s.get_data(data)
s.train(100)
使用sklearn模块
import numpy as np
from sklearn import datasets
from sklearn.linear_model import LinearRegression
# 加载加利福尼亚房子数据集
loaded_data = datasets.fetch_california_housing()
# 数据集特征数据
data_X = loaded_data.data
# 数据集的标签数据
data_y = loaded_data.target
# 创建线性回归模型
model = LinearRegression()
# 拟合模型,将标签和数据训练出一个线性回归公式
model.fit(data_X, data_y)
# 打印回归系数和截距
print("回归系数 (斜率):", model.coef_)
print("截距:", model.intercept_)
# 预测四所房屋价格,将对应标签的数据放入公式中
# 计算出所给的四组数据对应的价格
print(model.predict(data_X[:4, :]))
# 真实价格
print(data_y[:4])
# 获取模型参数
# 你可以传给模型构造函数的参数(也就是初始化用的参数)
print(model.get_params())
# //{'copy_X': True, 'fit_intercept': True, 'n_jobs': None, 'positive': False}
判定系数
print(model.score(data_X, data_y))
# // 0.606232685199805
# 表示这个模型可以解释60%的y的变化,可以判断该模型训练效果