九、抽样
原文:Sampling
译者:飞龙
学习成果
- 了解如何适当地收集数据以帮助回答问题。
在数据科学中,了解人口特征始于拥有质量数据进行调查。虽然通常不可能收集描述人口的所有数据,但我们可以通过适当地从人口中抽样来克服这一问题。在本文中,我们将讨论从人口中抽样的适当技术。
生命周期图
9.1 普查和调查
一般来说:普查是“对人口的官方计数或调查,通常记录个体的各种细节。”一个例子是 2020 年 4 月举行的美国十年一次人口普查。它统计了居住在所有 50 个州、哥伦比亚特区和美国领土的每个人,而不仅仅是公民。法律要求参与(这是由美国宪法规定的)。重要用途包括联邦资金的分配、国会代表权以及划分国会和州立法机构选区。普查由寄往美国不同住房地址的调查组成。
调查是一组问题。一个例子是工作者对个人和家庭进行抽样。提出的问题以及提问的方式可能会影响受访者的回答,甚至可能影响他们是否首先回答。
虽然普查很好,但往往很难和昂贵地对人口中的每个人进行调查。想象一下美国在 2020 年人口普查上花费的资源、金钱、时间和精力。虽然这确实给我们提供了更准确的人口信息,但通常是不可行的。因此,我们通常只对人口的一个子集进行调查。
样本通常是人口的子集,通常用于对人口进行推断。如果我们的样本很好地代表了我们的人口,那么我们可以使用它以较低的成本获取有用信息。也就是说,样本的抽取方式将影响这种推断的可靠性。抽样中的两个常见误差来源是偶然误差,随机样本可能与预期的任何方向不同,以及偏差,这是一个方向上的系统误差。偏差可能是许多因素的结果,例如我们的抽样方案或调查方法。
让我们定义一些有用的词汇:
-
人口:你想了解的群体。
- 人口中的个体并不总是人。其他人口包括你肠道中的细菌(使用 DNA 测序进行抽样)、某种树木、获得小额贷款的小企业,或者学术期刊或领域中发表的结果。
-
抽样框架:从中抽取样本的列表。
- 例如,如果抽样人员,则抽样框架是可能最终进入样本的所有人的集合。
-
样本:你最终抽样的对象。因此,样本是你的抽样框架的一个子集。
虽然理想情况下,这三组将完全相同,但实际上通常并非如此。例如,可能有个体在你的抽样框架(因此也在你的样本)中,而不在你的人口中。而且一般来说,样本大小要比人口大小小得多。
抽样框架
9.2 偏差:案例研究
以下案例研究改编自 Freedman、Pisani 和 Purves 的《统计学》,W.W. Norton NY,1978 年。
1936 年,民主党总统富兰克林·D·罗斯福竞选连任,对手是共和党的阿尔夫·兰登。和往常一样,选举前几个月进行了民意调查,试图预测结果。文学文摘是一本成功预测了 1936 年之前 5 次大选结果的杂志。在他们对 1936 年选举的调查中,他们向从电话簿、杂志订阅者名单和乡村俱乐部会员名单中找到的 1000 万人发送了调查。在大约 240 万人中,只有 43%的人报告说他们会投票给罗斯福;因此,文摘预测兰登会获胜。
在选举日,罗斯福以压倒性优势获胜,获得了约 4500 万选民中 61%的普选票。为什么文摘的民意调查会出现如此错误的情况?
事实证明,文学文摘的样本并不代表人口。他们在电话簿、杂志订阅者名单和乡村俱乐部会员名单中找到的样本更富裕,倾向于投票共和党。因此,他们的抽样框架在本质上偏向兰登。文学文摘完全忽视了仍然在大萧条中受苦的大多数选民。此外,他们的回应率很低(约 24%);谁知道其他未回应者会如何投票?文学文摘在这场灾难后仅 18 个月就倒闭了。
与此同时,正在崛起的统计学家乔治·盖洛普也对 1936 年的选举做出了预测。尽管他的样本量“只有”5 万人(这仍然比必要的要多;我们在讨论中心极限定理时会更多),但他对 56%的选民会选择罗斯福的估计更接近实际结果(61%)。盖洛普还预测了文学文摘的预测,样本量只有 3000 人,通过预测文学文摘的富裕抽样框架并对这些个体进行子抽样,预测了文学文摘的预测,只有 1%的误差。
所以这个故事的寓意是什么?样本虽然方便,但容易受到偶然误差和偏见的影响。选举民意调查,特别是可能涉及许多偏见来源。举几个例子:
-
选择偏见系统性地排除(或偏爱)特定群体。
-
例如:文学文摘调查排除了不在电话簿上的人。
-
如何避免:检查抽样框架和抽样方法。
-
-
回应偏见是因为人们并不总是如实回答。调查设计者特别注意问题的性质和措辞,以避免这种偏见。
-
例如:非法移民在人口普查调查中被问及公民身份问题时可能不会如实回答。
-
如何避免:检查问题的性质和调查方法。
-
-
非响应偏见是因为人们并不总是回应调查请求,这可能会扭曲回应。
-
例如:只有 1000 万人中的 240 万人回应了文学文摘的调查。
-
如何避免:保持调查简短,坚持不懈。
-
今天,盖洛普民意调查是选举结果的主要民意调查之一。许多偏见来源——谁会回答民意调查?选民是否会说实话?我们如何预测投票率?——仍然存在,但盖洛普民意调查采用了几种策略来减轻这些偏见。在他们的抽样框架中,“美国大陆的成年电话家庭的非机构化人口”,他们使用随机数字拨号来包括列出/未列出的电话号码,并避免选择偏见。此外,他们使用了一个在家庭内部的选择过程,随机选择一个或多个成年人的家庭。如果没有人回答,多次重新拨号以避免非响应偏见。
9.3 概率样本
在取样时,关注样本的质量而不是样本的数量至关重要。庞大的样本量并不能弥补糟糕的取样方法。我们的主要目标是收集代表所在人口的样本。在本节中,我们将探讨不同类型的取样及其优缺点。
便利样本是你能够得到的任何样本;这种取样是非随机的。请注意,潦草的取样不一定是随机取样;存在许多潜在的偏差来源。
在概率样本中,我们提供了任何指定的个体集将被选入样本的机会(人口中的个体可以有不同的被选中机会;它们不必全部一致),我们根据这个已知的机会随机取样。因此,概率样本也被称为随机样本。随机性带来了一些好处:
-
因为我们知道源概率,我们可以测量误差。
-
随机取样使我们得到人口更具代表性的样本,从而减少偏见。(注意:只有在我们从中进行取样的概率分布准确时才是这样。使用“糟糕”或不准确的分布进行随机取样可能会产生对人口数量的偏见估计。)
-
概率样本使我们能够估计偏差和机会误差,这有助于我们量化不确定性(在未来的讲座中会详细介绍)。
现实世界通常更加复杂,我们经常不知道最初的概率。例如,我们通常不知道微生物组样本中某个细菌的概率,或者盖洛普打电话时人们是否会接听。尽管如此,我们仍然尽力模拟概率取样,即使取样或测量过程并不完全在我们的控制之下。
一些常见的随机取样方案:
-
带替换的随机样本是一个均匀随机带替换的样本。
-
随机并不总是意味着“均匀随机”,但在这个特定的上下文中,它是这样的。
-
人口中的一些个体可能会被多次选中。
-
-
简单随机样本(SRS)是一个均匀随机不带替换的样本。
-
每个个体(和个体子集)被选中的机会都是相同的。
-
每对的机会都与其他每对相同。
-
每个三元组的机会都与其他三元组相同。
-
等等。
-
-
分层随机样本,在这种样本中,对分层(特定群体)进行随机抽样,这些群体一起构成一个样本。
9.3.1 示例方案 1:概率样本
假设我们有 3 个助教(Alan,Bennett,Celine):我决定按以下方式对其中 2 个进行取样:
-
我以 1.0 的概率选择 A
-
我选择 B 或 C,每个的概率为 0.5。
我们可以在表中列出所有可能的结果及其相应的概率:
| 结果 | 概率 |
|---|---|
| {A, B} | 0.5 |
| {A, C} | 0.5 |
| {B, C} | 0 |
这是一个概率样本(尽管不是很好的样本)。在我的人口中有 3 个人,我知道每个子集的机会。假设我正在测量助教离校园的平均距离。
-
这个方案没有看到整个人口!
-
我使用我取得的单个样本进行估计,这取决于我看到 AB 还是 AC 的机会误差。
-
这个方案对 A 的回应有偏见。
9.3.2 示例方案 2:简单随机样本
考虑以下取样方案:
-
一个班级花名册上按字母顺序列出了 1100 名学生。
-
随机选择名单上的前 10 个学生中的一个(例如学生 8)。
-
要创建你的样本,取那个学生以及其后每 10 个学生(例如学生 8、18、28、38 等)。
这是一个概率样本吗?
是的。对于一个样本[n, n + 10, n + 20, …, n + 1090],其中 1 <= n <= 10,该样本的概率为 1/10。否则,概率为 0。
只有 10 个可能的样本! 每个学生被选中的概率相同吗? 是的。每个学生被选择的概率是 1/10。 这是一个简单随机样本吗? 不是。选择(8, 18)的机会是 1/10;选择(8, 9)的机会是 0。
9.3.3 演示:Barbie v. Oppenheimer
我们正在尝试从伯克利居民中收集一个样本,以预测 Barbie 和 Oppenheimer 中哪一个在它们的开放日 7 月 21 日表现更好。
首先,让我们获取一个数据集,其中包含伯克利的每个居民(这是一个虚假数据集),以及他们实际在 7 月 21 日观看的电影。
让我们加载movie.csv表。我们可以假设:
-
is_male是一个布尔值,表示居民是否认为自己是男性。 -
他们在 7 月 21 日只能观看两部电影:Barbie 和 Oppenheimer。
-
每个居民在 7 月 21 日都会观看一部电影(要么是 Barbie,要么是 Oppenheimer)。
代码
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import seaborn as sns
sns.set_theme(style='darkgrid', font_scale = 1.5,
rc={'figure.figsize':(7,5)})
rng = np.random.default_rng()
movie = pd.read_csv("data/movie.csv")
# create a 1/0 int that indicates Barbie vote
movie['barbie'] = (movie['movie'] == 'Barbie').astype(int)
movie.head()
| age | is_male | movie | barbie | |
|---|---|---|---|---|
| 0 | 35 | False | Barbie | 1 |
| 1 | 42 | True | Oppenheimer | 0 |
| 2 | 55 | False | Barbie | 1 |
| 3 | 77 | True | Oppenheimer | 0 |
| 4 | 31 | False | Barbie | 1 |
伯克利居民中选择 Barbie 的比例是多少?
actual_barbie = np.mean(movie["barbie"])
actual_barbie
0.5302792307692308
这是比赛的实际结果。根据这个结果,Barbie 会获胜。我们的退休人员样本的表现如何?
9.3.3.1 便利样本:退休人员
让我们方便地抽取已经退休的人(年龄>=65 岁)。其中有多少比例的人去看 Barbie 而不是 Oppenheimer?
convenience_sample = movie[movie['age'] >= 65] # take a convenience sample of retirees
np.mean(convenience_sample["barbie"]) # what proportion of them saw Barbie?
0.3744755089093924
根据这个结果,我们本来会预测 Oppenheimer 会获胜!发生了什么?我们的样本可能太小或者太嘈杂了吗?
# what's the size of our sample?
len(convenience_sample)
359396
# what proportion of our data is in the convenience sample?
len(convenience_sample)/len(movie)
0.27645846153846154
看起来我们的样本相当大(大约 360,000 人),所以误差很可能不仅仅是由于偶然性造成的。
9.3.3.2 检查偏差
让我们按年龄汇总所有选择,并可视化按性别分割的 Barbie 观看比例。
votes_by_barbie = movie.groupby(["age","is_male"]).agg("mean", numeric_only=True).reset_index()
votes_by_barbie.head()
| age | is_male | barbie | |
|---|---|---|---|
| 0 | 18 | False | 0.819594 |
| 1 | 18 | True | 0.667001 |
| 2 | 19 | False | 0.812214 |
| 3 | 19 | True | 0.661252 |
| 4 | 20 | False | 0.805281 |
代码
# A common matplotlib/seaborn pattern: create the figure and axes object, pass ax
# to seaborn for drawing into, and later fine-tune the figure via ax.
fig, ax = plt.subplots();
red_blue = ["#bf1518", "#397eb7"]
with sns.color_palette(red_blue):
sns.pointplot(data=votes_by_barbie, x = "age", y = "barbie", hue = "is_male", ax=ax)
new_ticks = [i.get_text() for i in ax.get_xticklabels()]
ax.set_xticks(range(0, len(new_ticks), 10), new_ticks[::10])
ax.set_title("Preferences by Demographics");
-
我们看到退休人员(在伯克利)倾向于观看 Oppenheimer。
-
我们还看到,认为自己不是男性的居民倾向于喜欢 Barbie。
9.3.3.3 简单随机样本
假设我们取了一个与我们的退休人员样本相同大小的简单随机样本(SRS):
n = len(convenience_sample)
random_sample = movie.sample(n, replace = False) ## By default, replace = False
np.mean(random_sample["barbie"])
0.5304483077162795
这与 0.5302792307692308 的实际投票结果非常接近!
事实证明,我们可以用更小的样本量(比如 800)得到类似的结果:
n = 800
random_sample = movie.sample(n, replace = False)
# Compute the sample average and the resulting relative error
sample_barbie = np.mean(random_sample["barbie"])
err = abs(sample_barbie-actual_barbie)/actual_barbie
# We can print output with Markdown formatting too...
from IPython.display import Markdown
Markdown(f"**Actual** = {actual_barbie:.4f}, **Sample** = {sample_barbie:.4f}, "
f"**Err** = {100*err:.2f}%.")
实际 = 0.5303,样本 = 0.5275,误差 = 0.52%。
我们将在本学期后期(重新)学习中心极限定理时学习如何选择这个数字。
9.3.3.4 量化机会误差
在我们的大小为 800 的 SRS 中,我们的机会误差会是多少?
让我们模拟从之前抽取 800 大小的 SRS 的 1000 个版本:
nrep = 1000 # number of simulations
n = 800 # size of our sample
poll_result = []
for i in range(0, nrep):
random_sample = movie.sample(n, replace = False)
poll_result.append(np.mean(random_sample["barbie"]))
代码
fig, ax = plt.subplots()
sns.histplot(poll_result, stat='density', ax=ax)
ax.axvline(actual_barbie, color="orange", lw=4);
这些模拟样本中有多少比例会预测 Barbie?
poll_result = pd.Series(poll_result)
np.sum(poll_result > 0.5)/1000
0.95
你可以看到曲线看起来大致呈高斯/正态分布。使用 KDE:
代码
sns.histplot(poll_result, stat='density', kde=True);
9.4 总结
了解抽样过程是让我们从描述数据转向理解世界的关键。如果不知道/假设数据是如何收集的,样本和总体之间就没有联系。最终,数据集并不能告诉我们关于数据背后世界的情况。
十、建模简介
译者:飞龙
学习成果
-
了解模型是什么,以及如何进行四步建模过程。
-
定义损失概念并熟悉和损失。
-
使用最小化技术拟合简单线性回归模型。**直到本学期为止,我们一直专注于分析数据集。我们已经研究了数据科学生命周期的早期阶段,重点是用于数据分析所需的编程工具、可视化技术和数据清理方法。
这节课标志着关注重点的转变。我们将不再只是检查数据集,而是实际使用我们的数据来更好地理解世界。具体来说,接下来的一系列讲座将探讨预测建模:生成模型以对我们周围的世界进行一些预测。在这节课上,我们将介绍建立建模任务的概念框架。在接下来的几节课中,我们将通过实现各种类型的模型来将这个框架付诸实践。
10.1 什么是模型?
模型是对系统的理想化表示。系统是一组原则或程序,根据这些原则或程序,某事物的运行方式。我们生活在一个充满系统的世界:打开灯的程序是根据一套特定的规则来进行电流流动的。任何事件发生背后的真相通常是复杂的,很多时候具体情况是未知的。世界的运作可以被视为一个巨大的程序。模型试图简化世界,并将其提炼成可操作的部分。
例如:我们将地球上物体的下落建模为受到重力加速度的恒定加速度。
-
虽然这描述了我们系统的行为,但它只是一个近似。
-
它没有考虑空气阻力、地球重力的局部变化等影响。
-
在实践中,足够准确就足够有用!
10.1.1 建立模型的原因
为什么我们想要建立模型?就数据科学家和统计学家而言,有三个原因,每个原因都意味着对建模的不同关注点。
-
解释我们生活中发生的复杂现象。例如:
-
父母的平均身高与子女的平均身高有何关联?
-
物体的速度和加速度如何影响它的行程?(物理学:)
在这些情况下,我们关心创建简单和可解释的模型,使我们能够理解变量之间的关系。
-
-
对未知数据进行准确预测。一些例子包括:
-
我们能否预测一封电子邮件是否是垃圾邮件?
-
我们能否对这篇长达 10 页的文章生成一个一句话的摘要?
在进行预测时,我们更关心做出极其准确的预测,即使以得到一个不可解释的模型为代价。这些有时被称为黑匣子模型,在深度学习等领域很常见。
-
-
衡量一个事件对另一个事件的因果效应。例如,
-
吸烟是否导致肺癌?
-
职业培训计划是否导致就业和工资增加?
这是一个更难的问题,因为大多数统计工具都是设计用来推断关联而不是因果关系。我们不会在 Data 100 中专注于这个任务,但如果你感兴趣,可以参加其他关于因果推断的高级课程(例如 Stat 156,Data 102)!
-
大多数时候,我们的目标是在建立可解释的模型和建立准确模型之间取得平衡。
10.1.2 模型的常见类型
总的来说,模型可以分为两类:
-
确定性物理(机械)模型:控制世界运行方式的法则。
-
开普勒的行星运动第三定律(1619):物体轨道周期的平方与其轨道半长轴的立方的比值对于所有绕同一主体运行的物体都是相同的。
-
牛顿的三大定律:运动和引力(1687):牛顿的第二定律模拟了物体的质量与加速所需的力之间的关系。
-
-
-
概率模型:试图理解随机过程如何演变的模型。这些模型更通用,可以用来描述现实世界中的许多现象。这些模型通常对世界的性质做出简化的假设。
- 泊松过程模型:用于模拟在任何时间点以一定概率发生的随机事件,并且在计数上严格递增,例如顾客到达商店。
注意:这些具体的模型不在 Data 100 的范围内,只是作为动机存在。
10.2 简单线性回归
回归线是最小化所有直线估计的均方误差的唯一直线。与任何直线一样,它可以由斜率和 y-截距定义:
代码
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
# Set random seed for consistency
np.random.seed(43)
plt.style.use('default')
#Generate random noise for plotting
x = np.linspace(-3, 3, 100)
y = x * 0.5 - 1 + np.random.randn(100) * 0.3
#plot regression line
sns.regplot(x=x,y=y);
10.2.1 符号和定义
对于表示我们的数据 的一对变量 和 ,我们将它们的均值/平均值表示为 和 ,标准差表示为 和 。
10.2.1.1 标准单位
如果以下条件成立,则变量以标准单位表示:
-
标准单位中的 0 等于原始变量单位中的均值 ()。
-
1 个标准单位的增加等于原始变量单位中的 1 个标准差 () 的增加。
要将变量 转换为标准单位,我们从其均值中减去它,并将其除以其标准差。例如,标准单位中的 是 。
10.2.1.2 相关性
相关性 () 是以标准单位测量的 和 的乘积的平均值。
-
相关性衡量了两个变量之间的线性关联的强度。
-
相关性在-1 和 1 之间变化:, with 表示完美的线性关联, 表示完美的负相关。 越接近于 , 线性关联越弱。
-
相关性不能说明因果关系和非线性关联。相关性不意味着因果关系。当 时,两个变量是不相关的。然而,它们仍然可以通过一些非线性关系相关。
代码
def plot_and_get_corr(ax, x, y, title):
ax.set_xlim(-3, 3)
ax.set_ylim(-3, 3)
ax.set_xticks([])
ax.set_yticks([])
ax.scatter(x, y, alpha = 0.73)
r = np.corrcoef(x, y)[0, 1]
ax.set_title(title + " (corr: {})".format(r.round(2)))
return r
fig, axs = plt.subplots(2, 2, figsize = (10, 10))
# Just noise
x1, y1 = np.random.randn(2, 100)
corr1 = plot_and_get_corr(axs[0, 0], x1, y1, title = "noise")
# Strong linear
x2 = np.linspace(-3, 3, 100)
y2 = x2 * 0.5 - 1 + np.random.randn(100) * 0.3
corr2 = plot_and_get_corr(axs[0, 1], x2, y2, title = "strong linear")
# Unequal spread
x3 = np.linspace(-3, 3, 100)
y3 = - x3/3 + np.random.randn(100)*(x3)/2.5
corr3 = plot_and_get_corr(axs[1, 0], x3, y3, title = "strong linear")
extent = axs[1, 0].get_window_extent().transformed(fig.dpi_scale_trans.inverted())
# Strong non-linear
x4 = np.linspace(-3, 3, 100)
y4 = 2*np.sin(x3 - 1.5) + np.random.randn(100) * 0.3
corr4 = plot_and_get_corr(axs[1, 1], x4, y4, title = "strong non-linear")
plt.show()
10.2.2 替代形式
当变量 和 以标准单位测量时,用于预测 的回归线具有斜率 并通过原点。
- 在原始单位中,这变为
10.2.3 推导
从顶部开始,我们有我们所要求的回归线的形式,并且我们希望表明它等价于最佳线性回归线:。
回想一下:
-
\hat{b} = r \cdot \frac{\text{y 的标准差}}{\text{x 的标准差}
-
证明:
乘以,并在两边加上。
将系数分配给项
现在我们看到我们有一条符合我们要求的线:
-
斜率:
-
截距:
请注意,第 i 个数据点的误差为:
10.3 建模过程
在高层次上,模型是表示系统的一种方式。在 Data 100 中,我们将把模型视为我们用来描述变量之间关系的一些数学规则。
我们正在对哪些变量进行建模?通常,我们使用我们收集到的样本数据中的变量子集来对该数据中的另一个变量进行建模。更正式地说,假设我们有以下数据集:
每一对值代表一个数据点。在建模环境中,我们称这些为观察。是我们试图对其进行建模的因变量,也称为输出或响应。是输入到模型中进行预测的自变量,也称为特征。
我们建模的目标是使用观察到的数据来预测输出变量。我们将每个预测表示为(读作:“y 帽下标 i”)。
我们如何生成这些预测?在接下来的几堂课中,我们将遇到一些模型的例子如下:
上面的例子被称为参数模型。它们将收集到的数据与我们做出的预测联系起来。一些参数(, , )用于描述和之间的关系。
请注意,我们并不立即知道这些参数的值。虽然特征是从我们观察到的数据中获取的,但我们需要决定给、和什么值。这是参数建模的核心:我们应该选择什么参数值,使我们的模型能够做出最佳的预测?
选择我们的模型参数,我们将通过建模过程来进行。
-
选择模型:我们应该如何表示世界?
-
选择损失函数:我们如何量化预测误差?
-
拟合模型:在给定数据的情况下,我们如何选择模型的最佳参数?
-
评估模型性能:我们如何评估这个过程是否产生了一个好的模型?
10.4 选择模型
我们的第一步是选择一个模型:定义描述特征和预测之间关系的数学规则。
在Data 8中,您学习了简单线性回归(SLR)模型。您学到了该模型的形式:
在 Data 100 中,我们将使用略有不同的符号:我们将用替换,用替换。这将使我们能够在课程后期探索更复杂的模型时使用相同的符号。
SLR 模型的参数是 ,也称为截距项,和 ,也称为斜率项。为了创建一个有效的模型,我们希望选择 和 的值,以最准确地预测输出变量。 “最佳”拟合模型参数被赋予特殊名称: 和 ;它们是允许我们的模型生成最佳可能预测的特定参数值。
在 Data 8 中,您学到了最佳 SLR 模型参数是:
关于符号的快速提醒:
-
和 分别表示 和 的均值
-
和 表示 和 的标准偏差
-
是相关系数,定义为 和 的乘积的平均值,以标准单位测量:
在 Data 100 中,我们想要了解如何推导出这些最佳模型系数。为此,我们将介绍损失函数的概念。
10.5 选择损失函数
我们已经讨论了创建“最佳”预测的想法。这引出了一个问题:我们如何决定我们模型的预测是“好”还是“坏”?
损失函数 描述了特定模型或模型参数选择所产生的成本、误差或拟合。这个函数,,量化了我们模型的单个预测与我们收集的数据中真实观测值之间的“坏”或“偏离”程度。
特定模型的损失函数的选择将影响估计的准确性和计算成本,并且还将取决于手头的估计任务。例如,
-
输出是定量的还是定性的?
-
异常值重要吗?
-
所有错误一样昂贵吗?(例如,癌症测试的假阴性可能比假阳性更危险)
无论使用的具体函数是什么,损失函数应遵循两个基本原则:
-
如果预测 接近 实际值 ,损失应该很低。
-
如果预测 与实际值 相距很远,损失应该很高。
损失函数的两种常见选择是平方损失和绝对损失。
平方损失,也称为L2 损失,计算观测到的 和预测的 之间的差的平方:
绝对损失,也称为L1 损失,计算观测到的 和预测的 之间的绝对差:
L1 和 L2 损失为我们提供了一种工具,用于量化我们模型在单个数据点上的表现。这是一个很好的开始,但是理想情况下,我们希望了解我们的模型在整个数据集上的表现。一个自然的方法是计算数据集中所有数据点的平均损失。这被称为成本函数,:
在统计文献中,成本函数有许多名称。您可能还会遇到以下术语:
-
经验风险(这就是我们给成本函数命名为 的原因)
-
错误函数
-
平均损失
我们可以将我们的 L1 和 L2 损失代入成本函数的定义中。均方误差(MSE) 是数据集中平均平方损失:
平均绝对误差(MAE) 是数据集中平均绝对损失:
10.6 拟合模型
现在我们已经建立了损失函数的概念,我们可以回到选择模型参数的原始目标。具体来说,我们希望选择最佳的模型参数集,以最小化模型在数据集上的成本。这个过程称为拟合模型。
我们知道从微积分中,当一个函数的一阶导数等于零,二阶导数为正时,函数达到最小值。我们经常称被最小化的函数为目标函数(我们的目标是找到它的最小值)。
为了找到最佳的模型参数,我们:
-
对成本函数分别对该参数求导
-
将导数设为 0
-
解出参数
我们对模型中每个参数重复这个过程。现在,我们将忽略二阶导数条件。
为了帮助我们理解这个过程,让我们通过使用均方误差作为成本函数,推导简单线性回归的最优模型参数。记住:尽管符号可能看起来复杂,但我们所做的只是按照上面的三个步骤进行操作!
步骤 1:对成本函数分别对每个模型参数求导。我们将 SLR 模型代入上述 MSE 的定义中,并对和进行微分。
让我们更深入地走一遍这些推导,从对的 MSE 的导数开始。
根据上面的 MSE,我们知道:
注意,求和的导数等于导数的和,这样就变成了:
然后,我们可以应用链式法则。
最后,我们可以简化常数,得到我们的答案。
按照同样的步骤,我们可以对的 MSE 进行求导。
步骤 2:将导数设为 0。简化项后,这产生了两个估计方程。模型参数的最佳集合 必须满足这两个最优性条件。
步骤 3:解估计方程以计算和的估计值。
取第一个方程式给出了的估计值:
通过稍微调整,第二个方程给出了 的估计值。首先将第一个估计方程乘以 ,然后从第二个估计方程中减去结果。
接下来,代入 :
通过使用相关性的定义 和标准差 ,我们可以得出结论:
就像在 Data 8 中给出的那样!
记住,这个推导是在使用 MSE 成本函数时找到了 SLR 的最佳模型参数。如果我们使用了不同的模型或不同的损失函数,我们很可能会找到最佳模型参数的不同值。然而,无论使用什么模型和损失,我们总是可以遵循这三个步骤来拟合模型。