请问如何保存训练好的模型?
模型代码如下
#RM,LSTAT-->MEDV
#y=theta_0+theta_1*RM+theta_2*LSTAT+theta_3*PTRATIO+theta_4*RM^2+theta_5*RM*LSTAT+theta_6*RM*LSTAT*PTRATIO
import numpy as np
theta=np.random.rand(7,)
theta
#回归模型
def f(x):
return np.dot(theta,x.T)
#dot():返回两个数组的点积,x.T为矩阵转置
#评估函数(求均方误差)
def mse(x,y):
return np.sum((f(x)-y)**2) / len(y)
#训练模型
learning_rate = 0.00001
df['RM2'] = df['RM']**2
df['RM_LSTAT'] = df['RM']*df['LSTAT']
df['RM_LSTAT_PTRATIO'] = df['RM']*df['LSTAT']*df['PTRATIO']
train_x = df[['RM','LSTAT','PTRATIO','RM2','RM_LSTAT','RM_LSTAT_PTRATIO']]
print(train_x)
train_x = (train_x -train_x.mean()) / train_x.std()#标准化, mean()求平均值
train_x = np.insert(train_x.to_numpy(),0,1,axis=1)
train_y = df['MEDV']
for i in range(10000):
theta = theta - learning_rate * np.dot(f(train_x)-train_y,train_x)
metrics = mse(train_x,train_y)
print('第%d轮 均方误差为%.04f theta%s' % (i+1,metrics,str(theta)))
基于Monster 组和GPT的调写:
import numpy as np
import pickle
#回归模型
def f(x, theta):
return np.dot(theta, x.T)
#评估函数(求均方误差)
def mse(x, y, theta):
return np.sum((f(x, theta) - y)**2) / len(y)
#训练模型
learning_rate = 0.00001
df['RM2'] = df['RM']**2
df['RM_LSTAT'] = df['RM'] * df['LSTAT']
df['RM_LSTAT_PTRATIO'] = df['RM'] * df['LSTAT'] * df['PTRATIO']
train_x = df[['RM', 'LSTAT', 'PTRATIO', 'RM2', 'RM_LSTAT', 'RM_LSTAT_PTRATIO']]
train_x = (train_x - train_x.mean()) / train_x.std() #标准化
train_x = np.insert(train_x.to_numpy(), 0, 1, axis=1)
train_y = df['MEDV']
theta = np.random.rand(7)
for i in range(10000):
theta = theta - learning_rate * np.dot(f(train_x, theta) - train_y, train_x)
metrics = mse(train_x, train_y, theta)
print('第%d轮 均方误差为%.04f theta%s' % (i+1, metrics, str(theta)))
#保存模型
with open('model.pickle', 'wb') as f:
pickle.dump(theta, f)
#加载模型
with open('model.pickle', 'rb') as f:
theta = pickle.load(f)
训练好的模型被保存到了名为'model.pickle'的文件中,并通过pickle库进行了序列化。在加载模型时,只需调用pickle库的load()函数即可将模型反序列化为一个Numpy数组。
稍微保存训练好的模型,包括保存模型的结构、超参数和模型参数
因为模型是你自己创建和定义的,又是比较简单的模型结构,所以对于这个模型来说,其实谈不上保存训练好的模型,就是保存一下训练(回归)得到的模型参数。再次使用时,不仅需要读取这些模型参数,更重要的是你编写的模型结构的子程序,即 def f(x)
该回答引用ChatGPT
在 Python 中,可以使用 pickle 模块来保存训练好的模型。pickle 是 Python 中用于序列化和反序列化对象的标准模块,可以将 Python 对象转换为字节流,然后再将字节流保存到文件中。之后,我们可以再次从文件中加载字节流,并使用 pickle 将其反序列化为原始对象。
以下是一个示例代码,展示如何使用 pickle 模块保存和加载训练好的模型:
import pickle
# 训练模型
# ...
# 保存模型
with open('model.pkl', 'wb') as f:
pickle.dump(theta, f)
# 加载模型
with open('model.pkl', 'rb') as f:
theta = pickle.load(f)
在上面的代码中,我们首先使用训练数据训练模型,得到最终的参数 theta。接下来,我们使用 pickle 模块将参数 theta 保存到文件 model.pkl 中。保存时需要以二进制写入模式打开文件。最后,我们可以再次打开文件 model.pkl,加载保存的字节流,并使用 pickle 将其反序列化为原始对象,即训练好的模型参数 theta。