{ "nbformat": 4, "nbformat_minor": 5, "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "name": "python" } }, "cells": [ { "cell_type": "markdown", "id": "371a5e4d", "metadata": {}, "source": "# 练习:根据砝码质量预测弹簧长度\n训练记录如下。质量单位g,长度单位cm。数据为教学虚构数据。\n\n|质量|0|50|100|150|200|250|\n|---|---|---|---|---|---|---|\n|长度|10.0|12.1|14.0|16.2|18.0|20.1|\n\n1. 画训练数据散点图,标明坐标轴和单位。\n2. 用LinearRegression拟合,写出直线公式,预测175g时的长度。\n3. 测试记录为(125g, 15.1cm)、(225g, 19.0cm),计算测试MAE。\n4. 说明能否直接预测1000g,需要补充什么依据。\n\n`None`表示未填写。请替换占位代码;所有测试数据都不应传入fit。" }, { "cell_type": "code", "id": "855571c9", "metadata": {}, "source": "import matplotlib.pyplot as plt\nfrom sklearn.linear_model import LinearRegression\nfrom sklearn.metrics import mean_absolute_error\n\nmasses = [0, 50, 100, 150, 200, 250]\nlengths = [10.0, 12.1, 14.0, 16.2, 18.0, 20.1]\ntest_masses = [125, 225]\ntest_lengths = [15.1, 19.0]", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "id": "2628c773", "metadata": {}, "source": "## 1. 画出训练数据" }, { "cell_type": "code", "id": "c1f321b7", "metadata": {}, "source": "# 在这里画出masses与lengths的散点图,标注坐标轴及单位。", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "id": "1b61a7b8", "metadata": {}, "source": "## 2. 整理输入并训练模型" }, { "cell_type": "code", "id": "3f6ed9e2", "metadata": {}, "source": "X = None # 改为二维训练输入\ny = lengths\nmodel = None # 创建LinearRegression对象,再用X和y拟合\n# 输出斜率与截距", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "id": "aa2a3308", "metadata": {}, "source": "## 3. 预测并检验" }, { "cell_type": "code", "id": "28e9ccbf", "metadata": {}, "source": "prediction_175 = None # 使用模型预测175g\ntest_predictions = None # 预测两条测试输入\nmae = None # 计算测试MAE\n# 输出预测值和误差", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "id": "3060b483", "metadata": {}, "source": "## 4. 自查与解释\n自查只检查部分结构和计算,仍需确认fit没有使用测试记录。" }, { "cell_type": "code", "id": "5a9cc997", "metadata": {}, "source": "from sklearn.utils.validation import check_is_fitted\n\nif X is None or model is None or prediction_175 is None or test_predictions is None or mae is None:\n print(\"尚有占位项,请继续补全\")\nelse:\n check_is_fitted(model)\n assert len(X) == 6 and all(len(row) == 1 for row in X)\n assert len(test_predictions) == 2\n assert abs(float(prediction_175) - float(model.predict([[175]])[0])) < 1e-8\n assert abs(float(mae) - float(mean_absolute_error(test_lengths, test_predictions))) < 1e-8\n assert float(mae) >= 0\n print(\"结构与计算检查通过;请核对散点图、公式、单位和数据划分\")", "outputs": [], "execution_count": null }, { "cell_type": "markdown", "id": "b5e8b7da", "metadata": {}, "source": "写出你的拟合公式、175g预测值、测试MAE及单位。\n\n说明:能否直接用这条直线预测1000g时的长度?还需要补充什么依据?" } ] }