【机器学习与实战】回归分析与预测:线性回归-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、运行后查看损失函数图,进而确定大致的迭代次数和学习速率
可以基本确定,在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_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]])) # 预测数据