t 检验
本课属于 Coddy Machine Learning 学习旅程的“机器学习统计学”单元。第 45 课,共 64 课。
在计算机出现之前,统计学有一个捷径:t 检验。一个公式就能一次性将平均值、离散程度和组大小转换为 p 值:
from scipy import stats
result = stats.ttest_ind(sans, serif)
print(np.round(result.pvalue, 3))
print(np.round(result.statistic, 2))对于字体研究,这会打印出 0.031 和 -2.61。1000 次打乱后得到 0.039,和往常一样,结果很接近。
t 值表示标准误的差距;它的符号只表示哪个组排在前面。这个公式假设数据呈钟形分布,因此对于样本量小且偏斜的组,要相信随机打乱的结果。
它还会检查一个模型是否真的优于另一个模型。
挑战
中等一家油漆制造商测量了三种漆面干燥所需的时间。起始代码将每种漆面的分钟数放在 times 中,列出三个 pairs,定义 permutation_p(a, b),并读取 level。
- 并排打印哑光漆与缎面漆的 t 检验 p 值和置换检验的 p 值。
- 按每对漆面中第一种漆面在前的顺序,检验每一对,并打印 p 值最小的一对。
- 统计 p 值低于
level的漆面对数。
将 p 值四舍五入到小数点后三位。另一家制造商的 level 为 0.05:
matte vs satin: t-test 0.012, simulation 0.023
Clearest difference: satin vs gloss (p = 0.0)
Pairs that differ: 3 of 3亲手试试
import numpy as np
import pandas as pd
from scipy import stats
# 前两课的置换检验:返回 a 与 b 比较的 p 值
def permutation_p(a, b, shuffles=1000, seed=0):
rng = np.random.default_rng(seed)
pooled = np.concatenate([a, b])
diffs = []
for i in range(shuffles):
shuffled = rng.permutation(pooled)
diffs.append(shuffled[len(a):].mean() - shuffled[:len(a)].mean())
real = b.mean() - a.mean()
return (np.abs(np.array(diffs)) >= np.abs(real)).mean()
paint = pd.read_csv("paint.csv")
times = {
"matte": paint[paint["finish"] == "matte"]["minutes"],
"satin": paint[paint["finish"] == "satin"]["minutes"],
"gloss": paint[paint["finish"] == "gloss"]["minutes"],
}
pairs = [("matte", "satin"), ("matte", "gloss"), ("satin", "gloss")]
level = float(input())
# 在下方编写你的代码
这节课包含一个小测验。开始学习即可作答,并记录你的进度。
机器学习统计学中的所有课
自己练习: Python 在线编译器