目录
实验目的和要求
目的:
1. 根据数据创建单变量线性回归模型
2. 使用线性回归模型进行预测
3. 对预测结果进行评价
要求:
1、提交代码
2、提交执行结果截图
3、提交电子版实验报告
实验环境
OS:Win11,
Python:3.10
Pycharm:2021
实验内容与过程
1、实验内容
调查分析结果表明:足长、步幅和身高之间存在一定的关系,身高预测数据.xlsx文件中保存了2700条样本数据,部分数据如下表所示:
足长(cm)步幅(cm)身高(cm)
21 60 157.2662841
21 61 157.8731029
21 62 158.389684
21 63 157.9809049
21 64 159.7698927
根据上面的训练足长和身高、步幅和身高的线性回归模型,评价两个模型的预测结果,并对预测结果进行分析。
1. 自变量分别为足长和步幅,因变量身高,画出两组数据的散点图,并给出结论。
2. 根据身高预测数据.xlsx文件中的数据,求足长和身高的线性回归模型,画出拟合直线,并输出拟合直线方程。
3. 根据身高预测数据.xlsx文件中的数据,求步幅和身高的线性回归模型,画出拟合直线,并输出拟合直线方程。
步骤:准备模型训练数据
创建模型对象
训练模型
求线性方程的截距和斜率
画拟合直线
输出拟合直线方程
提示:可以使用sklearn库中的sklearn.linear_model.LinearRegression对象求线性回归模型
4. 计算两个线性回归模型的准确率
5. 比较两个模型的效果,对两个模型的准确率进行分析
模型评价方法
A. 手动计算
假设hpyTrain代表训练数据的预测值,yTrain代表训练数据的真实值
ü 残差平方和:ssResTrain = sum((hpyTrain -yTrain) ** 2)
ü 偏差平方和:ssTotTrain = sum((yTrain - np.mean(yTrain))** 2)
ü R方:Rsquare = 1 -ssResTrain / ssTotTrain
B. Python的LinearRegression对象提供的方法
ü 残差平方和:model._residues
ü R方:model.score(xTrain,yTrain)
2、关键代码
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from pylab import mpl
from sklearn.metrics import mean_squared_error
import numpy as np
# 消除中文乱码现象
plt.rcParams['font.sans-serif']=['SimHei'] # 用来正常显示中文
plt.rcParams['axes.unicode_minus']=False # 用来正常显示负号
# 题目1
# 读取数据
data = pd.read_excel('第1次课试验数据.xlsx')
foot_length = data['足长']
height = data['身高']
stride = data['步幅']
# 绘制散点图
# 绘制足长与身高的散点图
plt.scatter(foot_length, height, label='Foot Length')
plt.xlabel('Foot Length')
plt.ylabel('Height')
plt.legend()
plt.title('足长与身高关系散点图')
plt.show()
# 绘制步幅与身高的散点图
plt.scatter(stride, height, label='Stride')
plt.xlabel('Stride')
plt.ylabel('Height')
plt.legend()
plt.title('步幅与身高关系散点图')
plt.show()
# 题目2
''' 足长与身高 '''
# 读取数据
data = pd.read_excel('第1次课试验数据.xlsx')
# 提取足长和身高数据
foot_length = data['足长']
height = data['身高']
# 创建线性回归模型对象
fool_model = LinearRegression()
# 训练模型
fool_model.fit(foot_length.values.reshape(-1, 1), height)
# 提取模型参数
fool_slope = fool_model.coef_[0]
fool_intercept = fool_model.intercept_
# 生成拟合直线的x和y值
x_values = foot_length
y_values = fool_model.predict(foot_length.values.reshape(-1, 1))
# 绘制散点图和拟合直线
plt.scatter(foot_length, height, label='Data Points')
plt.plot(x_values, y_values, color='red', label='Linear Regression')
plt.xlabel('Foot Length')
plt.ylabel('Height')
plt.legend()
plt.title('足长与身高线性回归')
plt.show()
# 输出拟合直线方程
print('拟合直线方程:Height = {:.4f} * Foot Length + {:.4f}'.format(fool_slope, fool_intercept))
''' 步幅与身高 '''
stride = data['步幅']
height = data['身高']
# 创建线性回归模型对象
stride_model = LinearRegression()
# 训练模型
stride_model.fit(stride.values.reshape(-1, 1), height)
# 提取模型参数
stride_slope = stride_model.coef_[0]
stride_intercept = stride_model.intercept_
# 生成拟合直线的x和y值
x_values = stride
y_values = stride_model.predict(stride.values.reshape(-1, 1))
# 绘制散点图和拟合直线
plt.scatter(stride, height, label='Data Points')
plt.plot(x_values, y_values, color='red', label='Linear Regression')
plt.xlabel('Stride')
plt.ylabel('Height')
plt.legend()
plt.title('步幅与身高线性回归')
plt.show()
# 输出拟合直线方程
print('拟合直线方程:Height = {:.4f} * Stride + {:.4f}'.format(stride_slope, stride_intercept))
# 题目4
''' R² '''
print('现在以R²为准确率计算')
# 计算足长与身高的模型的 R² 值
fool_r2 = fool_model.score(foot_length.values.reshape(-1, 1), height)
print('足长与身高模型的 R² 值:{:.4f}'.format(fool_r2))
# 计算步幅与身高的模型的 R² 值
stride_r2 = stride_model.score(stride.values.reshape(-1, 1), height)
print('步幅与身高模型的 R² 值:{:.4f}'.format(stride_r2))
''' 残差平方和 '''
print('现在以残差平方和为准确率计算')
# 计算足长与身高模型的残差平方和
fool_predictions = fool_model.predict(foot_length.values.reshape(-1, 1))
fool_residuals = height - fool_predictions
fool_rss = np.sum(fool_residuals**2)
print('足长与身高模型的残差平方和:{:.4f}'.format(fool_rss))
# 计算步幅与身高模型的残差平方和
stride_predictions = stride_model.predict(stride.values.reshape(-1, 1))
stride_residuals = height - stride_predictions
stride_rss = np.sum(stride_residuals**2)
print('步幅与身高模型的残差平方和:{:.4f}'.format(stride_rss))
# 题目5
if fool_r2 > stride_r2:
print("足长与身高模型的准确率较高")
elif stride_r2 > fool_r2:
print("步幅与身高模型的准确率较高")
else:
print("足长与身高模型和步幅与身高模型的准确率相同")
if fool_rss > stride_rss:
print("足长与身高模型的准确率较高")
elif stride_rss > fool_rss:
print("步幅与身高模型的准确率较高")
else:
print("足长与身高模型和步幅与身高模型的准确率相同")
3、流程图
实验结果与分析
结果分析
足长与身高模型的 R² 值为0.7638,步幅与身高模型的 R² 值为0.5711。因此,足长与身高模型的拟合效果更好。足长与身高模型的残差平方和为182.5482,步幅与身高模型的残差平方和为335.0171。所以,足长与身高模型的预测误差更小。综合考虑 R² 值和残差平方和,足长与身高模型的准确率较高。基于给定数据,足长与身高之间的线性关系比步幅与身高之间的线性关系更可靠,足长与身高模型的预测效果更好。
实验心得
完成单变量线性回归实验后, 我深刻体会到了数据分析在解决实际问题中的重要作用。通过收集和处理大量的样本数据,能够发现变量之间的潜在关系,进而构建出能够预测或解释这些关系的模型。在这个过程中,我学习到了如何使用散点图来直观地展现数据分布,以及如何利用线性回归模型来量化变量之间的关系。我感受到了科学方法的严谨性和重要性。在进行实验时,需要确保数据的准确性和可靠性,避免因为数据质量问题导致模型出现偏差。同时,还需要运用统计方法来评估模型的拟合效果和预测能力,确保模型的可靠性和有效性。我也意识到了在数据分析和建模过程中需要注意的一些细节。例如,在构建线性回归模型时,需要确保自变量和因变量之间存在线性关系;在绘制散点图和拟合直线时,需要选择合适的坐标轴范围和刻度,以便更好地展示数据分布和模型拟合效果。