Menu
CoddyTech

拟合效果如何?

本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 39 课,共 64 课。

任何云图都可以画出一条直线,因此要用评分来评估拟合效果。一位水手记录了风速和船速:比较这条直线的平方误差与均值的平方误差,后者是最简单的猜测:

两个面板各有六个点,表示船速与风速的关系。左图:均值处的一条水平线与各点之间有较长的红色间隔,平方误差为 16.23。右图:拟合直线与各点之间只有很短的红色间隔,平方误差为 0.35

R 平方表示这条直线解释了数据总离散程度的多少:

wind = np.array([6, 8, 10, 12, 15, 18])
boat = np.array([3.1, 4.4, 4.9, 6.2, 6.8, 8.1])
slope, intercept = np.polyfit(wind, boat, 1)
predicted = slope * wind + intercept
ss_res = ((boat - predicted) ** 2).sum()  # 拟合值:0.35
ss_tot = ((boat - boat.mean()) ** 2).sum()  # 平均值:16.23
print(np.round(1 - ss_res / ss_tot, 3))

这会输出 0.979:这条直线解释了速度变化的 98%。1 表示直线拟合得完美,0 表示效果不比平均值好。

它是预测数值的模型的标准评分。对于拟合直线,它等于 r 平方。

challenge icon

挑战

中等

一家蘑菇农场在 mushrooms.csv 中记录了 16 个种植床。程序会读取一个列名,起始代码会拟合一条直线,用它来预测 harvest_kg。报告需要用到 r_squared,但它目前还是空的。

  1. 完成 r_squared(y, predicted),让它返回 R 平方值。
  2. 在末尾打印检查结果:计算 x 和 y 的相关系数,平方后乘以 100,并四舍五入到小数点后 1 位。

对于另一家农场,输入 humidity 时:

humidity explains 27.0% of the harvest variation
Check with r squared: 27.0%

亲手试试

import numpy as np
import pandas as pd


# 返回 y 的预测值对应的 R 平方值
def r_squared(y, predicted):
    # 在这里编写你的代码
    return 0


beds = pd.read_csv("mushrooms.csv")
column = input()
# 不要修改下面的代码行
x = beds[column]
y = beds["harvest_kg"]
slope, intercept = np.polyfit(x, y, 1)
predicted = slope * x + intercept
r2 = r_squared(y, predicted)
print(f"{column} explains {np.round(r2 * 100, 1)}% of the harvest variation")

# 在下方编写你的代码
quiz icon自我测试

这节课包含一个小测验。开始学习即可作答,并记录你的进度。

机器学习统计学中的所有课

自己练习: Python 在线编译器