资讯详情

Python线性回归实操实验任务

📅 2026/11/3 19:33:14 | 华诺云谱 👁 阅读
Python线性回归实操实验任务
一、实验目的理解一元线性回归模型公式yyywww*xxxbbbw 斜率b 截距x 为自变量y 为预测结果。掌握最小二乘法求解线性回归看懂损失误差含义。学会手动调参观察参数变化对拟合直线的影响。使用训练完成模型做新样本预测绘制散点 拟合直线直观看到回归效果。能区分欠拟合、拟合良好。二、实验原理一元线性回归寻找一条直线尽可能贴近全部数据点。公式yyywww*xxxbbbxxx输入特征本实验每天复习小时数yyy目标输出考试分数www权重斜率复习时间每增加1小时分数大致上涨多少bbb偏置截距复习时间为0时的基础分数最小二乘法计算所有真实值和预测值的误差平方总和找到让总误差最小的 w 和 b。损失值代表直线和数据的偏离程度损失越小直线越贴合数据。调参本实验设置学习率、迭代次数两个超参数改变模型训练效果。三、实验环境Python3需要安装绘图库matplotlib安装命令命令提示符输入pipinstallmatplotlib四、实操分步任务填写实验记录数据集x 每日复习时长(小时)y 期末考试分数复习时长x(h)11.522.533.544.55考试分数y424855616572788488步骤1导入库、构建数据集、工具函数任务准备数据实现计算损失、梯度下降更新w、b的底层函数。importmatplotlib.pyplotasplt# 设置matplotlib支持中文解决方框乱码axes.unicode_minusFalse 解决负号显示异常plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 数据集x复习小时y考试分数defcreate_data():# 自变量x每日复习时长小时x_data[1,1.5,2,2.5,3,3.5,4,4.5,5]# 因变量y对应的期末考试分数y_data[42,48,55,61,65,72,78,84,88]returnx_data,y_data# 计算总损失(均方误差MSE)损失越小拟合直线越贴合数据defcalc_loss(x_list,y_list,w,b):total_loss0nlen(x_list)# 遍历所有样本累加误差平方foriinrange(n):y_predw*x_list[i]b# 根据当前w、b计算预测值errory_pred-y_list[i]# 预测值 - 真实值 误差total_losstotal_losserror**2msetotal_loss/n# 均方误差误差平方求平均returnmse# 梯度下降根据误差更新w斜率和b截距defgradient_update(x_list,y_list,w,b,lr):nlen(x_list)dw0# w的梯度总和db0# b的梯度总和foriinrange(n):y_predw*x_list[i]b dwdw(y_pred-y_list[i])*x_list[i]dbdb(y_pred-y_list[i])# 梯度公式dw(2/n)*dw db(2/n)*db# 沿着梯度反方向更新参数lr是学习率w_neww-lr*dw b_newb-lr*dbreturnw_new,b_new✅实验记录运行无报错calc_loss函数作用________________________gradient_update函数作用________________________步骤2封装训练函数加入可调超参数【实验核心调参部分】两个关键超参数lr学习率控制每次w、b改动幅度。lr太大震荡不收敛lr太小学习太慢。epoch迭代次数循环训练多少次。次数太少没学好欠拟合次数过多浪费时间。# 训练函数循环迭代不断优化w和bdeftrain_linear(x_data,y_data,lr0.01,epoch3000):# 初始化权重w、偏置b从0开始w0.0b0.0loss_history[]# 保存每一轮的损失后续绘图观察损失下降foriinrange(epoch):w,bgradient_update(x_data,y_data,w,b,lr)losscalc_loss(x_data,y_data,w,b)loss_history.append(loss)# 每500轮打印一次训练信息方便观察变化ifi%5000:print(f迭代轮数{i:4d}| w{w:.3f}| b{b:.3f}| 损失loss{loss:.3f})returnw,b,loss_history✅实验记录思考学习率lr调大参数更新步子变____(大/小)步骤3绘图函数画出原始散点 拟合直线# 绘制散点图拟合直线图defdraw_plot(x_data,y_data,w,b):plt.figure(figsize(8,5))plt.scatter(x_data,y_data,colorblue,label真实考试分数,s60)# 用训练好的w,b算出每个x对应的拟合yy_fit[w*xbforxinx_data]plt.plot(x_data,y_fit,colorred,linewidth2,labelf拟合直线 y{w:.2f}x{b:.2f})plt.xlabel(每日复习时长(小时))plt.ylabel(考试分数)plt.title(复习时长-考试分数 线性回归拟合)plt.legend()plt.grid(alpha0.3)plt.show()# 绘制损失变化曲线观察模型是否收敛defdraw_loss_curve(loss_list):plt.figure(figsize(7,4))plt.plot(loss_list,colororange)plt.xlabel(迭代次数epoch)plt.ylabel(损失loss)plt.title(训练损失变化)plt.grid(alpha0.3)plt.show()步骤4预测函数对新样本做预测# 预测函数输入新的x输出预测分数defpredict(w,b,x_new):y_outw*x_newbreturnround(y_out,1)# 保留1位小数步骤5主程序运行完整实验流程if__name____main__:x,ycreate_data()# 【调参区域修改这里的lr、epoch做对比实验】# learning_rate学习率控制每次参数更新步子大小learning_rate0.01# train_epoch迭代次数一共循环训练多少轮train_epoch3000# w_trained,b_trained,loss_histtrain_linear(x,y,lrlearning_rate,epochtrain_epoch)print(\n训练完成得到模型参数)print(f最优 w{w_trained:.3f}最优 b{b_trained:.3f})print(f回归直线公式y {w_trained:.2f}* x {b_trained:.2f})# 画两张图拟合效果图、损失下降图draw_plot(x,y,w_trained,b_trained)draw_loss_curve(loss_hist)# 用训练好的模型预测新样本test_x12.2test_x25.5pred1predict(w_trained,b_trained,test_x1)pred2predict(w_trained,b_trained,test_x2)print(f\n当每天复习{test_x1}小时预测考试分数{pred1})print(f当每天复习{test_x2}小时预测考试分数{pred2})✅实验记录记录默认参数下 w___ b两个样本预测结果_____、______五、调参对比任务重点修改主程序调参区参数运行填写表格每次修改参数重新运行完整代码观察控制台打印、两张图片、loss损失。实验组学习率lr迭代epoch现象观察损失是否下降直线效果组1(基准)0.013000损失持续下降直线贴合散点组2 lr过大0.23000损失爆炸变大训练震荡无法收敛组3 epoch过小0.01200迭代太少损失高直线倾斜不对欠拟合组4 epoch增大0.018000损失继续小幅降低直线变化很小操作提示设置lr0.2运行观察控制台输出会看到loss数值疯狂变大模型训练失败。说明学习率不能设置太大。设置epoch200运行迭代次数太少w,b还没训练到位红色直线偏离蓝色散点。✅实验记录lr设置过大时现象____________________________________epoch太小会出现________欠拟合/过拟合六、实验思考题写进实验报告线性回归中w和b分别代表什么含义结合本实验复习时长和考试分数解释。如果学习率lr设置得特别小会发生什么损失loss数值变大代表模型变好还是变差本实验模型输入 x6 小时你预测考试分数是多少七、实验小结一元线性回归寻找一条最优直线拟合数据通过梯度下降迭代更新w、b。超参数会直接影响训练结果学习率控制更新步长迭代次数控制训练轮次。通过损失曲线可以判断模型有没有训练完成训练完成后模型可以对未知样本做预测。补充常见报错排查实操提示ModuleNotFoundError: No module named ‘matplotlib’ →执行pip install matplotlib安装库。图形窗口不弹出代码无报错只输出文字需要检查matplotlib环境。数值疯狂暴涨学习率lr设置太大改成0.005或0.01。完整代码importmatplotlib.pyplotasplt# 设置matplotlib支持中文解决方框乱码axes.unicode_minusFalse 解决负号显示异常plt.rcParams[font.sans-serif][SimHei]plt.rcParams[axes.unicode_minus]False# 数据集x复习小时y考试分数defcreate_data():# 自变量x每日复习时长小时x_data[1,1.5,2,2.5,3,3.5,4,4.5,5]# 因变量y对应的期末考试分数y_data[42,48,55,61,65,72,78,84,88]returnx_data,y_data# 计算总损失(均方误差MSE)损失越小拟合直线越贴合数据defcalc_loss(x_list,y_list,w,b):total_loss0nlen(x_list)# 遍历所有样本累加误差平方foriinrange(n):y_predw*x_list[i]b# 根据当前w、b计算预测值errory_pred-y_list[i]# 预测值 - 真实值 误差total_losstotal_losserror**2msetotal_loss/n# 均方误差误差平方求平均returnmse# 梯度下降根据误差更新w斜率和b截距defgradient_update(x_list,y_list,w,b,lr):nlen(x_list)dw0# w的梯度总和db0# b的梯度总和foriinrange(n):y_predw*x_list[i]b dwdw(y_pred-y_list[i])*x_list[i]dbdb(y_pred-y_list[i])# 梯度公式dw(2/n)*dw db(2/n)*db# 沿着梯度反方向更新参数lr是学习率w_neww-lr*dw b_newb-lr*dbreturnw_new,b_new# 训练函数循环迭代不断优化w和bdeftrain_linear(x_data,y_data,lr0.01,epoch3000):# 初始化权重w、偏置b从0开始w0.0b0.0loss_history[]# 保存每一轮的损失后续绘图观察损失下降foriinrange(epoch):w,bgradient_update(x_data,y_data,w,b,lr)losscalc_loss(x_data,y_data,w,b)loss_history.append(loss)# 每500轮打印一次训练信息方便学生观察变化ifi%5000:print(f迭代轮数{i:4d}| w{w:.3f}| b{b:.3f}| 损失loss{loss:.3f})returnw,b,loss_history# 绘制散点图拟合直线图defdraw_plot(x_data,y_data,w,b):plt.figure(figsize(8,5))plt.scatter(x_data,y_data,colorblue,label真实考试分数,s60)# 用训练好的w,b算出每个x对应的拟合yy_fit[w*xbforxinx_data]plt.plot(x_data,y_fit,colorred,linewidth2,labelf拟合直线 y{w:.2f}x{b:.2f})plt.xlabel(每日复习时长(小时))plt.ylabel(考试分数)plt.title(复习时长-考试分数 线性回归拟合)plt.legend()plt.grid(alpha0.3)plt.show()# 绘制损失变化曲线观察模型是否收敛defdraw_loss_curve(loss_list):plt.figure(figsize(7,4))plt.plot(loss_list,colororange)plt.xlabel(迭代次数epoch)plt.ylabel(损失loss)plt.title(训练损失变化)plt.grid(alpha0.3)plt.show()# 预测函数输入新的x输出预测分数defpredict(w,b,x_new):y_outw*x_newbreturnround(y_out,1)# 保留1位小数if__name____main__:x,ycreate_data()# 【调参区域修改这里的lr、epoch做对比实验】# learning_rate学习率控制每次参数更新步子大小learning_rate0.01# train_epoch迭代次数一共循环训练多少轮train_epoch3000# w_trained,b_trained,loss_histtrain_linear(x,y,lrlearning_rate,epochtrain_epoch)print(\n训练完成得到模型参数)print(f最优 w{w_trained:.3f}最优 b{b_trained:.3f})print(f回归直线公式y {w_trained:.2f}* x {b_trained:.2f})# 画两张图拟合效果图、损失下降图draw_plot(x,y,w_trained,b_trained)draw_loss_curve(loss_hist)# 用训练好的模型预测新样本test_x12.2test_x25.5pred1predict(w_trained,b_trained,test_x1)pred2predict(w_trained,b_trained,test_x2)print(f\n当每天复习{test_x1}小时预测考试分数{pred1})print(f当每天复习{test_x2}小时预测考试分数{pred2})
📝

华诺云谱内容团队

资深建站顾问 · 行业研究员

10年+企业数字化服务经验,专注智能建站、SEO优化与品牌营销,持续输出建站技巧、行业洞察与营销干货,已帮助5000+企业实现数字化增长。

你可能需要的服务

订阅华诺云谱资讯周报

每周一封,精选建站技巧、SEO与营销干货,直达邮箱。已有 8,000+ 企业主订阅,助你少走弯路。

↑