线性回归

2024-4-19 324 4/19

机器学习

机器学习立足于数学之上,机器学习是通过数学式子,输入数据进行计算得出结果。因此,我们需要定义一个方程来表示这一计算过程 一个简单的例子: y=w*x+b 这一公式也就是单元线性回归的式子,其中y表示结果x为输入数据 通过对式子输入数据来得出y值结果,这个y我们将他称之为预测值,这一过程我们把它叫作推理。

我们想要通过模型得出结果,就需要知道合适的w和b,那我们该如何得知合适的w和b的值是多少呢?

这时候我们就可以通过定义好的模型训练数据进行训练,梯度下降就是一种十分常见的训练方式,梯度下降法通过计算梯度的方式来找出相对最优的w和b的值,这一寻找数据x与结果y之间关系的过程我们把它叫做训练

想要获取高精准度模型,大量的正确数据是必不可少的。

模型优劣的评判标准有很多

比如r2_score决定系数,我们可以将数据的真实值预测值进行比较的方式来计算模型的精准度

常见流程

    • 数据采集
    • 数据清洗
    • 数据预处理
    • 标签编码、正则化
    • 训练集测试集划分
    • 模型训练
    • 模型评估
    • 模型保存

梯度下降(Gradient Descent)

梯度下降,是最常见的机器学习模型训练方法。 所谓梯度下降,就是通过计算寻找极值点的方法,在多维平面上不断的计算斜率来修改梯度,越接近最低点梯度会越来越小,以此来达到梯度下山找出相对最低点的效果。

计算梯度

我们需要通过损失值(真实值与预测值的差距)计算梯度来寻找相对最佳w和b的参数

w_gradient = (2 * x * (w * x + b - y)).mean()  # 计算平均
b_gradient = (2 * (w * x + b - y)).mean()

在单元线性回归中,我们要找w和b方向上的梯度最低点,其中也可能,出现局部最低点的情况 我们需要不断的更新w和b方向的梯度 斜率为负数则会往正方向移动,说明最低点在前方,若斜率为正,则说明最低点在后方

学习率(learning_rate)

w = w - w_gradient * learning_rate #梯度*学习率
b = b - b_gradient * learning_rate 

这也是关键的参数,学习率(learning_rate),在进行梯度下降中会使用到,学习率表示每一步下山的步幅。 学习率不能太小也不能太大。

学习率太大可能就会出现一下子就跨过了最低点,就会在最低点的上方前面移动的现象,这不是我们所希望的。 学习率太小可能就会出现,学习时间过长的情况,这也是不是我们所希望的。

因此,我们可以先用大学习率进行训练,接着通过观看lost曲线来判断,改用小学习率训练的方式来获取一个优秀的模型(也可能会出现效果不佳的情况,蛮玄学的) 学习率一般来说要0.001,可能更小。

cost成本函数(损失值)

cost成本函数也叫做损失值函数。 在训练过程中,我们需要在每一个周期中了解模型的训练情况,是否已经找出最低点或者是与实际值之间的差距。 因此,我们就需要对推理出来的数据与数据集中的数据进行相减,得出预测值与实际值之间的差距,以此来衡量训练的精度、准确率。

cost = (y - y_pred) ** 2  # 距离平方

cost=(实际值-预测值)**2 这里的平分就为了让数据为正数,便于在图表中观测

代码实现

需要用到的库

import pandas as pd
import matplotlib.pyplot as plt
import numpy as np

plt.rcParams['font.sans-serif'] = ['SimHei']  # 修改默认字体
plt.rcParams["axes.unicode_minus"] = False  # 修改默认字体

要plt绘制出中文,需要修改默认字体

数据集

我们来看看数据集,举例子,我们想要知道工作时间与工资之间的关系,就可以通过y=w*x+b来得出结果。 当我们输入一个工作时间,就可以得出相对应的工资水准。

data = pd.read_csv('Salary_Data.csv')  # 读取数据集
print(data)
工作经验(年) 工资
0.3 36.2
0.6 36.6
0.8 42.8
1.1 39.3
1.3 46.2
1.5 37.7
2 43.5
2.2 39.8
2.9 56.6
3 60.1
3.2 54.4
3.2 64.4
3.7 57.1
3.9 63.2
4 55.7
4 56.9
4.1 57
4.5 61.1
4.9 67.9
5.1 66
5.3 83
5.9 81.3
6 93.9
6.8 91.7
7.1 98.2
7.9 101.3
8.2 113.8
8.7 109.4
9 105.5
9.5 116.9
9.6 112.6
10.3 122.3
10.5 121.8

我们可以看到,随着工作时间的增加,工资大体上也会随着增加(实际情况相比这个更复杂,可能还有学历、城市等等,举例子不要深究。真实情况会比举例数据更加复杂)

数据集拆分

线性回归公式 y=w*x+b 我们还需要对数据集进行拆分,我们希望通过x工作时间来得到y工资

x = data['YearsExperience']  # 设工作经验为x
y = data['Salary']  # 设结果工资为y

除此之外,我们需要对数据集进行拆分,把数据集分为训练集和测试集,一般来说 训练集7:3测试集或8:2的比例拆分(数据量不多的情况除外)

我们的目的就是为了让更多的数据来作为训练数据,将小部分没有参与训练过的数据作为测试数据来评估模型准确率。

图表绘制plt绘图

y=w*x+b

w决定了线条的倾斜角度

b决定了线条的起始位置

当这个二维方程无法满足我们的需求时,我们可以进行升维,添加更多的系数来影响数据的预测。按理说。只要维度够高。我们可以计算预测任何东西

使用plt绘图需要我们给出标签和数据labels高度h


def plot_pred(w, b):  # 线性回归公式 y=w*x+b
    plt.title('工作经验与工资')  # 顶部标题
    plt.scatter(x, y, marker='x', color='red', label='真实数据')  # 根据x和y绘制点图,试用x来绘制点,红色
    plt.xlabel('工作经验')  # x轴文字
    plt.ylabel('工资')  # y轴文字

    y_pred = w * x + b  # 公式直线,预测线
    plt.plot(x, y_pred, c='blue', label='预测线')  # 绘制直线
    plt.xlim([0, 12])
    plt.ylim([-60, 140])
    plt.legend()  # 显示图例
    plt.show()  # 显示图像    
- THE END -

dajavv

4月20日14:19

最后修改:2024年4月20日
0

非特殊说明,本博所有文章均为博主原创。

共有 0 条评论