以下内容是在学习过程中的一些笔记,难免会有错误和纰漏的地方。如果造成任何困扰,很抱歉。
对于连续值的预测,我们常常会说到线性回归模型(当因变量和自变量为线性关系时,它是一种特殊的线性模型),线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,运用十分广泛,例如股票预测
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QuDi1HFh-1667143517281)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习-股票预测示例样图-1.png)]
天气、PM2.5、温湿度预测等
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ZLWM2ha-1667143517282)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习-天气预测示例样图-1.png)]
其表达形式为:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-izhvPBpC-1667143517282)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/机器学习入门-线性回归模型公式-2.png)]
b为误差服从均值为0的正态分布,如果只有一个自变量的情况下就叫一元回归
,如果有多个自变量的情况下就叫多元回归
;
以你的工资为例,影响你工资的可能因素有很多:老板赏识、工作努力、运气不错等,如果从一个相对简单的角度去思考,你的工资仅仅由领导的心情决定,通过回归,我们就可以确定领导的心情(自变量:这类变量不依赖于其他任何变量)
与工资(因变量:这类变量依赖于一个或多个自变量)
之间的关系。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SyN8DCSh-1667143517282)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/表情包-最大问题就是来你这里上班-1.png)]
这里我们不引用深度学习框架,通过简单的数学公式完成一元回归案例,首先导入库python
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
生成具有线性关系的随机数据 自变量:area 因变量:price
np.random.seed(0)
area = 2.5 * np.random.randn(100) + 25
price = 25 * area + 5 + np.random.randint(20, 50, size=len(area))
矩阵转换 数据处理
data = np.array([area, price])
data = pd.DataFrame(data=data.T, columns=['area', 'price'])
重点:引入计算公式,计算回归系数
# 绘图
# plt.scatter(data['area'], data['price'])
# plt.show()
W = sum(price * (area - np.mean(area))) / sum((area - np.mean(area)) ** 2)
b = np.mean(price) - W * np.mean(area)
# print("计算回归系数", W, b)
用得到的权重和偏差值来预测新价格
y_pred = W * area + b
# 绘图
plt.plot(area, y_pred, color='red', label="forecast")
plt.scatter(data['area'], data['price'], label="train")
plt.xlabel("areaX")
plt.ylabel("priceY")
plt.legend()
plt.show()
查看最终的绘图效果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iOjKSJYJ-1667143517282)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/连续值预测-一元线性简单效果图-1.png)]
梯度下降法是迭代法的一种,可以用于求解最小二乘问题,是一个致力于找到函数极值点的算法,简单来说是为了计算函数中的最小值,是一种以抛物线的形式呈现,迭代公式为
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0o9Ozm1m-1667143517283)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降法迭代公式-1.png)]
其中,-s(k)代表梯度负方向,pk代表梯度方向上的搜索步长,接下来我们将通过Tensorflow实现对于梯度下降的简单示例,首先我们准备基础数据集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2PxRPsfh-1667143517283)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/tensorflow-梯度下降示例-数据集-1.png)]
加载库与数据
import tensorflow as tf
import pandas as pd
# 加载数据 加载列
data = pd.read_csv(
'hello01.csv'
)
y = data.Education
x = data.Income
重点:导入Sequential模型 新增层,并查看我们构建的模型详情
model = tf.keras.Sequential()
model.add(
# 1:输出维度 1,:输入维度 是矩阵式
tf.keras.layers.Dense(1, input_shape=(1,))
)
# 打印模型详情
print(model.summary())
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ooQdDY6F-1667143517283)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降法基础-构建模型打印详情-1.png)]
模型优化,通过选择损失函数,将随机事件或其有关随机变量的取值映射为非负实数以表示该随机事件的“风险”或“损失”
model.compile(
optimizer='adam',
loss='mse'
)
选择完损失函数后,接下来对模型进行训练,我们将训练过程打印出日志呈现,并实时查看其损失值的大小
# 记录训练过程 epochs:训练次数
# 训练过程中 loss值会不断下降直到无限逼近
history = model.fit(x, y, epochs=10000)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XsSn2gG8-1667143517283)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/梯度下降法基础-训练数据图-1.png)]
最后使用该模型实现预测
# 进行预测 连续值x 预测y
preTemp = model.predict(pd.Series([1233]))
print("结果是 = ", preTemp)
MLP
,Multilayer Perceptron,是一种前馈人工神经网络模型,其将输入的多个数据集映射到单一的输出
的数据集上
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9cyAUs9j-1667143517284)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/tensorflow-多层感知器-图解多层感知器-外面的图-1.png)]
与前面不同,此案例是一个多元线性回归模型,通过多入参得到最终预测结果,首先我们查看一下数据集
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1RWvibbb-1667143517284)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/多层感知器基础案例-数据集-1.png)]
该数据集的前三列是我们需要输入的自变量,第四列为因变量,首先依旧是对数据集的加载,并对自变量和因变量进行划分
import tensorflow as tf
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
# 加载数据
data = pd.read_csv(
'hello02.csv'
)
x = data.iloc[:, 0:-1]
y = data.iloc[:, -1:]
查看数据之间是否呈现一种线性关系
plt.scatter(data.TV, data.sales)
plt.show()
结果很明显,他们之间的线性关系十分强烈(数据的输入是十分灵活的,但是需要使用者对数据梳理清楚)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UJFERbdv-1667143517284)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/多层感知器基础案例-是否存在线性关系-1.png)]
模型构建及损失函数的选择
model = tf.keras.Sequential(
[
# 输出维度10 输入维度3 激活函数relu
tf.keras.layers.Dense(10, input_shape=(3,), activation='relu'),
# 最终输出层
tf.keras.layers.Dense(1)
]
)
# 模型详情
# print(model.summary())
# 模型的优化方法 损失函数选择
model.compile(
optimizer='adam',
loss='mse'
)
其中,relu是一种线性函数模型,使用默认值时,它返回逐元素的 max(x, 0)
,否则,它遵循:
x >= max_value
:f(x) = max_value
,threshold <= x < max_value
:f(x) = x
,f(x) = alpha * (x - threshold)
。keras.activations.relu(x, alpha=0.0, max_value=None, threshold=0.0)
参数 | 说明 |
---|---|
x | 张量 |
alpha | 负数部分的斜率 |
max_value | 输出的最大值 |
threshold | 浮点数,阈值 |
最后我们对模型进行训练并预测
# 记录训练过程 epochs:训练次数
# 训练过程中 loss值会不断下降直到无限逼近
history = model.fit(x, y, epochs=10000)
# 预测范围 前10行前3列
prediction_data_set = data.iloc[:10, 0:-1]
# 进行预测 连续值x 预测y
preTemp = model.predict(prediction_data_set)
print("结果是 = ", preTemp)
在上述的这些案例中,通过回归模型及一定量的训练数据,输入自变量后我们就可以推算出最终的结果,在业务复杂的情况下只要将层与层之间的关系梳理清楚,数据与数据之间的强连接关系,预测的结果就会更加精确,后续的案例中会引入计算机视觉,实现对行人、车辆的预测。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Zx12PdYD-1667143517285)(https://csdn-pic-1301850093.cos.ap-guangzhou.myqcloud.com/csdn-pic/小星球-1.png)]