【机器学习与实战】回归分析与预测:线性回归-04-模型训练和预测

105 阅读3分钟

【机器学习与实战】回归分析与预测:线性回归-04-模型训练和预测

配套视频教程:www.bilibili.com/video/BV1Rx…

六、训练和调整参数

1、梯度下降中记录每一次的参数和损失值

完整实现梯度下降的代码,并保存损失值、权重w和偏置b两个参数
def gradient_descent(x, y, w, b, lr, loop):
    # 利用np初始化三个空数组,记录每一次迭代的历史数据
    losses = np.zeros(loop)
    weights = np.zeros(loop)
    biases = np.zeros(loop)
    # 循环迭代loop次,记录每一次的数据到history数组中
    for i in range(loop):
        y_hat = w*x + b
        loss = y_hat - y
        d_w = x.dot(loss)/len(x)
        d_b = np.sum(loss)/len(x)
        w = w - lr*d_w
        b = b - lr*d_b
        losses[i] = loss_function(x, y, w, b)
        weights[i] = w
        biases[i] = b
    return losses, weights, biases

2、设置参数初始值和迭代次数,并绘制损失值的变化趋势

def train_draw(x, y):
    # 设置各个参数值(任意设定初始值即可)
    loop = 100
    lr = 1
    w = 5
    b = 3
    losses, weights, biases = gradient_descent(x, y, w, b, lr, loop)
    # 循环完成后,绘制loss_history的数据,查看变化趋势
    plt.plot(losses, 'r--')
    plt.show()

3、运行后查看损失函数图,进而确定大致的迭代次数和学习速率

1.png

1.png 可以基本确定,在40次后下降变得非常缓慢,也就是说基本可以确定100次的学习已经基本够用,而此时再打印出对应的w和b的值,便可以确定参数:

print(loss_history[-1], w_history[-1], b_history[-1])
0.009313391451157619 0.6631209265861271 0.17285782696005847

所以得到一个函数为:y=0.6631209265861271 * x + 0.17285782696005847

七、利用上述函数进行测试

利用测试集对函数:y=0.6631209265861271 * x + 0.17285782696005847 进行测试

print(loss_function(x_test, y_test, 0.6631209265861271, 0.17285782696005847))
# 损失值为:0.009030978436156854,可以接受,拟合成功,甚至好于训练集,这当然是非常理想的情况

如果对精度要求没有这么高,也可以将函数简化为:y=0.663x+0.173

八、预测销售额

假设现投入300元的微信广告费用,预测一下可以产生多少销售额,是不是觉得只需要直接将 300作为x的值,代入拟合函数:y=0.663x+0.173 就可以得到y的预测值为:199个单位的销售额?错了,此处要特别注意,由于我们在进行训练前对数据进行了归一化处理,所以这样的运算是完全错误的结果。

大家可以看看原始训练数据,300元左右的广告费用,其产生的销售额单位是不是根本不可能有199。

所以此处的预测运算,需要分两步进行,第一步是将x=300进行归一化处理,第二步是将归一化运算的预测结果再进行反向缩放,得到的才是真实的预测值。

根据公式:

可以得出,反向缩放的公式为:

x=x(maxAminA)+minA\huge x = x’ * (maxA - minA) + minA

# x_train和y_train均为原始数据,未经过归一化处理前的数据
x_train, x_plan = scaler(x_train, 300)
y_plan = 0.663*x_plan + 0.173   # 0.31323754
# 利用归一化逆向运算进行反射缩放
y_max = y_train.max(axis=0)
y_min = y_train.min(axis=0)
y_pred = y_plan * (y_max - y_min) + y_min
print(y_pred)

预测结果为:10.66,所以,当在微信平台投入300个单位的广告费后,可以产生10.66个单位的销售额。

九:使用SKLearn拟合和预测
import numpy as np
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split
import pandas as pd
import joblib
from sklearn.preprocessing import MinMaxScaler
ads = pd.read_csv('./advertising.csv')
x = np.array(ads.wechat).reshape(-1, 1)
y = np.array(ads.sales).reshape(-1, 1)
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3, random_state=0)
mm = MinMaxScaler()
x_train = mm.fit_transform(x_train)
y_train = mm.fit_transform(y_train)
x_test = mm.fit_transform(x_test)
y_test = mm.fit_transform(y_test)
model = LinearRegression()
model.fit(x_train, y_train)
print(model.coef_)                  # 权重参数
print(model.intercept_)             # 偏置
print(model.score(x_test, y_test))  # 用测试集对模型进行评分
print(model.predict([[300]]))       # 预测数据
joblib.dump(model, "./model.plk")   # 保存模型

我们也可以将训练好的模型保存下来的模型进行加载使用:

import joblib
model = joblib.load("./model.plk")
print(model.coef_)                  # 权重参数
print(model.intercept_)             # 偏置
print(model.predict([[300]]))        # 预测数据