小灰灰机器学习day2——构造线性回归器

发布时间 2023-05-27 20:54:39作者: 啥都不会的灰太狼
filename = "Ve.txt"
x = []
y = []
with open(filename, 'r') as f:
     for line in f.readlines():
         xt,yt = [float(i) for i in line.split(',')]
         x.append(xt)
         y.append(yt)
num_training = int(0.5 * len(x))
num_test = len(x) - num_training

import numpy as np

#百分之80的数据作为训练数据集,剩余百分之20用于测试数据集,创建
#x_train,y_train,x_test,y_test四个数组
#训练数据
x_train = np.array(x[:num_training]).reshape((num_training,1))
y_train = np.array(y[:num_training])

#测试数据
x_test = np.array(x[num_training:]).reshape((num_test,1))
y_test = np.array(y[num_training:])

#从sklearn库中导入linear_model方法
from sklearn import linear_model

#创建回归器对象
linear_regressor = linear_model.LinearRegression()

#使用训练集训练模型
linear_regressor.fit(x_train,y_train)

'''
首先从sklearn库中导入用于回归的方法linear_model,其中的目标值是输入变量的线性组合
;然后调用函数LinearRegression(),执行普通最小二乘法线性回归;最后,调用fit()函数
拟合线性模型,这里传入了两个参数——训练数据x_train和目标值y_train
'''
#模型在训练数据上的预测:
y_train_pred = linear_regressor.predict(x_train)

#使用库matplotlib绘制输出结果
import matplotlib.pyplot as plt
plt.figure()
plt.scatter(x_train,y_train,color='green')
plt.plot(x_train,y_train_pred,color='black',linewidth=4)
plt.title('Training data')
plt.show()

'''
前面的代码使用训练好的模型对训练数据进行了输出预测
'''
#现在在测试数据上运行模型并绘制出预测的结果图
y_test_pred = linear_regressor.predict(x_test)
plt.figure()
plt.scatter(x_test,y_test,color='green')
plt.plot(x_test,y_test_pred,color='black',linewidth=4)
plt.title('Test data')
plt.show()

#用回归准确率估计线性回归模型的性能
import sklearn.metrics as sm
#平均绝对误差:给定数据集中所有数据点的绝对误差的平均值
print("Mean absolute error =", round(sm.mean_absolute_error(y_test, y_test_pred),2))
#均方误差:给定数据集中所有数据点的误差的平方的平均值
print("Mean squared error =", round(sm.mean_squared_error(y_test, y_test_pred),2))
#中位数绝对误差:给定数据集中所有数据点的误差的中位数
print("Median absolute error =",round(sm.median_absolute_error(y_test, y_test_pred),2))
#解释方差分:用于衡量模型对于数据集中的数据变异的可解释能力
print("Explain variance score =",round(sm.explained_variance_score(y_test,y_test_pred),2))
#R方得分:确定性相关系数,用于衡量未知样本的预测效果
print("R2 score =", round(sm.r2_score(y_test,y_test_pred),2))

'''
sklearn.metrics模块包含了衡量预测误差的一系列函数:
1.以_score结尾的函数返回的是需要最大化的值,值越大表示模型的泛化能力越强
2.以_error或_loss结尾的函数返回的是需要最小化的值,值越小表示的模型的泛化能力越强
'''

#python模型持久化的方法
#将回归器对象保存在文件3_model_linear_regr.pkl中
'''
import pickle
output_model_file = "3_model_linear_regr.pkl"
with open(output_model_file, 'wb') as  f:
    pickle.dump(linear_regressor, f)
'''
#将回归器对象从文件中加载到model_linregr变量中
'''
with open(output_model_file, "rb") as f:
    model_linregr = pickle.load(f)
y_test_pred_new = model_linregr.predict(x_test)
print("New mean absolute error =",round(sm.mean_absolute_error(y_test, y_test_pred), 2))
'''
'''
pickle模块可以将任意的python对象转换成字节序列,这一过程又称为对象的序列化,
可以发送或存储表示对象的字节流,然后创建具有相同特征的新对象,这一反向操作成为解包
'''