恒美微站 Logo 恒美微站
  • 首页
  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心
  • 联系我们

线性回归身高预测实战:数据预处理、模型训练与避坑指南

  • 首页
  • 资讯中心
  • /
  • 线性回归身高预测实战:数据预处理、模型训练与避坑指南

相关资讯

LanceDB JS SDK 的 QueryExecutionOptions:批大小与查询超时控制实战指南 2026/9/23 23:22:16
BERT微调多标签文本分类:数据、训练与避坑全攻略 2026/9/23 23:22:16
Regal 规则忽略完全指南:掌握 Rego 静态检查的优先级体系与配置方法 2026/9/23 23:22:16

最新资讯

小米红米线刷卡Fastboot?从分区原理到脚本修改全解析
安全合规下的内容创作:为何某些技术主题不能写
科研AI工作台选型指南:Cursor、Codex、Papers AI、CoCalc、Deepnote对比
用 Nginx 配置免费的Let’s Encrypt https证书
EX3300 是 Juniper Networks(瞻博网络) 这个 设置好像挺简单 按钮 让后选择 factory_default
2026年做个人服务选哪个厂家更专业靠谱?

今日推荐

JavaWeb购物车系统实现:基于Session存储的完整工程示例
面向对象综合训练:从图书管理系统掌握封装、继承与多态
Lombok与JDK版本冲突引发NoSuchFieldError:根因排查与修复指南

本周热门

BrewUI:给Homebrew套上图形界面,让macOS软件包管理更简单
BrewUI:让Homebrew包管理变得可视化与高效
公式与文本对齐全攻略:从Word到LaTeX的实用技巧

本月精选

自研推理加速器Redwood:两周内实现PyTorch模型高效部署的实战教程
V4L2摄像头采集实战:从camera_client.rar到出图全流程解析
从“谁发明了钢琴键”到知识问答智能体:RAG与记忆工程实践

线性回归身高预测实战:数据预处理、模型训练与避坑指南

发布时间:2026/9/23 23:22:16
线性回归身高预测实战:数据预处理、模型训练与避坑指南 简介这份资源面向机器学习入门者与需要掌握回归建模的开发者围绕“身高预测”这一具体场景讲解如何用线性回归建立身高与年龄、体重、性别等因素之间的依赖关系帮助读者理解连续值预测的完整流程。压缩包共2个文件包含1个xlsx数据表与1个py脚本整体约80KB前者用于存放身高、年龄、性别、体重等样本数据后者基于scikit-learn实现数据预处理、模型训练、评估与预测。资源覆盖数据清洗、分类变量编码、训练测试集划分、LinearRegression拟合以及MSE、RMSE、R²等指标评估并延伸讨论多项式回归、岭回归、套索回归与集成方法等改进方向。已有114人学习适合希望用最小成本跑通线性回归案例、理解模型评估与调参思路的读者参考。1. 线性回归身高预测三行代码能跑通但别急着交作业很多人第一次接触机器学习都是从线性回归开始的。原因很简单它数学直觉清晰、代码量少、结果可解释。但真正拿一份真实数据跑一遍你会发现事情没那么简单——性别是文字怎么处理量纲差了几十倍要不要归一化R² 高就代表模型能用吗这份资源包给了一个完整的起点机器学习_线性回归身高预测.zip里包含身高预测参照表-1.xlsx和LinearRegression_1.py一个负责数据一个负责建模。它适合刚学完 scikit-learn 基础 API、想找一个完整小项目练手的人也适合需要快速搭一个回归基线、再往上叠复杂模型的从业者。接下来我按实际拆包的顺序把数据预处理、模型训练、评估指标和常见翻车点逐一讲清楚。2. 拆开资源包数据表结构与脚本骨架2.1 身高预测参照表里到底有什么拿到身高预测参照表-1.xlsx之后第一件事不是急着read_excel而是先搞清楚列名和数据类型。常见的身高预测数据集一般包含以下几类字段字段类型典型列名数据类型处理方式目标变量身高 / height浮点数不做变换作为 y数值特征年龄 / age、体重 / weight整数或浮点检查缺失值和异常值分类特征性别 / gender字符串或 0/1编码为数值标识列编号 / id整数训练前丢弃用 pandas 快速看一眼数据全貌import pandas as pd df pd.read_excel(身高预测参照表-1.xlsx) print(df.shape) # 行数和列数 print(df.dtypes) # 每列数据类型 print(df.head()) # 前五行 print(df.isnull().sum()) # 每列缺失值数量 print(df.describe()) # 数值列统计摘要这段代码的作用是建立对数据的「第一印象」。shape告诉你样本量够不够——如果只有几十行线性回归的系数估计会很不稳定。dtypes帮你判断哪些列被 pandas 误读成了 object 类型比如性别列里混了空格或全角字符。isnull().sum()是必须看的缺失值不处理直接丢进LinearRegression会报错。describe()则能快速发现异常值比如体重出现 500 公斤这种明显不合理的记录。我一般会额外做一步检查性别列的取值分布。print(df[性别].value_counts(dropnaFalse))如果出现「男」「女」之外的第三种值比如空字符串或者「未知」就需要决定是归入某一类还是直接删除。这一步看起来琐碎但后面模型效果不好时回头排查数据往往比调参更有效。2.2 LinearRegression_1.py 的典型结构LinearRegression_1.py这个脚本文件从命名来看是一个独立的线性回归实现。常见做法是把它组织成以下几个逻辑块import pandas as pd import numpy as np from sklearn.linear_model import LinearRegression from sklearn.model_selection import train_test_split from sklearn.metrics import mean_squared_error, r2_score from sklearn.preprocessing import StandardScaler # 1. 读取数据 df pd.read_excel(身高预测参照表-1.xlsx) # 2. 数据预处理 df df.dropna() # 删除缺失行 df[性别] df[性别].map({男: 1, 女: 0}) # 性别编码 # 3. 划分特征和目标 X df[[年龄, 体重, 性别]] y df[身高] # 4. 划分训练集和测试集 X_train, X_test, y_train, y_test train_test_split( X, y, test_size0.2, random_state42 ) # 5. 标准化可选但推荐 scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) X_test_scaled scaler.transform(X_test) # 6. 训练模型 model LinearRegression() model.fit(X_train_scaled, y_train) # 7. 预测与评估 y_pred model.predict(X_test_scaled) print(MSE:, mean_squared_error(y_test, y_pred)) print(R2:, r2_score(y_test, y_pred)) print(系数:, model.coef_) print(截距:, model.intercept_)这里有几个关键决策点值得展开说。dropna()是最粗暴的缺失值处理方式如果数据量本来就少更合理的做法是用均值或中位数填充。性别映射用map是最直接的方式但如果性别列有第三种取值map会把它变成 NaN后续需要额外处理。train_test_split的random_state设成固定值是为了结果可复现这在调试阶段非常重要——否则每次跑出来的评估指标都不一样你根本分不清是改动生效了还是随机波动。StandardScaler对线性回归来说不是必须的因为线性回归的闭式解不受量纲影响。但加上标准化有两个好处一是系数的大小可以直接比较特征重要性二是如果后续换成岭回归或套索回归标准化就是必须的前置步骤。fit_transform用在训练集上transform用在测试集上这个区别不能搞反——用测试集去 fit 会导致数据泄露。3. 从数据到模型预处理、训练与评估的完整链路3.1 数据清洗与特征工程的具体操作数据清洗不是一步到位的事情而是根据模型反馈反复迭代的过程。假设describe()显示体重列的最大值是 300 公斤而 75% 分位数只有 80 公斤那这个 300 大概率是录入错误。处理方式有几种# 方式一直接删除异常值 df df[df[体重] 200] # 方式二用中位数替换 median_weight df[体重].median() df.loc[df[体重] 200, 体重] median_weight # 方式三盖帽法Winsorizing upper df[体重].quantile(0.99) df[体重] df[体重].clip(upperupper)三种方式没有绝对优劣。删除异常值适合样本量充足的情况中位数替换会改变分布形态盖帽法保留了样本但压缩了极端值的影响。我一般先用盖帽法跑一版看看模型系数和 R² 的变化再决定要不要更激进地处理。特征工程方面线性回归最直接的扩展是构造交互项和多项式项。比如年龄和性别可能存在交互效应——不同性别在相同年龄段的生长速度不同。可以这样加df[年龄_性别] df[年龄] * df[性别]如果散点图显示身高和年龄明显不是直线关系而是先快后慢的曲线那就需要加二次项from sklearn.preprocessing import PolynomialFeatures poly PolynomialFeatures(degree2, include_biasFalse) X_poly poly.fit_transform(X)degree2表示生成所有特征的二次项和两两交互项。特征数会从 3 个膨胀到 9 个如果原始特征更多膨胀速度会更快。这时候就要警惕过拟合后面评估章节会讲怎么判断。3.2 模型训练中的参数与评估指标LinearRegression这个类本身几乎没有超参数fit_intercept默认 True表示模型会计算截距。如果业务上明确知道身高不可能为 0 时截距应该为 0可以设成 False但这种情况极少。真正需要关注的是训练完之后模型学到的系数model LinearRegression() model.fit(X_train_scaled, y_train) for name, coef in zip(X.columns, model.coef_): print(f{name}: {coef:.4f}) print(f截距: {model.intercept_:.4f})系数的含义是在其他特征不变的情况下该特征每增加一个标准差身高平均变化多少因为做了标准化。如果某个特征的系数接近 0说明它对预测身高的贡献很小可以考虑剔除。如果系数符号和常识相反——比如体重系数是负的——那大概率是多重共线性导致的需要检查特征之间的相关性。评估指标方面MSE、RMSE 和 R² 各有用途指标公式含义适用场景注意事项MSE预测误差平方的均值对比不同模型量纲是身高的平方不直观RMSEMSE 开根号解释误差大小和身高同量纲最直观R²解释方差比例判断拟合优度特征越多 R² 越高需配合调整 R²MAE绝对误差的均值对异常值不敏感不如 RMSE 常用from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score import numpy as np y_pred model.predict(X_test_scaled) mse mean_squared_error(y_test, y_pred) rmse np.sqrt(mse) mae mean_absolute_error(y_test, y_pred) r2 r2_score(y_test, y_pred) print(fMSE: {mse:.2f}) print(fRMSE: {rmse:.2f} cm) print(fMAE: {mae:.2f} cm) print(fR2: {r2:.4f})RMSE 的单位是厘米可以直接说「模型预测身高的平均误差大约是 X 厘米」。R² 在 0 到 1 之间越接近 1 说明模型解释力越强。但要注意R² 会随着特征数量增加而虚高所以更严谨的做法是看调整 R²n len(y_test) p X_test.shape[1] adjusted_r2 1 - (1 - r2) * (n - 1) / (n - p - 1) print(f调整 R2: {adjusted_r2:.4f})如果调整 R² 比 R² 低很多说明有不少特征是在「凑数」需要做特征筛选。4. 避坑与排查线性回归身高预测的五个血泪教训4.1 性别编码翻车map 之后全是 NaN现象执行df[性别].map({男: 1, 女: 0})之后性别列全部变成 NaN模型报错说输入包含缺失值。原因Excel 表里的性别字段可能带有不可见字符比如前后空格、全角空格或者写的是「男性」「女性」而不是「男」「女」。map是精确匹配差一个字符都不行。解决先做字符串清洗再映射。df[性别] df[性别].astype(str).str.strip() df[性别] df[性别].str.replace(性, ) df[性别] df[性别].map({男: 1, 女: 0}) print(df[性别].isnull().sum()) # 确认没有残留 NaN如果还有 NaN用value_counts看看剩余取值是什么再补充映射规则。4.2 标准化顺序搞反测试集信息泄露现象模型在测试集上的 R² 异常高换一组测试数据后效果暴跌。原因对全量数据做了fit_transform然后再划分训练集和测试集。这样测试集的均值和方差信息已经进入了训练过程相当于提前「偷看」了答案。解决永远先划分再在训练集上fit在测试集上只做transform。X_train, X_test, y_train, y_test train_test_split(X, y, test_size0.2, random_state42) scaler StandardScaler() X_train_scaled scaler.fit_transform(X_train) # 正确 X_test_scaled scaler.transform(X_test) # 正确4.3 多重共线性系数符号和常识相反现象体重对身高的系数是负数意味着体重越大身高越矮这显然不符合常识。原因年龄和体重高度相关线性回归在估计系数时无法区分两者的独立贡献导致系数符号混乱。这种情况叫多重共线性。解决先看特征间的相关系数矩阵。print(df[[年龄, 体重, 性别]].corr())如果年龄和体重的相关系数超过 0.8考虑删掉其中一个或者改用岭回归。岭回归通过 L2 正则化可以缓解共线性问题from sklearn.linear_model import Ridge ridge Ridge(alpha1.0) ridge.fit(X_train_scaled, y_train) print(Ridge R2:, ridge.score(X_test_scaled, y_test))alpha越大正则化越强系数被压缩得越厉害。可以从 0.01 开始试逐步增大看测试集 R² 的变化。4.4 用 R² 判断模型好坏高 R² 不等于能预测现象R² 达到 0.95但拿一个新样本去预测结果偏差很大。原因R² 衡量的是模型对训练数据分布的拟合程度如果数据本身范围很窄比如全是 20 到 30 岁的人群模型在这个窄区间内拟合得很好但一旦输入 50 岁的样本预测就完全不可靠。这叫分布外预测失败。解决检查训练数据的特征范围预测新样本时确认输入在训练分布内。print(训练集年龄范围:, X_train[年龄].min(), -, X_train[年龄].max()) print(训练集体重范围:, X_train[体重].min(), -, X_train[体重].max())如果新样本超出这个范围模型输出只能作为参考不能当作准确预测。4.5 数据量太少模型系数每次跑都不一样现象每次重新运行脚本模型的系数和 R² 都有明显变化。原因样本量太少train_test_split的随机划分导致每次训练集和测试集差异很大。如果只有几十行数据这个问题尤其严重。解决用交叉验证代替单次划分。from sklearn.model_selection import cross_val_score scores cross_val_score(model, X_scaled, y, cv5, scoringr2) print(交叉验证 R2:, scores.mean(), /-, scores.std())cv5表示五折交叉验证把数据分成五份轮流用其中四份训练、一份测试。这样得到的 R² 更稳定也能看出模型在不同数据子集上的表现差异。如果标准差很大说明模型对数据划分敏感需要更多数据或更简单的模型。5. 进阶技巧用残差图和正则化判断模型是否值得上线线性回归跑通不难难的是判断它到底能不能用。我一般会做两件事画残差图、对比正则化模型。残差图是预测值和残差的散点图。如果残差随机分布在 0 附近没有明显规律说明线性假设基本成立。如果残差呈现 U 形或倒 U 形说明特征和目标之间不是线性关系需要加多项式项。如果残差随着预测值增大而扩散说明存在异方差性可以考虑对目标变量取对数。import matplotlib.pyplot as plt y_pred model.predict(X_test_scaled) residuals y_test - y_pred plt.scatter(y_pred, residuals, alpha0.6) plt.axhline(y0, colorred, linestyle--) plt.xlabel(预测身高) plt.ylabel(残差) plt.title(残差图) plt.show()这张图如果看起来像一团随机散布的点模型基本合格。如果能看到明显的曲线趋势就说明线性模型欠拟合了。第二件事是对比普通线性回归和岭回归、套索回归的表现。套索回归Lasso会自动把不重要的特征系数压缩到 0相当于做了特征选择from sklearn.linear_model import Lasso lasso Lasso(alpha0.1) lasso.fit(X_train_scaled, y_train) print(Lasso R2:, lasso.score(X_test_scaled, y_test)) print(Lasso 系数:, lasso.coef_)如果 Lasso 把某个特征的系数压成了 0说明这个特征对预测身高的贡献可以忽略。如果岭回归的测试集 R² 比普通线性回归高说明存在过拟合正则化起到了作用。如果三者差不多那普通线性回归就够用了没必要上更复杂的模型。还有一个容易被忽略的点特征的业务含义。如果模型学出来「性别」的系数是 5 厘米意味着在其他条件相同的情况下男性比女性平均高 5 厘米。这个数字如果和实际统计数据吻合说明模型学到了真实规律如果差得很远就要回头检查数据里是不是有采样偏差。从那以后我每次跑完线性回归都会强制走一遍「残差图 正则化对比 系数业务校验」这三步确认模型不是碰巧拟合了噪声才敢往下用。希望帮到你。本文还有配套的精品资源点击获取

关于恒美微站

恒美微站专注于为个体商户、工作室提供极简自助建站服务,让每个人都能轻松拥有专业网站。

快速链接

  • 关于我们
  • 建站服务
  • 主题模板
  • 案例展示
  • 资讯中心

服务项目

  • 可视化建站
  • 拖拽编辑
  • 主题定制
  • SEO 优化
  • 网站托管

联系方式

  • 📍 地址:北京市朝阳区建国路 88 号
  • 📞 电话:400-888-8888
  • ✉️ 邮箱:info@hmyw.cn
  • 🕐 时间:周一至周日 9:00-18:00

© 2024 恒美微站 hmyw.cn 版权所有 | 京 ICP 备 12345678 号