时间序列的平稳性——全面指南
原文:
towardsdatascience.com/stationarity-in-time-series-a-comprehensive-guide-8beabe20d68
如何在 Python 中检查时间序列是否平稳,以及如果非平稳时可以做什么
·发表于Towards Data Science ·8 分钟阅读·2023 年 4 月 11 日
–
时间序列的平稳性(图由作者绘制)
未来更容易建模当它类似于现在时[3]。平稳性描述了时间序列的统计特征随着时间不会发生变化。因此,一些时间序列预测模型,如自回归模型,依赖于时间序列的平稳性。
在本文中,你将学到:
-
什么是平稳性,
-
为什么这很重要,
-
检查平稳性的 3 种方法,以及
-
当时间序列非平稳时可以应用的 3 种技术
什么是平稳性?
平稳性描述了一个概念,即时间序列如何变化将会在未来保持不变[3]。用数学术语来说,当时间序列的统计特性与时间无关时,它就是平稳的[3]:
-
恒定均值,
-
恒定方差,
-
以及协方差与时间无关。
这就是弱平稳性的定义。另一种平稳性是严格平稳性。它意味着相同大小的样本具有相同的分布[5]。由于严格平稳性具有限制性且较为罕见,本文将仅关注弱平稳性。
为什么平稳性很重要?
一些时间序列预测模型(例如自回归模型)需要平稳的时间序列,因为由于其统计特性恒定,它们更易于建模[3]。因此,如果时间序列不平稳,你应该使其平稳(参见当时间序列不平稳时你可以做什么?)。
你如何测试平稳性?
你可以通过两种方式测试时间序列的平稳性:
-
直观方法:视觉评估
-
统计方法:单位根检验
在这一部分,我们将重现 Hyndman 和 Athanasopoulos [3] 用于解释平稳性视觉评估的一些示例,并扩展它们的使用,以解释使用单位根测试进行平稳性检验。数据取自相关的fma
R 包 [1]。
展示平稳性测试的示例时间序列(作者提供的图像,受到 Hyndman 和 Athanasopoulos [3]的高度启发)
如何进行视觉平稳性评估
你可以通过心理上将时间序列分成两半来评估时间序列的平稳性,并比较前半部分与后半部分的均值、幅度和周期长度。
-
常数均值 — 时间序列前半部分的均值应与后半部分相似。
-
常数方差 — 时间序列前半部分的幅度应与后半部分相似。
-
协方差与时间无关 — 时间序列前半部分的周期长度应与后半部分相似。周期应与时间无关(例如,不按周或月等)。
如何进行视觉平稳性测试(作者提供的图像)
对于我们的示例,评估结果如下所示:
在示例时间序列上的视觉平稳性评估(作者提供的图像,受到 Hyndman 和 Athanasopoulos [3]的高度启发)
如何统计性地评估平稳性 — 单位根检验的绕行
单位根是一个被称为“带漂移的随机游走”的随机趋势。由于随机性无法预测,这意味着:
-
单位根存在:非平稳(不可预测)
-
单位根不存在:平稳
要使用单位根检验进行平稳性测试,你需要以两种竞争假设的形式陈述你的初始假设 [6]:
-
原假设(H0)— 例如,时间序列是平稳的(没有单位根)
-
替代假设(H1) — 例如,时间序列是非平稳的(存在单位根)
然后你将根据两种方法来评估是否拒绝原假设:
-
p 值方法:
如果 p 值 > 0.05,则未能拒绝原假设。
如果 p 值 ≤ 0.05,拒绝原假设。
-
临界值方法:
如果检验统计量小于临界值,则未能拒绝原假设。
如果检验统计量比临界值更极端,则拒绝原假设。
当 p 值接近显著水平(例如,约为 0.05)时,应该使用临界值方法 [8]。
有几种单位根检验可以用来检查平稳性。本文将重点介绍最流行的几种:
-
扩展的迪基-福勒检验 [2]
-
Kwiatkowski-Phillips-Schmidt-Shin 检验 [4]。
如何使用扩展的迪基-福勒检验来测试平稳性
扩展的迪基-富勒(ADF)测试的假设为[2]:
-
原假设(H0): 时间序列非平稳,因为存在单位根(如果 p 值 > 0.05)
-
备择假设(H1): 时间序列平稳,因为不存在单位根(如果 p 值 ≤ 0.05)
在 Python 中,我们可以使用statsmodels.tsa.stattools
库中的adfuller
方法[8]。
from statsmodels.tsa.stattools import adfuller
result = adfuller(df["example"].values)
如果我们能拒绝 ADF 测试的原假设,则时间序列是平稳的:
-
如果 p 值(
result[1]
)≤ 0.05 -
如果测试统计量(
result[0]
)比临界值(result[4]["1%"]
、result[4]["5%"]
和result[4]["10%"]
)更极端
使用 stattools Python 库进行 ADF 平稳性测试(图片由作者提供)
以下是样本数据集的 ADF 测试结果:
单位根(ADF 测试)对示例时间序列的平稳性评估(图片由作者提供)
如何使用 Kwiatkowski-Phillips-Schmidt-Shin 测试检验平稳性
Kwiatkowski-Phillips-Schmidt-Shin(KPSS)测试的假设为[4]:
-
原假设(H0): 时间序列平稳,因为不存在单位根(如果 p 值 > 0.05)
-
备择假设(H1): 时间序列非平稳,因为存在单位根(如果 p 值 ≤ 0.05)
这个统计量越大,我们就越可能拒绝原假设(即我们有一个非平稳时间序列)。
在 Python 中,我们可以使用statsmodels.tsa.stattools
库中的kpss
方法[9]。我们必须使用参数regression = 'ct'
来指定测试的原假设是数据是趋势平稳的。[9]
from statsmodels.tsa.stattools import kpss
result = kpss(df["example"].values,
regression = "ct")
如果我们无法拒绝 KPSS 测试的原假设,则时间序列是平稳的:
-
如果 p 值(
result[1]
)> 0.05 -
如果测试统计量(
result[0]
)比临界值(result[3]["1%"]
、result[3]["2.5%"]
、result[3]["5%"]
和result[3]["10%"]
)不那么极端
使用 stattools Python 库进行 KPSS 平稳性测试(图片由作者提供)
以下是样本数据集的 KPSS 测试结果:
单位根(KPSS 测试)对示例时间序列的平稳性评估(图片由作者提供)
当时间序列非平稳时你可以做什么?
你可以对非平稳时间序列应用不同的变换以尝试使其平稳:
-
差分
-
通过模型拟合去趋势
-
对数变换
由于平稳性有几种类型,我们可以结合使用 ADF 和 KPSS 测试来确定需要进行什么变换[7]:
-
如果 ADF 测试结果为平稳而 KPSS 测试结果为非平稳,则时间序列是差分平稳——对时间序列进行差分处理,并再次检查平稳性[7]。
-
如果 ADF 检验结果是非平稳的,而 KPSS 检验结果是平稳的,则时间序列是趋势平稳的——去趋势时间序列并再次检查平稳性 [7]。
差分
差分计算两个连续观察值之间的差值。它使时间序列的均值稳定,从而减少趋势 [3]。
df["example_diff"] = df["example"].diff()
差分后的时间序列(图像作者提供)
如果你想扩展对差分的了解,你应该查看 fractional differencing。
通过模型拟合去趋势
去除非平稳时间序列中的趋势的另一种方法是对数据拟合一个简单模型(例如线性回归),然后对该拟合的残差进行建模。
from sklearn.linear_model import LinearRegression
# Fit model (e.g., linear model)
X = [i for i in range(0, len(airpass_df))]
X = numpy.reshape(X, (len(X), 1))
y = df["example"].values
model = LinearRegression()
model.fit(X, y)
# Calculate trend
trend = model.predict(X)
# Detrend
df["example_detrend"] = df["example"].values - trend
通过模型拟合去趋势时间序列(图像作者提供)
对数转换
对数转换使时间序列的方差稳定 [8]。
df["example_diff"] = np.log(df["example"].value)
对数转换后的时间序列(图像作者提供)
如你所见,模型拟合去趋势以及单独的对数转换都没有使我们的示例时间序列平稳。你还可以结合不同的技术来使时间序列平稳:
通过模型拟合去趋势对数转换后的时间序列(图像作者提供)
摘要
在时间序列预测中,一个具有**恒定统计属性(均值、方差和协方差)**的时间序列,即与时间无关的时间序列,被描述为平稳的。
由于具有恒定的统计特性,平稳时间序列比非平稳时间序列更容易建模。因此,许多时间序列预测模型假设平稳性。
平稳性可以通过视觉评估或统计方法来检查。统计方法检查单位根,这是非平稳性的一个指标。两个最流行的单位根检验是 ADF 和 KPSS。两者都可以在 Python 的stattools
库中找到 [8,9]。
如果时间序列是非平稳的,你可以尝试通过差分、对数转换或去除趋势来使其平稳。
喜欢这个故事吗?
免费订阅 以便在我发布新故事时收到通知。
[## 每当 Leonie Monigatti 发布时收到电子邮件。
每当 Leonie Monigatti 发布时收到电子邮件。通过注册,如果你还没有,你将创建一个 Medium 账户……
medium.com](https://medium.com/@iamleonie/subscribe?source=post_page-----8beabe20d68--------------------------------)
在 LinkedIn、Twitter和 Kaggle上找到我!
数据集
所有数据集均来自 fma R 包。
[1] Hyndman RJ (2023). fma: 取自“预测:方法与应用”由 Makridakis, Wheelwright & Hyndman (1998)编写的数据集。R 包版本 2.5,pkg.robjhyndman.com/fma/
。
许可证: GPL-3 (cran.r-project.org/web/packages/fma/index.html
)
参考文献
[2] Dickey, D. A. 和 Fuller, W. A. (1979). 具有单位根的自回归时间序列估计值的分布。J. Am. Stat. Assoc. 74,427–431。
[3] R. J. Hyndman, & G. Athanasopoulos (2021) 预测:原理与实践,第 3 版,OTexts:墨尔本,澳大利亚。OTexts.com/fpp3。(访问于 2022 年 9 月 26 日)。
[4] Kwiatkowski, D., Phillips, P. C., Schmidt, P., & Shin, Y. (1992). 对单位根的替代理论进行平稳性零假设检验:我们对经济时间序列存在单位根的确定性有多高?《计量经济学杂志》,54(1–3),159–178。
[5] D. C. Montgomery, C. L. Jennings, Murat Kulahci (2015) 《时间序列分析与预测简介》,第 2 版,John Wiley & Sons。
[6] PennState (2023). S.3 假设检验(访问于 2022 年 9 月 26 日)。
[7] statsmodels (2023). 平稳性与去趋势(ADF/KPSS)(访问于 2023 年 3 月 10 日)。
[8] statsmodels (2023). statsmodels.tsa.stattools.adfuller(访问于 2022 年 9 月 26 日)。
[9] statsmodels (2023). statsmodels.tsa.stattools.kpss(访问于 2022 年 9 月 26 日)。
使用重采样的统计实验
自举法与置换检验
·
关注 发表在 Towards Data Science ·14 分钟阅读·2023 年 8 月 2 日
–
图片来自 Mollyroselee 的 Pixabay
引言
大多数从事数据工作的人会进行观察,然后思考这些观察是否具有统计学意义。除非有人接受过正式的统计推断培训,并且有过执行显著性检验的经验,否则首先想到的就是找一位统计学家,寻求如何进行检验的建议,或者至少确认检验是否正确执行以及结果是否有效。
这有很多原因。首先,通常不容易立即明确需要哪种测试,哪些公式支撑测试原理,如何使用这些公式,以及测试是否可以使用,例如,因为数据不满足如正态性等必要条件。对于估计各种统计模型和进行统计测试,有全面的 R 和 Python 包,例如 statsmodels。
尽管如此,如果没有对统计理论的全面理解,使用包通过复制用户指南中的示例,常常会留下持续的不安,担心一旦方法被经验丰富的统计学家审查会受到严厉批评。就个人而言,我是一个随着时间的推移转变为数据分析师的工程师。我在本科和研究生阶段有过统计课程,但我并没有广泛使用统计学,因为这通常不是工程师的工作。我相信许多其他数据分析师和数据科学家也是如此,特别是如果他们的正式培训例如是在工程、计算机科学或化学方面。
我决定写这篇文章,因为我最近意识到模拟可以很容易地替代更经典的基于公式的统计方法。大多数人可能会立即想到自助法来估计均值的不确定性。但这不仅仅是自助法。使用在随机置换测试中进行重复抽样可以为许多统计推断问题提供答案。这类测试通常不难编写和执行。它们普遍适用于连续或二元数据,无论样本大小如何,也不对数据分布做假设。从这个意义上讲,置换测试是非参数的,唯一的要求是可交换性,即观察到某个值序列的概率对于该序列的任何置换都是相同的。这真的不算多要求。
计算资源的缺乏可能是过去基于公式的统计推断测试取得显著进展的原因之一。当时重复抽样数千次包含几十或几千条记录的数据样本是不可行的,但现在已不再不可行。这是否意味着经典的统计推断方法不再需要?当然不是。但能够进行置换测试并确认结果相似,或者帮助理解观察到的差异时哪些假设不成立,这可以令人安心。从头开始运行统计测试而不依赖于包也能带来一定的掌控感。
排列检验当然不是什么新鲜事,但我认为提供一些示例和相应的代码是个好主意。这可以缓解一些数据专家的恐惧,并将基于模拟的统计推断带入他们的日常实践。本文使用排列检验来回答两个问题。还有许多场景可以使用排列检验,对于更复杂的问题,排列检验的设计可能并不显而易见。从这个意义上说,本文并不全面。然而,原则是相同的。理解基础知识将更容易查找权威来源来设计排列检验以回答其他更微妙的商业问题。我的意图是激发一种思维方式,将模拟总体分布作为核心,并利用理论抽样来估计观察到的效应是偶然发生的概率。这就是假设检验的核心。
统计推断始于一个假设,例如,新药对某种疾病的疗效比传统治疗更佳。效果可以通过检查某个血液指标(连续变量)的减少情况,或通过统计接受新药和传统治疗(对照组)后无法检测到疾病的动物数量(离散变量)来测量。这样的两组比较,也称为 A/B 测试,在所有经典统计学教材和流行技术博客中都有广泛讨论,比如这个链接。以药物设计为例,我们将测试新药是否比传统治疗更有效(A/B 测试)。基于此,我们将估计需要多少动物来确认新药比传统治疗有效 1%(或其他效应大小)。虽然这两个问题看似无关,但其实并非如此。我们将重用第一个问题的代码来回答第二个问题。所有代码可以在我的博客仓库中找到。
我欢迎评论,但请保持建设性。我并不假装自己是统计学家,我的意图是帮助他人经历类似的学习过程,特别是在排列检验方面。
A/B 测试
回到第一个问题,即新药是否比传统治疗更有效。当我们进行实验时,生病的动物被分配到两个组中,具体取决于它们接受哪种治疗。动物被随机分配到各组,因此任何观察到的治疗效果差异要么是由于药物的有效性,要么是因为随机分配的结果使得免疫系统较强的动物被分配到了新药组。这两种情况是我们需要解开的。换句话说,我们想要检验随机机会是否能够解释使用新药所观察到的任何好处。
让我们设定一些假设的数字来做个说明:
响应变量是二元的,即治疗是否成功。置换检验在响应变量为连续变量时也能以相同方式工作(这与经典统计检验不同!),但上面的表格会包含均值和标准差,而不是计数。
我们故意不使用相同大小的处理组,因为这不是置换检验的要求。这次假设的 A/B 测试涉及了大量动物,似乎新药物很有前景。新药比传统治疗效果提高了 1.5%。鉴于样本量很大,这看起来很显著。我们会再讨论这个问题。作为人类,我们倾向于将可能不显著的事物视为显著。这就是标准化假设检验如此重要的原因。
“考虑零假设时,假设什么都没有发生,即机会可以解释一切。”
在 A/B 测试中,我们使用一个基线假设,即没有观察到任何特殊情况。这也被称为零假设。进行测试的人通常希望证明零假设不成立,即发现了某种效果。换句话说,替代假设是真实的。证明这一点的一种方法是显示随机机会导致观察到的差异的概率非常低。我们已经开始看到与置换检验的关联。
想象一个程序,其中所有处理的动物被汇总到一个单一的组(2487 + 1785 只动物),然后随机分成两个与原始处理组相同大小的组。对于每只动物,我们知道治疗是否成功,因此我们可以计算每组的治愈动物的百分比。使用观察到的数据,我们确定新药将治愈动物的百分比从 80.34% 提高到 81.79%,即增加了将近 1.5%。如果我们多次重新抽样这两个组,我们会看到新药导致治愈动物的百分比相比于传统治疗的频率是多少?这个“频率”就是统计推断中的普遍 p 值。如果这种情况经常发生,即 p 值大于我们觉得舒适的阈值(通常是 5% 的显著性水平),那么我们在实验中看到的结果可能是由于偶然性,因此零假设未被拒绝。如果这种情况很少发生,那么偶然性无法导致观察到的差异,因此零假设被拒绝(如果你的团队发现了新药,你可以举办一个派对!)。如果你仔细观察,我们实际上用置换来模拟零假设,即两个处理组是等效的。
再次思考零假设是如何被提出的,因为这决定了置换测试的进行方式。在上述例子中,我们想要了解偶然情况使我们相信替代假设(即新药更有效)会发生的频率。这意味着,与替代假设互补的零假设声明新药的效果低于或等于传统治疗。这也被称为单向检验(与双向检验,即双向检验相对)。换一种方式思考。我们不希望被偶然情况误导,认为新药更有效。相反方向的误导并不重要,因为我们无意取代传统治疗。双向检验会导致更高的 p 值,因此更加保守,因为它有更大的机会拒绝零假设。然而,这并不意味着如果这不是正确的检验方式,就应该使用它。
置换检验可以在最一般的情况下表述如下。假设有 Gᵢ, i=1,…,Nᴳ 组,每组的基数为 ∣ Gᵢ ∣, i=1,…,Nᴳ:
-
将所有组中的数据点汇总在一起;这本质上是通过假设没有任何事件发生来模拟零假设。
-
随机将 ∣ G₁ ∣ 个点分配到组 G₁ 中,不进行替换,将 ∣ G₂ ∣ 个点分配到组 G₂ 中,不进行替换,依此类推,直到所有点都已分配完毕。
-
计算在原始样本中计算的感兴趣的统计量,并记录结果。
-
重复上述过程大量次数,并记录每次感兴趣的统计量。
实质上,上述过程构建了一个包含感兴趣统计量的分布。观察到的值至少与观察到的差异一样极端的概率就是 p 值。如果 p 值较大,那么偶然很容易产生观察到的差异,我们尚未有发现(还)。
“将 p 值视为在零假设成立的情况下,观察到的结果极端程度的概率。”
上述公式相当通用。回到我们的例子,我们只有两组,一个是新药组,一个是传统治疗组。执行置换测试的代码如下。
我们进行 10,000 次置换,大约需要 30 秒。在我的机器上,关键问题是:偶然的情况下,新药比传统治疗更有效 1.5% 或更多的频率是多少?我们可以可视化模拟的效果差异的直方图,并计算下方显示的 p 值。
这给出了以下直方图:
新药与传统治疗在效果差异上的频率分布(作者提供的图片)
红色条形图表示新药比传统治疗偶然更有效的情况。这并不显得那么罕见。p 值为 0.1229。假设我们希望以 a=0.05 的显著性水平进行测试,这意味着零假设不能被拒绝。目前没有值得庆祝的事情。如果你组织了庆祝活动,需要取消或推迟。
“将 a 视为假阳性率,即假设零假设成立,我们会在 5% 的时间内得出统计显著差异的结论,如果我们重复进行实验。”
还是有一些乐观的理由。我们刚刚进行的 A/B 测试有两种可能的结果:要么存在效果(在我们的案例中,新药比传统治疗更有效),要么没有足够的证据来得出存在效果的结论。测试并没有得出没有效果的结论。新药仍可能更有效。只是我们目前无法在选择的显著性水平下用现有数据证明这一点。测试实质上保护我们免于假阳性(也称为第一类错误);但可能存在假阴性(也称为第二类错误)。这是团队所希望的。
我们还可以问另一个问题。观察到的差异需要达到多少才能得出新药比传统治疗更有效的结论?显然 1.5%是不够的,但多少才算足够呢?答案可以从生成的直方图中直接获得。我们可以将对应于观察到的差异的垂直线向右“移动”,直到红色条形的尾部占总面积的 5%;换句话说,使用 95%百分位数np.percentile(differences, 95)
,其值为 0.0203 或 2.03%。比我们观察到的 1.5%多一点,虽然不太理想,但也不算太离谱。
使用 0.05 的显著性水平,如果新药治疗效果的增加在区间(-∞, 0.0203]中,我们将不会拒绝原假设。这也被称为置信区间:观察到的统计量值的集合,这些值不会拒绝原假设。由于我们使用了 5%的显著性水平,这就是 95%的置信区间。假设新药没有更高的效率,那么多次进行实验将会在 95%的时间内得到置信区间内的效果差异。这就是置信区间告诉我们的信息。p 值将超过a,当且仅当置信区间包含观察到的效果增加,这意味着原假设不能被拒绝。这两种检查原假设是否可以被拒绝的方法当然是等效的。
以目前测试的动物数量,我们不能拒绝原假设,但我们距离置信区间边界还不远。团队持乐观态度,但我们需要收集更多有力证据以证明新药更有效。但需要多少更多的证据呢?我们将在下一节重新审视这个问题,因为运行重采样模拟也可以帮助我们回答这个问题!
在我们结束这一部分之前,重要的是要注意我们还可以使用经典统计测试来近似 p 值。上面展示的表格也被称为列联表,它提供了两个变量之间的相互关系,并且可以用来确定它们之间是否存在交互作用。可以使用从列联矩阵开始的卡方检验来检查这两个变量的独立性,但需要小心不要运行双侧检验(虽然没有广泛尝试,但 scipy 似乎默认使用双侧检验;这将导致更高的 p 值)。我们也可以使用Fisher 精确的单侧检验,这会得出一个 p 值为 0.124,与通过采样计算的值差异不大。增加置换次数可能会趋向于这个值。在深入了解统计库用户指南之前,了解如何运行置换检验岂不是很棒?
功效估计
由于我们无法证明新药的提高效果在统计上是显著的,因此人们可能会感到失望。新药可能确实更好。我们愿意通过处理更多的动物来进行更多的工作,但我们需要多少动物呢?这就是功效的作用所在。
功效是指在给定样本大小和显著性水平下检测到给定效应量的概率。假设我们期望新药将治疗效果提高 1.5%与传统治疗相比。假设我们已经用每种治疗处理了 3000 只动物,并将显著性水平固定为 0.05,那么检验的功效为 80%。这意味着如果我们重复实验多次,我们会发现 5 次实验中的 4 次我们得出新药比传统治疗更有效的结论。换句话说,假阴性率(Type II 错误)为 20%。上述数字当然是理论上的。重要的是,样本大小、效应量、显著性水平和功效这四个量是相关的,设置其中的任何三个可以计算出第四个。最典型的情况是从其他三个量计算样本大小。这就是我们在本节中要研究的内容。作为简化,我们假设在每个实验中我们用新药和传统治疗处理相同数量的动物。
下面的过程尝试构建一个以样本大小为函数的功效曲线:
-
创建一个合成数据集,其中的动物假设已经接受了传统治疗,以便治疗效果或多或少地符合我们所知道的效果(下面,我将其设置为 0.8034,这与上面的列联矩阵相对应)。
-
创建一个合成数据集,假设动物接受了新药治疗,通过添加我们希望调查的效应大小(如下所示,我将其设置为 0.015 和 0.020,以观察其对结果的影响)。
-
从每个合成数据集中抽取大小为 n_sample 的自助样本(下文我将其设置为 3000、4000、5000、6000 和 7000)。
-
使用我们在上一节中建立的方法进行置换检验,以确定治疗效果的差异是否具有统计学意义。
-
不断生成自助样本并计算治疗效果的差异在多大程度上具有统计学意义;这就是检验的功效。
这当然是一个较长的模拟,因此我们将自助样本的数量限制为 200,而显著性检验中的置换次数也减少到 500,与上一节相比有所减少。
运行这个自助法/置换法模拟大约需要一个小时左右的时间,在普通计算机上可以受益于多进程,这超出了本文的范围。我们可以使用 matplotlib 轻松地可视化结果:
这生成了以下图表:
两种效应大小和 0.05 显著性水平下的样本量与统计功效的关系。图像由作者提供。
我们从中学到了什么?如果我们期望新药的有效性提高 1.5%,那么为了以 80%的把握证明这一点,我们需要治疗超过 7000 只动物。如果效应大小更大,即 2%,我们需要的样本量就会减少,大约 4500 只动物就足够了。这是直观的。检测到大效应比小效应要容易。决定进行这样的大规模实验需要进行成本/收益分析,但至少现在我们知道了证明新药更有效所需的条件。
我们还可以使用 statsmodels 计算所需的样本量:
这将打印:
effect size: 0.015, sample size: 8426.09
effect size: 0.020, sample size: 4690.38
模拟结果似乎一致。在模拟中,我们将样本量增加到 7000,但当效应大小为 1.5%时,样本量不足以达到 0.8 的把握,这一点也通过使用[proportion_effectsize](https://www.statsmodels.org/dev/generated/statsmodels.stats.proportion.proportion_effectsize.html)
函数得到了验证。
结论
希望你喜欢这篇文章。我个人觉得,能够通过简单的自助法和置换法从零开始研究所有这些统计概念是非常充实的。
在我们结束之前,必须提醒注意。这篇文章非常强调 p 值,但 p 值正受到越来越多的批评。事实上,p 值的重要性在历史上被夸大了。p 值表示数据与代表零假设的统计模型或置换检验的不兼容程度。p 值不是替代假设真实的概率。此外,显示零假设可以被拒绝的 p 值并不意味着效应大小很重要。小的效应大小可能在统计上显著,但其效果如此微小,以至于不具实际意义。
参考文献
-
《初级统计学与分析:重抽样视角》,作者:Peter Bruce(Wiley,2014)
-
《数据科学家的实用统计学:使用 R 和 Python 的 50 多个基本概念》,作者:Peter Bruce、Andrew Bruce、Peter Gedeck(O’Reilly,2020)
-
解释 A/B 测试结果:假阳性和统计显著性,Netflix 技术博客
统计独立性入门
原文:
towardsdatascience.com/statistical-independence-for-beginners-69534ce04641
使用 R 和 Excel 函数的直观解释
·发表于Towards Data Science ·5 分钟阅读·2023 年 3 月 21 日
–
图片由Naser Tamimi在Unsplash提供
统计独立性是统计学中的一个基本概念。它构成了许多(有监督的)机器学习算法的基础假设,如 logit 模型和朴素贝叶斯分类器。它也与人工智能中的关键方法紧密相关,如最大熵和神经网络。有关更多见解,请参见这篇文章。
在这篇文章中,我通过直观解释、示例和统计独立性测试资源(R 代码和 Excel 函数)来说明其定义。
Probabilities
为简单起见,考虑两个事件 A 和 B,并定义以下概率:
Prob(A): 事件 A 的(边际)概率
Prob(B): 事件 B 的(边际)概率
Prob(A ∩ B): 事件 A 和 B 的联合概率,即 A 和 B 同时发生的概率;
Prob(A|B): 事件 A 在给定 B 的条件下的条件概率,即在事件 B 已发生的情况下,事件 A 的概率;
Prob(B|A): 事件 B 在给定 A 的条件下的条件概率。
这些概率之间的关系为
由作者创建的图片
如下方维恩图所示,Prob(A|B) 表示事件 A 对事件 B 的贡献比例(黄色区域:A ∩ B),以概率的形式。
由作者创建的图片
例如,
A: 已婚,B: 男性
P(A|B) = 男性中的婚姻概率;
A: 失业,B: 大学毕业生
P(A|B) = 大学毕业生失业的概率
统计独立性
统计独立性有两个等效条件。首先,如果事件 A 和 B 是统计独立的
Prob(A ∩ B) = Prob(A) × Prob(B)
A 和 B 同时发生的概率是概率的乘积。这意味着如果它们同时发生,那纯粹是偶然的,两者之间没有系统性的关联。
其次,如果事件 A 和 B 是统计独立的
Prob(A|B) = Prob(A)。
该条件来源于上述关系:
图片由作者创建
事件 B 的发生条件下的 A 的概率与 A 的概率相同。这意味着,在事件 B 已经发生的情况下,你对事件 A 的了解不会影响事件 A 的概率。
类似地,Prob(B|A) = Prob(B)。
简单的例子
你连续抛两枚(公平的)硬币,每枚硬币显示 H(正面)或 T(反面),Prob(H) = Prob(T) = 0.5。你将会有以下结果:
(H, H), (H, T), (T, H), (T, T)。
例如,
Prob(H ∩ T) = 0.25,这等于
Prob(H) × Prob(T) = 0.5 × 0.5。
即,如果你得到结果(H, T),那纯粹是偶然的,没有系统性的关联。或者,
Prob(T | H) = 0.25 = Prob(T ∩ H)/P(H) = 0.25/0.5 = Prob(T)
如果你从第一枚硬币中得到 H,这对第二枚硬币得到 T 或 H 的概率没有影响。
现实世界的例子
A:已婚,B:男性
Prob(A ∩ B) = Prob(A) × Prob(B);随机选择一个人是男性且已婚,这种联合发生纯粹是偶然的。
Prob(A|B) = Prob(A);男性的婚姻概率与婚姻的概率相同。成为男性对婚姻概率没有影响。
测试独立性:卡方检验
进行了一项调查,以检查个人的婚姻状态与性别之间是否存在任何关联。在 100 名随机选择的个体中,40 名是男性,60 名是女性。其中 75 人已婚,25 人未婚。下表展示了婚姻状态和性别的联合频率。
图片由作者创建
例如,
Prob(Y ∩ M) = 25/100;Prob(M) = 40/100
Prob(Y|M) = Prob(Y ∩ M)/Prob(M) = 25/40
这些频率与统计独立下的预期频率进行比较:
图片由作者创建
在独立性下,预期的联合概率列如上:
例如,
Prob(Y ∩ M) = Prob(Y) × Prob(M) = 75/100 × 40/100 = 0.3;
Prob(Y ∩ F) = Prob(Y) × Prob(F) = 75/100 × 60/100 = 0.45。
实际频率与预期值类似,但它们是否足够接近以证明统计独立性?要检验统计独立性的零假设,我们需要进行独立性检验。
卡方检验广泛用于此目的,它比较实际频率(Oi)与预期频率(Ei)
图片由作者创建
其中 n 是表中单元格的数量,N 是总响应数,pi是独立性下的期望概率(或相对频率)。上述统计量遵循自由度为 df = (行数−1)×(列数−1)的卡方分布,其中行数和列数是表的行数和列数。
以下 R 代码显示了测试结果,包括检验统计量和 p 值。对象table定义为上述实际频率的 2 × 2 矩阵,并输入到函数chisq.test中。在 5%的显著性水平下,性别和婚姻之间的独立性零假设被拒绝,p 值为 0.018,检验统计量为 5.56。选项correct= FALSE与连续性修正有关,在这里没有使用,以与 Excel 函数保持一致。
table=matrix(c(25,50,15,10),nrow=2)
> table
[,1] [,2]
[1,] 25 15
[2,] 50 10
> chisq.test(table,correct = FALSE)
Pearson's Chi-squared test
data: table
X-squared = 5.5556, df = 1, p-value = 0.01842
Excel 函数CHISQ.TEST返回检验的 p 值。该函数要求输入实际范围和期望范围,如下所示:
图像由作者创建
图像由作者创建
统计独立性是统计学、机器学习和人工智能中许多方法和概念的基础。它意味着两个或更多的随机变量没有系统的关联,即
-
它们的联合发生完全是偶然的;或者
-
一些随机变量的发生对其他变量的概率没有影响。
结果是,这些随机变量之间的相关性为零。
作为数据科学家,对这一基本概念有深入的理解非常重要。本文旨在提供统计独立性的直观解释,包括示例和计算资源。
使用 Julia 进行统计绘图:AlgebraOfGraphics.jl
Phyto by Antoine Dautry on Unsplash
如何使用 AlgebraOfGraphics.jl(以及 Makie.jl)包创建统计图表
·
关注 发表在 Towards Data Science · 9 分钟阅读 · 2023 年 4 月 19 日
–
图形语法(GoG)是一个理论概念,是许多流行图形包(如 R 中的 ggplot2 或 Python 中的 ggplot)的基础。在 Julia 生态系统中,甚至有几个基于 GoG 的图形包。因此,用户有选择的余地。因此,我创建了这一系列文章,以比较这些包,从而使选择变得更容易。
我以 GoG 介绍 开始了这一系列,并已介绍了图形包 [Gadfly.jl](http://gadflyjl.org/stable/)
(使用 Julia 进行统计绘图:Gadfly.jl) 和 [VegaLite.jl](https://www.queryverse.org/VegaLite.jl/stable/)
(使用 Julia 进行统计绘图:VegaLite.jl)。
[AlgebraOfGraphics.jl](https://aog.makie.org/stable/)
-package (AoG) 现在是我在这一系列中介绍的基于图形语法(GoG)的 第三 个图形包。
对于本文章中演示 AoG 的示例,我将使用与之前文章中完全相同的数据(数据的详细说明可以在 这里 找到),并尝试创建与之前完全相同的可视化(条形图、散点图、直方图、箱形图和小提琴图),以便对所有包进行 1:1 的比较。我假设用于示例的数据已经准备好,分别为 DataFrames countries
、subregions_cum
和 regions_cum
(如前所述)。
AlgebraOfGraphics
AoG 包可能是到目前为止对 GoG 的最纯粹的实现,正如我们在接下来的示例中将看到的。它建立在坚实的数学概念之上,作者将其描述为“一种用于数据可视化的声明式、问题驱动的语言”。其主要开发者是 Pietro Vertechi。
在技术层面上,它采用了与我们到目前为止看到的包完全不同的方法:Gadfly.jl
是一个完全用 Julia 编写的独立图形包,而 VegaLite.jl
是一个用于 Vega-Lite 图形引擎的 Julia 接口,AoG 则是 [Makie.jl](https://docs.makie.org/stable/)
的附加包。Makie 本身是 Julia 生态系统中最年轻的图形包(也是完全用 Julia 编写的)。
AoG 和 Makie 之间的界限是流动的。AoG 的几个元素使用了 Makie 的属性,并且如果某些方面无法使用 AoG 本身的概念来表达,Makie 总是备用解决方案。
还应注意的是,AoG 仍然在进行中。0.1 版本仅于 2020 年发布。因此,它不如其他更成熟的包完整,某些方面尚未完全实现。
条形图
所以让我们进入第一个可视化图,它分别使用条形图描绘地区(即大陆)和子区域的人口规模。
按地区划分的人口
首先,我们想展示每个地区(即大陆)在 2019 年的人口规模,作为条形图中的一条条形。除此之外,每个“地区条形”应具有不同的颜色。
使用这个简单的例子,我们可以深入了解 AoG 的基本概念:用 GoG 术语来说,这个可视化基于 regions_cum
数据框的数据显示,并包含:
-
将数据属性
Region
映射到 x 轴 -
将数据属性
Pop2019
映射到 y 轴 -
将数据属性
Region
映射到颜色 -
使用“条形”几何体
正如我在 GoG 介绍中所解释的,其理念之一是可以从不同的构建块创建可视化规范,这些块可以根据特定需求组合。AoG 完全实现了这一理念。因此,我们可以直接将 GoG 描述转换为 AoG 元素:
-
regionPop2xy = mapping(:Region, :Pop2019)
是将Region
映射到 x 轴,Pop2019
映射到 y 轴 -
region2color = mapping(color = :Region)
是将Region
映射到颜色的映射 -
barplot = visual(BarPlot)
是“条形”几何体
现在我们可以组合这些构建块(使用操作符 *
),从 regions_cum
中获取数据,并通过调用 draw
创建图表:
draw(data(regions_cum) * regionPop2xy * region2color * barplot)
这会生成以下条形图:
按地区划分的人口(1) [图片由作者提供]
与之前的文章一样,我们还为每个可视化创建了美化版本,添加了标签、标题和漂亮的背景色等。这可以在 AoG 中使用 Makie 参数 axis
和 figure
来 draw
实现:
这将生成以下图表:
按地区划分的人口(2) [图片由作者提供]
按子区域划分的人口
现在,让我们继续可视化按 子区域 划分的人口。这基本上与上述图表相同,但我们使用 subregions_cum
中的数据,而不是 regions_cum
。
所以我们现在的轴映射是 subregionPop2xy = mapping(:Subregion, :Pop2019)
。由于我们希望子区域的条形图按地区着色,我们可以重复使用上面的映射,基本图表可以通过以下方式绘制:
draw(data(subregions_cum) * subregionPop2xy * region2color * barplot)
这将生成以下图表:
按人口划分的子区域(1) [图片由作者提供]
显然,如果我们选择水平条形图,子区域标签会更易读。这可以通过交换映射到轴的数据属性实现:subregionPop2xy_hor = mapping(:Pop2019, :Subregion)
并在 visual
中添加 orientation = :x
。绘制水平版本的条形图的代码是:
draw(data(subregions_cum) * subregionPop2xy_hor * region2color *
visual(BarPlot; direction = :x))
不幸的是,这是一个说明AoG仍在进展中的规格。在渲染过程中一定有一些 bug,因为这个draw
命令的结果如下所示:
按人口划分的子区域(2)[图片来源:作者]
y 轴上的刻度以及条形图的位置不正确,x 轴上的刻度也不是我们想要的。
使用 Makie.jl 按子区域划分的人口
因此,我们把这个问题作为一个机会来切换到Makie.jl
。Makie是一个相当低级的图形包。在我们之前看到的包中自动获得的许多功能,在Makie中需要明确指定。这给程序员提供了很多控制权,但使得规格描述非常冗长。
另一个缺点是,Makie无法处理名义数据。所有名义数据在可视化之前必须转换为数字形式。在我们的例子中,这意味着我们需要将Region
和Subregion
属性的名义数据转换为数字:
-
对于
Subregion
来说,这相对简单,因为这个属性包含唯一值。因此,我们只需使用该数据帧列的索引值,并将其存储在新列subregion_num
中。 -
Region
值不是唯一的。因此,我们首先将其转换为CategoricalArray
,这会隐式地映射到数值。然后,我们可以使用函数levelcode
获得相应的数字,并将其存储在另一个新列region_num
中。
除此之外,我们从ColorSchemes.jl
中选择了一个合适的颜色方案(Set2_8
),以获得美观且易于区分的区域颜色。这个方案如下所示:
颜色方案 Set2_8 [图片来源:作者]
为了进行这些准备,我们需要以下代码:
然后我们将直接创建一个“美化”版的条形图,带有标签等。在Makie中,我们需要一个Figure
作为基础元素,barplot
可以放置在其中。由于Makie无法处理名义数据,我们还需要使用yticks
属性手动指定 y 轴的刻度,如下代码所示,这样可以创建我们的水平条形图:
这段代码比较长,但结果看起来相当令人满意:
按子区域划分的人口(3)[图片来源:作者]
为了获得一个按人口规模排序的条形图版本,我们需要使用sort!(subregions_cum, :Pop2019)
相应地对subregions_cum
中的数据进行排序,然后重新执行上面的代码(包括映射到数字数据)。这将生成如下图表:
按子区域划分的人口(4)[图片来源:作者]
散点图
在这次Makie的插曲之后,我们回到AoG,尝试可视化人口变化如何依赖于人口规模。我们可以使用如下的散点图来实现:
popChangeVsPop = data(countries) *
mapping(:Pop2019, :PopChangePct) *
mapping(color = :Region)
draw(popChangeVsPop)
规格包括将Pop2019
映射到 x 轴,将PopChangePct
映射到 y 轴,以及将Region
映射到颜色(我们本可以在此时重用region2color
,但也可以直接指定映射)。此处可以省略visual
,因为在这种情况下,AoG默认使用点几何图形(Scatter
)。这给我们提供了以下图表:
人口相关的增长率(1) [作者提供的图片]
与之前的文章一样,我们现在通过在 x 轴上使用对数刻度来改进可视化,因为数据相当偏斜。此外,我们通过添加标签、标题等来进行“美化”。所有这些可以通过重用图表规格popChangeVsPop
并通过传递适当的参数给draw
来实现:
这导致了以下图表:
人口相关的增长率(2) [作者提供的图片]
直方图
现在我们切换到直方图,用于描述不同国家之间的人均 GDP 分布。由于AoG提供了所谓的histogram
-analysis,规格非常简单:
draw(data(countries) * mapping(:GDPperCapita) * histogram())
分析在AoG中是可视化之前处理数据的一种方式。通常几何图形(visual
)直接依赖于分析,例如在这个例子中,直方图将自动使用条形几何图形进行显示。
人均 GDP 的分布(1) [作者提供的图片]
直方图的创建可以通过改变箱数(通过参数bins
)和使用不同的normalization
算法来影响。因此,我们通过以下规格得到了改进版本:
这段代码再次展示了AoG如何将可视化的规格(histGDPperCapita
)与其“美化”(在调用draw
时)分离开来,从而生成以下图表:
人均 GDP 的分布(2) [作者提供的图片]
箱线图和小提琴图
最后,我们使用箱线图和小提琴图可视化每个地区的人均 GDP 分布。这可以像之前一样简单实现,因为AoG为这两种图表变体提供了特定的几何图形。
为了最大化元素的重用,我们首先定义数据和分布的映射(distGDPperCapita
),然后添加几何图形(使用visual
)。如所有示例中所示,可以通过在调用draw
时传入适当的参数来添加额外的“美化”。
这段代码创建了以下两个图表:
按地区划分的人均 GDP 分布(1) [作者提供的图片]
按地区划分的人均 GDP 分布(2) [作者提供的图片]
放大
由于两个图中“最有趣”的部分都位于 0 到 100,000 的范围内(在 y 轴上),我们希望将图表限制在该范围内(进行某种缩放)。
在AoG中,这可以通过datalimits
参数应用于visual
来实现。但似乎AoG中存在另一个 bug,因为这个参数只有在用于小提琴图时才有期望的效果,而在应用于箱线图时则没有任何变化。
因此,使用以下规格 …
violinRestricted = distGDPperCapita *
visual(Violin; show_notch = true, datalimits = (0, 100000))
drawDist(violinRestricted)
… 我们得到这个图表:
各地区人均 GDP 分布 (3) [图片由作者提供]
结论
如上所述,AoG包显然是我们在本系列中看到的最纯粹的图形语法实现。它确实将映射、几何等分离成不同的构建模块,然后可以使用*
运算符组合起来。它还清晰地将更多“装饰性”元素(所有我们上面称之为“美化”的东西)与实际可视化分开,从而使规格更加模块化,并提供了更多可以重用的构建块。
我认为,对于这样一个年轻的包来说,仍有一些粗糙之处是很正常的,但它确实有坚实的基础,看起来相当有前景。当然,在这篇文章中无法展示AoG的所有功能。因此,如果你想了解更多,请查看文档。最后但同样重要的是,了解这种方法的基本理念也是值得的,可以在这里找到。
对于那些希望深入研究代码的人,还有一个Pluto notebook,其中包含我在 GitHub 库中展示的所有示例。
统计学 Bootcamp 8:两个均值的故事
原文:
towardsdatascience.com/statistics-bootcamp-8-a-tale-of-two-means-ecec013ae414
统计学 Bootcamp
学习你作为数据科学家每日使用的库背后的数学和方法
·发布于 Towards Data Science ·13 分钟阅读·2023 年 1 月 4 日
–
作者提供的图片
本文是一个更大 Bootcamp 系列的一部分(请参见 kicker 以获取完整列表!)。这一部分致力于学习如何比较两个总体,基于我们对样本均值与总体均值的了解。
我们可能想调查两个总体(或两个样本)在某些方面是否存在差异。例如,在西北大学或芝加哥大学医学院就读的人在年龄上是否存在差异?在这里,我们寻求比较两个均值,而不是在之前的 Bootcamp 中,我们尝试查看样本均值与总体均值之间是否存在差异。
我们将关于年龄和医学生的问题概述如下:
-
population 1 = 所有在 UIC 注册的医学生
population 1 = 所有在西北大学注册的医学生
-
假设(在双尾检验的情况下):
比较两个总体
如果我们想比较两个总体,基于 我们在之前的 Bootcamp 中学到的知识,我们回到了我们钟爱的 z 检验。我们对这个检验的假设是总体彼此独立,两者的标准差已知,样本要么服从正态分布,要么样本量≥30,并且样本是随机的。
我们可以将假设比较表述如下:
对于两个独立的总体,它们各自的均值分别为 xbar_1 和 xbar_2,相关的方差为 σ²₁ 和 σ²₂。
平均差异:
方差:
标准差:
两个总体均值差异的置信区间
扩展计算单变量的置信区间(CIs)(训练营 6),我们取均值的差异(估计值),并将每个总体的标准误差相加:
示例。 一个 USC Trojans 橄榄球队样本的平均体重为 120 公斤,总体方差为 49 公斤。100 名 Notre Dame 的 fighting Irish 的平均体重为 99 公斤,总体方差为 50 公斤。计算均值差异的 95 百分位置信区间。
两样本 z 检验
我们可以使用两样本 z 检验来检验两个总体均值的假设。我们的假设包括:1) 总体彼此独立,2) 总体是大的或正态分布的,3) 简单随机样本(SRS),4) 每个总体的标准差已知。为此,我们将按照以下步骤进行:
-
写出我们的假设陈述,比较均值。H₀: μ1 = μ2 其中我们的备择假设 H₁可以是:μ1 ≠ μ2(双尾),μ1 < μ2(左尾)或μ1 > μ2(右尾)。
-
设定显著性水平,alpha。
-
计算 z 统计量:
为了对这个方程有一些直观的理解,可以将分子(x_1 — x_2)视为观察到的总体差异,而期望的(μ_1 — μ_2)我们用 0 来表示,即没有差异(零假设)。
例如。假设我们正在决定是否去迪士尼乐园还是迪士尼世界度假。我们正在跟踪每个地方的机票价格以决定去哪儿。现在有促销,你可以以 88.42 美元的价格购买到迪士尼乐园的往返票,而迪士尼世界的票价为 80.61 美元。假设这些数字是从 50 个航班选项的两个样本中生成的,标准差分别为 5.62 美元和 4.83 美元。在α = 0.05 时,你能得出存在成本差异的结论吗?
-
设定假设:H₀: μ1 = μ2 H₁: μ1 ≠ μ2
-
α = 0.05
-
对于α = 0.05,我们的对应临界值是± 1.96
-
我们计算得到的 z 分数是:
5. 比较计算得到的 z 值与 z 临界值:7.45 > 1.96
6. 根据比较结果,我们会拒绝零假设
7. 解释我们的发现。有足够的证据表明均值不相等,并且迪士尼乐园与迪士尼世界之间的比率存在差异。
两样本 t 检验
到目前为止,你已经了解到我们可以使用 z 检验来调查两个总体均值之间的差异,当每个总体的方差已知时。如果我们没有关于总体方差的信息,我们会返回使用 t 检验(也称为学生 t 检验)来比较两个均值。
t 检验分为两类:非配对和 配对。当你看到配对与非配对时,在处理总体时将其等同于 独立 和 依赖。配对检验用于考察同一总体在变化前后的情况,或在随机对照试验(RCTs)中配对样本。独立总体是指它们在某个方面被检验,但群体在其他方面彼此独立。非配对 t 检验(简称 t 检验)可以进一步分为两类:合并 t 检验 和 非合并 t 检验。
合并 t 检验 用于总体方差相等或假设相等的情况。非合并 t 检验 用于方差不等或假设不等的情况。我们可以通过较大(sₗ)和较小(sₛ)标准差的平方比来进行(非正式)检查。
如果:
sₗ² / sₛ² < 4 或 sₗ / sₛ < 2:使用合并 t 检验
否则:使用非合并 t 检验
合并 t 检验
在进行合并 t 检验以比较两个总体均值时,我们会有通常的假设:简单随机样本,正常/大样本量,总体/样本独立。但我们还将添加假设,即总体的标准差相等。
-
陈述我们的备择假设和原假设:H₀(μ₁ = μ₂)和 H₁
-
根据我们的假设确定检验是右尾(μ₁ > μ₂)、左尾(μ₁ < μ₂)还是双尾检验(μ₁ ≠ μ₂)
-
确定显著性水平 α
-
计算检验统计量:
其中 sp 为:
并且 n1 和 n2 是每个样本中的实体数量。注意 sp 是一个“合并”标准差,这使得该检验成为合并 t 检验。计算 sp 时,我们根据各自的样本量创建了 σ (sp) 的加权估计。我们可以使用临界值或 p 值方法继续:
5. 临界值为:±t_{α/2}(双尾),-t_{α}(左尾)或 t_{α}(右尾),其中 DOF = n1 + n2–2 = (n1–1) + (n2–1)。可以通过 t 表确定这些值。同样的 t 表也可以估算 p 值。
6. 如果检验统计量落入拒绝区域或 p 值 ≤ α,我们拒绝 H₀,否则我们不能拒绝 H₀。
7. 解释和总结统计检验结果。始终注意,假设检验对于正态总体是精确的,对于非正态但大的总体是近似的。
示例。 一名足球教练想确定电解质液体的消耗是否在他的足球队和田径校队之间有所不同,以升/周(L/week)为单位。随机选取了每队的 10 名运动员。
track:
1.65
3.24
1.87
1.64
2.35
3.39
0.56
1.93
2.21
football:
2.23
2.78
1.89
3.67
1.45
1.28
3.57
2.63
2.78
-
H₀: μ₁ = μ₂ 和 H₁: μ₁ ≠ μ₂(双尾),总体 1:田径,总体 2:足球
-
α = 0.05
-
样本均值和标准差:
4. 合并方差 sp:
5. 检验统计量:
6*. 自由度(DOF):10 + 10 -2 = 18,tcrit:-2.101。由于 -1.89 不小于 -2.101,我们无法拒绝 H0。*
7*. 由于没有足够的证据表明两个人群之间的电解质液体消费存在差异,我们无法拒绝* H₀。
当 σ 相等时的两个均值的置信区间(CI)
当计算两个 独立 样本均值的置信区间且 σ 相等时的假设包括:正态/大样本,均等的总体 σ(标准差),简单随机抽样(SRS)和独立总体。
-
根据 α 选择置信水平,CI = 1 - α
-
确定自由度 = n1 + n2 — 2
-
使用 t 表格,利用自由度(DOF)查找 ±t_{α/2}
-
置信区间的范围由公式确定,形式为(下限,上限):
5. 现在我们可以根据置信区间(CI)进行解释和建议。
非合并 t 检验
非合并 t 检验与合并 t 检验几乎相同。然而,它的不同之处在于假设总体的标准差是 不等的。这最终导致了检验统计量 t 和自由度(DOF)的具体计算差异——通常用 Δ 表示。如果返回浮点值,我们需要向下取整到最近的整数。我们按照上面合并 t 检验中的步骤 1–3,因此我们将跳到步骤 4:
4. 确定自由度(Δ):
5. 确定 t 统计量:
6. 使用 t 表格将 t 统计量与临界值或 p 值进行比较,如假设检验所示:±t_{α/2}(双尾),-t_{α}(左尾)或 t_{α}(右尾)
7. 如果 P ≤ α 或检验统计量落在拒绝区域,拒绝 H0,否则无法拒绝 H0。我们现在可以解释我们的结果,并根据数据提出建议。
当 σ 不相等时的两个均值的置信区间(CI)
当计算两个 独立 样本均值的置信区间且 σ 不相等时的假设包括:正态/大样本,不等的总体 σ(标准差),简单随机抽样(SRS)和独立总体。
-
根据 α 选择置信水平,CI = 1 - α
-
确定自由度(记得向下取整到最近的整数):
3. 使用 t 表格,利用自由度(DOF)查找 ±t_{α/2}
4. 置信区间的范围由公式确定,形式为(下限,上限):
5. 现在我们可以根据置信区间(CI)进行解释和建议。
示例。 一名高中田径教练想知道短跑运动员的鞋钉是否能改善他们的平均时间(减少)。在显著性水平为 0.01 的情况下,有足够的证据得出结论吗?使用鞋钉的运动员与不使用鞋钉的运动员相比,其 100 米平均时间是否减少了?
spikes
11.2
12.1
10.9
11.2
12.1
10.9
11.8
12.1
10.9
11.7
12.5
10.9
12.1
10.6
11.1
no spikes
13.6
14.1
12.3
11.5
15.8
13.6
14.1
12.3
10.5
15.8
13.6
16.2
12.7
10.8
15.8
- 计算每个样本的均值和标准差:
2. s_l/s_s = ~3,这大于 2,因此我们可以假设方差不相等,然后进行非合并 t 检验。
3. H₀:μ₁ = μ₂ 和 H₁:μ₁ < μ₂(左尾),种群 1:有鞋钉,种群 2:无鞋钉
4. α = 0.01
5. 计算 t 统计量:
6. 自由度:
7. t_{df,α} 的临界值 = t_{18,0.01} = 2.552。我们需要将其转换为负值(-2.552),因为标准 t 表不总是提供方向性。与我们计算出的 -4.20 相比,我们可以看到它落在我们假设检验的拒绝区域。
8. 我们拒绝 H₀,并得出结论:样本数据中有足够的证据表明,使用鞋钉的 100 米短跑运动员的时间减少了。
配对样本检验
在配对假设检验中,我们希望控制个体差异对结果测量的影响。这通常表现为对个体进行结果测量,实施干预,然后再次对个体进行结果测量。不同的是,我们将其扩展到许多人,并进行汇总,以查看是否存在总体效益。例如,学生在睡眠 5 小时与 8 小时后在数学测试中的表现是否有所不同?将其概括,我们称之为重复测量、匹配设计。随机对照试验(RCTs)尝试做同样的事情,只是他们必须找到与接受治疗(或没有治疗)的人相似的患者。这两个例子不再代表两个独立的样本。
配对 t 检验
配对 t 检验用于比较配对样本中的两个均值。假设与我们的独立 t 检验相同——样本是随机获得的,并且要么是大样本,要么是正态分布的。然而,我们不再假设样本彼此独立。
我们的假设如下:简单随机样本(SRS)和正态/大样本。
-
陈述我们的备择假设和原假设:H₀(μ₁ = μ₂)和 H₁
-
根据我们的假设,确定检验是否为右尾(μ₁ > μ₂)、左尾(μ₁ < μ₂)或双尾检验(μ₁ ≠ μ₂)
-
确定显著性水平 α
-
计算样本中每个实例的差异(例如,前后对比)
-
计算检验统计量:
其中 d_bar 是差异的均值,s_d 是差异的标准差,n 是样本量。
5. 临界值为:±t_{α/2}(双尾),-t_{α}(左尾)或 t_{α}(右尾),自由度 DOF = n-1。使用 t 表可以确定这些值。相同的 t 表也可以估算 p 值。
6. 如果检验统计量落在拒绝区域内或 p 值 ≤ α,我们拒绝 H₀,否则我们不能拒绝 H₀。
7. 解释和总结统计检验的结果。始终注意,假设检验对于正态分布的人群是准确的,对于非正态但样本量大的群体则是近似的。
例如。一位医生声称某种药物能帮助超重患者减轻体重。一个样本中 10 名患者在开始治疗前和 1 个月后称重。这些数据是否支持医生在 p 值为 0.05 时的声明?
-
陈述假设:H₀: μ2 = μ1 H₁: μ2 < μ1。这构成了一个左侧检验
-
alpha = 0.05
-
确定配对数据的平均差异(治疗后 - 治疗前)
4. 确定配对差异的标准差(此处 n=10)
5. 计算 t 统计量,我们得到:
6. 使用我们的 t 表,我们需要根据我们的自由度(DOF = n-1)和 alpha = 0.05 确定临界值。在这里,我们的 DOF = 10–1 = 9。t_crit = -1.833
7. 因为 -3.06 < -1.833,我们拒绝 H₀
8. 我们的结果是我们有足够的证据支持该减重药物导致统计学上显著的净体重减少的声明。
配对 t 区间计算
如果我们希望确定配对样本均值的置信区间(CI),µ1 和 µ2。请记住,对于差异不正态分布的大样本,置信区间计算只是近似的。我们计算 t 区间的假设是样本大/差异正态分布且样本是简单随机样本(SRS)。
-
确定置信水平 alpha
-
确定 DOF=n-1
-
使用 t 表查找 t_{α/2}
-
µ1 — µ2 的置信区间边界计算为:
5. 我们现在可以解释我们的置信区间,并从中得出结论。
总结
在这次训练营中,我们详细讲解了 t 检验。具体来说,我们讨论了何时使用配对 t 检验和非配对 t 检验。阅读本文后,你应该能够识别数据违反独立性假设的情景,并且对于那些保持独立的数据,如何进行必要的计算。我们还探讨了独立 t 检验中的子类别——即合并和非合并检验,因此请始终记得检查你的标准差。每当我们从数据中进行推断时,始终重要的是承认我们在进行分析时所做的假设。
除非另有说明,所有图片均由作者创作。
此外,如果你喜欢看到类似的文章,并且希望无限制访问我的文章以及 Medium 提供的所有文章,请考虑使用下面的推荐链接进行注册。会员费用为每月 5 美元(USD);我会获得一小部分佣金,这反过来有助于提供更多的内容和文章!
[## 使用我的推荐链接加入 Medium — Adrienne Kline
阅读 Adrienne Kline(以及 Medium 上的成千上万其他作家的)每一篇文章。你的会员费用将直接支持…
medium.com](https://medium.com/@askline1/membership?source=post_page-----ecec013ae414--------------------------------)
稳定航向:导航 LLM 应用程序评估
为何评估 LLM 应用程序至关重要及如何入门
·
关注 发表在 Towards Data Science ·10 分钟阅读·2023 年 11 月 9 日
–
一位膝盖受伤的海盗向他基于 LLM 的急救助手寻求建议。图像由作者使用 DALL·E 3 生成。
简介
大型语言模型(LLMs)引起了广泛关注,许多人将其融入到他们的应用程序中。例如,回答关系数据库问题的聊天机器人、帮助程序员更高效编写代码的助手,以及代表你采取行动的副驾驶。LLMs 的强大能力使你能够快速取得项目的初步成功。然而,随着你从原型过渡到成熟的 LLM 应用程序,一个强大的评估框架变得至关重要。这样的评估框架帮助你的 LLM 应用程序达到最佳性能,并确保一致和可靠的结果。在本博客文章中,我们将讨论:
-
评估 LLM 与基于 LLM 的应用程序之间的差异
-
LLM 应用评估的重要性
-
LLM 应用评估的挑战
-
入门
a. 收集数据和构建测试集
b. 绩效衡量
-
LLM 应用评估框架
通过虚构的例子“FirstAidMatey”,一个为海盗提供急救的助手,我们将深入探讨评估技术、挑战和策略的海洋。最后我们将总结关键要点和洞察。让我们开始这段启发性的旅程吧!
评估 LLM 与基于 LLM 的应用程序
对 OpenAI 的 GPT-4、Google 的 PaLM 2 和 Anthropic 的 Claude 等个体大型语言模型(LLMs)的评估通常通过基准测试如 MMLU 来进行。然而,在本博客文章中,我们感兴趣的是评估基于 LLM 的应用程序。这些应用程序由 LLM 提供支持,并包含其他组件,如管理 LLM 调用序列的编排框架。通常,检索增强生成(RAG)用于向 LLM 提供上下文,避免幻觉。简而言之,RAG 需要将上下文文档嵌入到向量存储中,以便从中检索相关片段并与 LLM 共享。与 LLM 相比,基于 LLM 的应用程序(或 LLM 应用)旨在非常好地执行一个或多个特定任务。找到合适的设置通常涉及一些实验和迭代改进。例如,RAG 可以通过多种方式实现。本文讨论的评估框架可以帮助你找到适合你用例的最佳设置。
在基于 LLM 的应用程序中使用 LLM 可以使其更强大。
FirstAidMatey 是一个基于 LLM 的应用,帮助海盗处理像*“我的手被绳子缠住,现在肿了,我该怎么办,伙计?”*这样的问题。最简单的形式是 Orchestrator 由一个单一的提示组成,将用户问题传递给 LLM,并要求其提供有帮助的回答。它还可以指示 LLM 用海盗语言回答,以便更好地理解。作为扩展,可以添加一个包含急救文档的向量存储。根据用户问题,可以检索相关文档并将其包含在提示中,以便 LLM 可以提供更准确的答案。
LLM 应用评估的重要性
在深入了解如何评估之前,让我们先看看为什么你应该建立一个评估 LLM 应用的系统。主要目标有三点:
-
一致性:确保 LLM 应用在所有场景下的输出稳定可靠,并在出现回归时发现。例如,当你在特定场景下改善 LLM 应用表现时,你希望在可能影响其他场景的性能时收到警告。当使用像 OpenAI 的 GPT-4 这样的专有模型时,你还需遵循其更新计划。随着新版本的发布,你当前的版本可能会逐渐被弃用。研究表明,切换到更新的 GPT 版本并不总是更好。因此,能够评估新版本如何影响 LLM 应用的表现是很重要的。
-
洞察:了解 LLM 应用表现良好的地方和需要改进的地方。
-
基准测试:建立 LLM 应用的性能标准,衡量实验的效果,并自信地发布新版本。
结果是,你将实现以下成果:
-
赢得 用户信任和满意度,因为你的 LLM 应用将表现一致。
-
提升利益相关者信心,因为你可以展示 LLM 应用的表现如何,以及新版本如何改进旧版本。
-
提升你的竞争优势,因为你可以快速迭代、进行改进并自信地部署新版本。
LLM 应用评估的挑战
阅读了上述好处后,很明显为什么采用基于 LLM 的应用可能是有利的。但在此之前,我们必须解决以下两个主要挑战:
-
缺乏标记数据:与传统机器学习应用不同,基于 LLM 的应用不需要标记数据即可开始。LLM 可以开箱即用地执行许多任务(如文本分类、摘要、生成等),无需展示具体示例。这很棒,因为我们不必等待数据和标签,但另一方面,这也意味着我们没有数据来检查应用的表现。
-
多个有效答案:在 LLM 应用中,相同的输入通常可以有多个正确答案。例如,聊天机器人可能会提供多个意义相近的回答,或者代码可能会生成具有相同功能但结构不同的版本。
为了应对这些挑战,我们必须定义合适的数据和指标。我们将在下一节中进行说明。
开始
收集数据并构建测试集
对于评估基于 LLM 的应用,我们使用一个由每个包含特定输入和目标的测试用例组成的测试集。这些测试用例的内容取决于应用的目的。例如,代码生成应用期望将口头指令作为输入,并返回代码。评估期间,将把输入提供给 LLM 应用,生成的输出可以与参考目标进行比较。以下是 FirstAidMatey 的一些测试用例:
一些用于我们急救聊天机器人应用的测试用例。
在这个例子中,每个测试用例包含一个问题作为输入和一个正确的参考答案作为目标。除此之外,历史响应,甚至历史用户反馈也可以添加到测试用例中。这允许你检查较新的回答是否比旧的回答有所改进,以及用户反馈是否得到处理。理想情况下,你的测试集应包括经过验证的参考答案,但如果你希望快速比较新旧模型,使用历史响应和反馈也是一个选项。
由于你通常在没有数据集的情况下开始开发基于 LLM 的应用,因此早期开始构建测试集非常重要。你可以通过添加当前模型失败的那些示例来进行迭代。最初,将是开发人员最频繁地尝试 LLM 应用,并且是他们根据手动测试添加第一个测试用例。然而,尽早涉及业务或最终用户也很重要,因为他们对相关测试用例有更好的理解。为了启动测试集,你也可以使用 LLM 根据你的知识库等生成输入-目标对。随着时间的推移,测试集应该涵盖对最终用户最重要的所有主题。因此,收集用户反馈并为表现不佳和被低估的主题添加测试用例是很重要的。
评估性能
给定一组测试用例后,我们现在可以将输入传递给 LLM 应用,并将生成的响应与目标进行比较。由于每个输入没有单一的正确答案,我们不能字面上地将响应与参考答案进行比较。响应的措辞可能不同,但意义与参考答案相同。不过,我们可以做的是 评估响应的几个属性,作为响应质量的代理。测试的相关属性取决于应用程序和可用数据。以下是 FirstAidMatey 响应的属性列表,以及如何将其转化为指标:
-
事实一致性:使用 LLM 来评估生成的答案是否与参考答案在事实上一致。
-
海盗性:使用 LLM 来评估答案是否用海盗语言书写。
-
语义相似性:计算生成答案与参考答案的嵌入之间的余弦相似度。请注意,这比事实一致性计算要便宜得多,但可能与正确答案的相关性不那么高。
-
冗长性:将生成答案的长度除以参考答案的长度。冗长性越高,LLM 应用的表现越啰嗦,这可能不是应用的意图。
-
延迟:测量 LLM 应用生成响应所需的时间。这使你能够在更准确但较慢的配置之间做出权衡。
根据使用案例,你可能会有更多/不同的属性。例如,对于一个代码生成的 LLM 应用,一个额外的属性可能是生成代码的语法正确性,这可以通过将代码发送给编译器来测量。下图说明了如何通过使用 LLM 来评估一个属性。
通过另一个 LLM 调用评估事实一致性的示意图。
一旦所有测试的属性都被评估完成,可以计算出每个指标的平均分数并与基准/目标性能进行比较。当你尝试不同的配置时,例如 RAG,测试分数会指向最有利的候选项。正确性、冗长性和延迟之间的权衡也会变得清晰。此外,除了指标分数,失败的案例还可以提供有用的改进见解。仔细查看一些失败的测试,它们可能会为进一步改善你的 LLM 应用提供有用的见解。
你可能会想,“如果 LLM 不能正确回答问题,我们怎么能相信它来评估这个答案?难道不会对它自己的输出有偏见吗?” 的确,这听起来有些违背直觉,但这里的主要观点是评估比生成更容易。可以考虑创作与评估画作的类比。当创作一幅画时,你需要同时考虑多个属性,如构图、颜色、视角、光影、质感、预期信息等。而评估一幅画则可以逐一关注每个属性;评价一幅完成的作品比从头开始创作一幅画要简单。LLM 也是一样:尽管生成一个恰当的响应可能具有挑战性,但批判性地评估现有的响应则更加直接。如果有参考响应,比如对于事实一致性属性,评估会变得更可行。
LLM 应用评估框架
让我们在最后一部分中将所有内容结合起来。下图展示了评估框架的概述,并说明了一个重要的反馈循环:
-
LLM 应用、属性和测试用例会传递给评估器,评估器会循环遍历所有测试用例,并将测试输入传递给 LLM 应用。然后,通过遍历属性并收集结果作为指标来评估生成的输出。
-
评估结果被存储以供进一步分析。除了指标外,跟踪 LLM 应用的配置(即使用的 LLM 和参数、使用的 RAG 组件和参数、系统提示等)也很重要,这样你可以轻松区分最有前景的实验,并获得进一步改进应用的洞见。你可以将评估结果和 LLM 应用配置存储在自己的数据库中,或者使用像MLflow这样的工具,它能让你立即访问用户友好的界面。
-
一旦你对性能感到满意,你可以发布新版本的应用,无论是面向内部用户还是外部用户。
-
在项目的早期阶段,将由开发者进行测试和收集反馈。随后,可以从最终用户那里收集反馈,无论是直接的(如点赞/点踩和书面反馈)还是间接的(如对话回合、会话时长、接受的代码建议等)。
-
通过分析收到的反馈来扩展测试集,并添加测试用例以涵盖当前模型处理不充分的情况。
-
在收到的反馈中发现趋势,并将其转化为LLM 应用改进。根据情况,你可以改进协调器(例如,创建一个单独 LLM 调用的链而不是一个单一提示)、检索过程(例如,改进嵌入)或 LLM(例如,改变模型、参数或考虑微调)。
LLM 基础应用的评估框架概述。
关于步骤 1 和 2 的示例,请查看以下 Jupyter notebook。该 notebook 说明了本文博客中解释的概念。你可以看到如何定义和发送属性、测试用例以及 LLM 应用程序版本给 Evaluator。除了打印评估结果外,这些结果还会被记录到 MLflow 仪表板中以便进一步分析。绝对值得一看,这将使讨论的话题更加具体。
结论
对 LLM 基础应用进行评估是 LLM 应用程序开发的重要部分。本文介绍的评估框架简化了开发过程中实验的比较,确保了一致的性能,并提供了进一步改进的见解。
我们遇到的第一个挑战是缺乏标记数据,可以通过尽早构建测试集并通过添加困难和代表性不足的案例来逐步扩展解决。第二个挑战是存在多个正确答案这一事实,可以通过查看生成输出的不同属性来克服。其中一些属性可以通过简单的公式或规则来衡量,而其他属性则可以通过 LLM 来评估。
最后,我们发现了一个关键的反馈循环,即评估结果和收集的用户反馈推动 LLM 应用程序的性能提升。总之,系统化的评估是指引你的 LLM 应用程序走向成功的指南针!
作者注:本文的灵感源于我在 Radix 担任解决方案架构师的经验。Radix 是一家比利时人工智能公司,专注于开发创新的机器学习解决方案和应用程序,服务于各种行业。如果你对 LLM 基础应用感兴趣,我鼓励你访问 radix.ai 或直接通过 LinkedIn与我联系。
除非另有说明,否则所有图片均为作者提供。
步骤基础:文本分类器
构建一个监督学习文本分类器的指导手册和流程图(Python)
·
关注 发表于 Towards Data Science ·10 分钟阅读·2023 年 2 月 17 日
–
图片由 Patrick Tomasso 提供,来源于 Unsplash
说到重点,构建文本分类器和理解自然语言处理 (NLP) 的世界涉及很多步骤。这些步骤必须按特定顺序实施。如果数据中的目标类不平衡,还需要更多步骤。从头学习这一切可能有些困难。尽管网上有许多学习资源,但找到一个全面的高水平指南却不易。因此,我写这篇文章,希望能通过一个 10 步简单指南来提供一些过程透明度。
我将从提供一个我整理的流程图开始,其中包含了从明确任务到部署训练好的文本分类器的所有必要步骤和关键点。
首先,什么是文本分类器?
文本分类器是一种算法,它通过学习单词的出现或模式来预测某种目标或结果,通常是一个类别,比如判断一封邮件是否是垃圾邮件。
在这里需要提到的是,我将专注于使用监督学习方法来构建文本分类器。另一种方法是使用深度学习方法,如神经网络。
让我们来看看那个流程图。
作者提供的图表
信息量很大。让我们将其分解成小块,逐步讲解每个部分。
1. 明确任务
这是任何数据科学项目中最重要的步骤之一。确保你完全理解所提出的问题。你是否有相关数据来回答这个问题?你的方法是否与利益相关者的期望一致?如果需要利益相关者的认可,不要去构建一个复杂难懂的模型。从简单的开始,让所有人都参与到这个过程中来。
2. 数据质量检查
任何项目中的另一个关键步骤。你的模型的好坏取决于输入的数据,因此确保删除重复数据并妥善处理缺失值。
3. 探索性数据分析 (EDA)
现在我们可以进入一些文本数据特定的分析。EDA(探索性数据分析)主要是理解数据,感受从中可以得出的信息。这个步骤的一个关键点是理解目标类分布。你可以使用 pandas 的 .value_counts() 方法或绘制条形图来可视化数据集中每个类的分布。你将能够看到哪些是主要类和次要类。
二分类标记数据集的不平衡类分布
模型在处理不平衡数据时表现不好。模型往往会忽略少数类别,因为数据量不足以训练模型检测这些类别。不过,如果你发现自己有一个高度倾斜的目标类别的不平衡数据集,这其实并不是世界末日。这在实际上是非常正常的。只要在模型构建过程开始之前知道这一点,以便在后续可以进行调整,就很重要。
不平衡数据集的存在也应该让你思考应使用哪些指标来评估模型性能。在这种情况下,‘准确率’(正确预测的比例)真的不是你的朋友。假设你有一个二分类目标类的数据集,其中 80%的数据标记为‘红色’,20%的数据标记为‘蓝色’。你的模型可以简单地对整个测试集预测‘红色’,并且仍然保持 80%的准确率。因此,模型的准确率可能具有误导性,因为你的模型可能只会预测多数类。
一些更好的指标包括召回率(正确预测的真正例比例)、精准率(正确预测的正例比例)或这两者的平均值,即F1 分数。在模型构建阶段,要特别关注这些指标,尤其是少数类的指标。你会希望提升这些得分。
4. 文本预处理
现在进入一些有趣的内容!文本数据中可能包含大量对任何机器学习模型都不实用的内容(这取决于任务的性质)。这个过程实际上是为了去除数据集中的“噪声”,使单词同质化,并将其简化到最基本的状态,以便仅保留有用的单词和最终的特征。
通常,你会希望去除标点符号、特殊字符、停用词(如‘this’,‘the’,‘and’),并将每个单词还原到其词根或词干。你可以尝试编写自己的函数,了解数据中的内容,然后进行清洗。例如,考虑下面的函数:
# exploring patterns in the text to assess how best to cleanse the data
pat_list = [r'\d', '-', '\+', ':', '!', '\?', '\.', '\\n'] # list of special characters/punctuation to search for in data
def punc_search(df, col, pat):
"""
function that counts the number of narratives
that contain a pre-defined list of special
characters and punctuation
"""
for p in pat:
v = df[col].str.contains(p).sum() # total n_rows that contain the pattern
print(f'{p} special character is present in {v} entries')
punc_search(df, 'text', pat_list)
# the output will look something like this:
"""
\d special character is present in 12846 entries
- special character is present in 3141 entries
\+ special character is present in 71 entries
: special character is present in 1874 entries
! special character is present in 117 entries
\? special character is present in 53 entries
\. special character is present in 16962 entries
\n special character is present in 7567 entries
"""
当你对需要从数据中去除的内容有了更好的了解后,可以尝试编写一个函数,一次性完成所有操作:
lemmatizer = WordNetLemmatizer() # initiating lemmatiser object
def text_cleanse(df, col):
"""
cleanses text by removing special
characters and lemmatizing each
word
"""
df[col] = df[col].str.lower() # convert text to lowercase
df[col] = df[col].str.replace(r'-','', regex=True) # replace hyphens with '' to join hyphenated words together
df[col] = df[col].str.replace(r'\d','', regex=True) # replace numbers with ''
df[col] = df[col].str.replace(r'\\n','', regex=True) # replace new line symbol with ''
df[col] = df[col].str.replace(r'\W','', regex=True) # remove special characters
df[col] = df[col].str.replace(r'\s+[a-zA-Z]\s+',' ', regex=True) # remove single characters
df[col] = df.apply(lambda x: nltk.word_tokenize(x[col]), axis=1) # tokenise text ready for lemmatisation
df[col] = df[col].apply(lambda x:[lemmatizer.lemmatize(word, 'v') for word in x]) # lemmatise words, use 'v' argument to lemmatise versbs (e.g. turns past participle of a verb to present tense)
df[col] = df[col].apply(lambda x : " ".join(x)) # de-tokenise text ready for vectorisation
然后你可以在清洗后的数据上再次运行第一个函数,以检查所有你想要去除的内容是否确实被去除了。
对于那些注意到上述函数没有去除任何停用词的人,观察得很好。在向量化过程中的几步操作中,你可以去除停用词。
5. 训练-测试拆分
这个步骤有自己的子标题,因为在开始调整特征之前执行这个步骤非常重要。使用 sklearn 的 train_test_split()函数拆分数据,然后保持测试数据不变,以避免数据泄漏的风险。
如果你的数据不平衡,有一些可选参数(‘shuffle’ 和 ‘stratify’),你可以在测试训练拆分时指定,以确保目标类别之间的均匀分配。这确保了你的少数类别不会全部集中在训练集或测试集中。
# create train and test data split
X_train, X_test, y_train, y_test = train_test_split(df['text'], # features
df['target'], # target
test_size=0.3, # 70% train 30% test
random_state=42, # ensures same split each time to allow repeatability
shuffle = True, # shuffles data prior to splitting
stratify = df['target']) # distribution of classes across train and test
6. 文本向量化
模型无法解释词语。相反,词语必须通过一种称为向量化的过程转换为数字。向量化有两种方法:词袋模型和词嵌入。词袋模型寻找文本之间词语的精确匹配,而词嵌入方法考虑词语的上下文,因此可以在文本之间寻找相似的词。比较这两种方法的有趣文章可以在这里找到。
对于词袋模型,句子会被分词,每个唯一的词成为一个特征。数据集中每个唯一的词将对应一个特征,每个特征会有一个整数值,这个整数值取决于该词在文本中出现的次数(词频向量 — sklearn 的 CountVectorizer())或者一个加权整数,表示该词在文本中的重要性(TF-IDF 向量 — sklearn 的 TfidVectorizer())。有关 TF-IDF 向量化的有用文章可以在这里找到。
确保在训练数据上训练向量化对象,然后使用它来转换测试数据。
7. 模型选择
尝试几种分类模型,看看哪一种在你的数据上表现最好。然后,你可以使用性能指标选择最合适的模型进行优化。我通过运行一个 for 循环,使用 cross_validate() 函数对每个模型进行迭代来完成这个任务。
# defining models and associated parameters
models = [RandomForestClassifier(n_estimators = 100, max_depth=5, random_state=42),
LinearSVC(random_state=42),
MultinomialNB(),
LogisticRegression(random_state=42)]
kf = StratifiedKFold(n_splits=5, shuffle=True, random_state=1) # With StratifiedKFold, the folds are made by preserving the percentage of samples for each class.
scoring = ['accuracy', 'f1_macro', 'recall_macro', 'precision_macro']
# iterative loop print metrics from each model
for model in tqdm(models):
model_name = model.__class__.__name__
result = cross_validate(model, X_train_vector, y_train, cv=kf, scoring=scoring)
print("%s: Mean Accuracy = %.2f%%; Mean F1-macro = %.2f%%; Mean recall-macro = %.2f%%; Mean precision-macro = %.2f%%"
% (model_name,
result['test_accuracy'].mean()*100,
result['test_f1_macro'].mean()*100,
result['test_recall_macro'].mean()*100,
result['test_precision_macro'].mean()*100))
8. 基线模型
在你过于热衷于调整所选模型的超参数以提高性能指标之前,停下。记录下你模型的表现,然后再开始优化。只有通过与基线得分进行比较,你才能知道(并证明)你的模型是否有所改进。如果你需要向利益相关者展示你的方法,这也有助于你获得他们的认可和讲述故事。
创建一个空的 DataFrame,然后在每次模型迭代后,附加你选择的指标以及迭代的编号或名称,以便你可以清楚地看到模型在优化尝试中的进展。
9. 模型调整 — 纠正数据不平衡
通常,微调你的模型可能涉及调整其超参数和特征工程,以提高模型的预测能力。然而,在这一部分中,我将重点关注用于减少类别不平衡影响的技术。
除了为少数类收集更多数据外,还有 5 种方法(我所知道的)可以用来解决类别不平衡问题。大多数方法是一种特征工程,目的是通过过采样少数类或欠采样多数类来平衡整体类别分布。
我们来快速看一下每种方法:
- 添加少数类惩罚
分类算法有一个参数,通常称为‘class_weight’,你可以在训练模型时指定。这本质上是一个惩罚函数,如果少数类被错误分类,将给予更高的惩罚以防止误分类。你可以选择自动参数,也可以根据类别手动分配惩罚。请务必阅读你正在使用的算法的文档。
2. 过采样少数类
随机过采样涉及随机复制少数类样本,并将其添加到训练数据集中以创建均匀的类分布。此方法可能导致过拟合,因为没有生成新的数据点,因此请务必检查这一点。
python 库 imblearn 包含用于过采样和欠采样数据的函数。重要的是要知道,任何过采样或欠采样技术仅应用于训练数据。
如果你使用交叉验证方法来将数据拟合到模型中,你需要使用管道以确保仅对训练折进行过采样。Pipeline() 函数可以从 imblearn 库中导入。
over_pipe = Pipeline([('RandomOverSample', RandomOverSampler(random_state=42)),
('LinearSVC', LinearSVC(random_state=42))])
params = {"LinearSVC__C": [0.001, 0.01, 0.1, 1, 10, 100]}
svc_oversample_cv = GridSearchCV(over_pipe,
param_grid = params,
cv=kf,
scoring='f1_macro',
return_train_score=True).fit(X_train_vector, y_train)
svc_oversample_cv.best_score_ # print f1 score
3. 欠采样多数类
与上述方法的另一种替代方案是对多数类进行欠采样,而不是对多数类进行过采样。有人可能会认为如果你拥有数据,就不值得删除数据,但这可能是一个值得尝试的选项。同样,imblearn 库中也有过采样函数可以使用。
4. 合成少数类的新实例
少数类的新实例可以通过称为 SMOTE(合成少数过采样技术)的方法生成,该方法同样可以使用 imblearn 库来实现。这里有一篇很好的文章 here 提供了一些实现 SMOTE 的示例。
5. 文本增强
可以使用现有数据的同义词生成新数据,以增加少数类的数据点数量。方法包括同义词替换和回译(翻译成一种语言再翻译回原始语言)。nlpaug library 是一个探索这些选项的方便库。
逐步执行这些平衡处理步骤,并将得分与基准得分进行比较,将允许你查看哪种方法最适合你的数据。
10. 部署训练好的分类器
现在是将经过训练的分类器推向生产环境的时候了,让它在未见过和未标记的数据上发挥魔力,前提是它已经经过测试。部署的方法取决于你的公司使用的平台,这里有一篇文章详细介绍了一些选项。
就这样!10 个简单步骤,使用监督式机器学习方法在 python 中构建文本分类器。总结一下,我们学习了:
-
构建文本分类器所需的步骤顺序
-
检查类别分布的重要性,并理解这如何影响模型性能指标
-
文本预处理步骤
-
如何选择合适的模型并记录基准模型的性能
-
解决类别不平衡的方法
希望这对你有所帮助。请留下任何想法、评论或建议 😃
数据科学家的指南:将洞察力转化为有影响力的行动
数据科学家在科技行业的第一年编年史
将你的工作转化为有意义成果的杀手技能组合
·发表于Towards Data Science ·阅读时间 10 分钟·2023 年 7 月 8 日
–
想象一下,花费数月心血投入到一个项目中,却看到其内容被搁置。这是许多数据科学家面临的情景。
这种情况不止发生过一次。这让我感到深深的苦涩,疑惑为什么一开始会发生这种事。
这通常发生在 商业目标发生变化时。
项目被降低了优先级,你的贡献也一样。这就是我在这种情况下遇到的情况。对于公司赌注的变化,我无能为力。
其他时候,是因为 利益相关者没有跟进你的工作。
即使你的信息是相关的,当利益相关者无法理解你的洞察或不被说服时,也会发生这种情况。可能是因为你在某处搞砸了。好消息是,有方法可以防止这种情况发生。
这也发生在我身上,我在这里详细讲述了我如何搞砸了,以及在过程中学到了哪些技能来将我的洞察力转化为行动。
图片来源:作者(Midjourney)
成为数据科学家的公式从未改变。它非常直接——归结为:
数学 + 代码 + 商业头脑 + 软技能 = 数据科学家公式
轰!没什么疯狂的。
唯一稍显疯狂的部分是软技能。它们在项目范围的所有阶段都会发挥作用,尤其是当你需要交付你的洞察力并确保它们转化为行动时。公式并不简单明了。
(另外,如果你是初级数据科学家,务必查看我下面的文章,了解作为一名初级数据科学家在 Spotify 学到的 5 个重要课程)
## 我在 Spotify 学到的初级数据科学家五个必备课程(第一部分)
成为数据科学家早期阶段的内行指南,并提升你的技能水平。
towardsdatascience.com
不那么软的技能
我不明白为什么我们称这些技能为软技能。它们比那些技术技能更难培养。没有教科书公式会告诉你确切的方法。
如果这些技能不是由你的仙女教母🪄赐予你的,那么你需要开始努力把它们赋予自己。
如果你的仙女教母看起来不是这样,那么我不想听 — 作者提供的图片(Midjourney)
有些技能你会在被投身实际工作中并亲自动手时学到。而其他技能则会在你与专家们相处时自然获得。
当你想将洞察转化为行动时,软技能尤为重要,因为你需要说服决策者这些洞察为何重要
但我们说的并不仅仅是任何软技能。你需要培养一套特别的技能,以确保你的洞察不会陷入困境。
1. 翻译的艺术✨
有一天,我需要解释我们进行的复杂 A/B 测试的分析,这涉及使用统计术语如“卡方检验”和“p 值”。
对大多数非技术人员来说,技术术语听起来像是天书。为了让他们更容易理解,我专注于结果是否统计显著。通常,人们知道它与结果的可靠性有关。
当你完成了项目中所有的技术工作后,剩下的就是与利益相关者分享你的劳动成果。
记住你是在对非技术人员讲话
这些人将把你的洞察或模型转化为产品。他们根本不知道什么是随机森林,他们只知道这不是一堆在非洲的树木。
因此,学会 将复杂信息转化为简单语言 以确保你的工作能顺利推进到下一阶段
很容易以为每个人都会理解你认为简单的术语。但仅仅因为他们也在从事或涉及技术工作,并不意味着他们会理解,所以一定要用简单的语言交流。这是传达信息的第一步,否则可能一切都徒劳无功。
作者提供的图片(Midjourney)
2. 说服的力量 🫱🏼🫲🏾
我最近花了几个月时间进行深入研究。目标是了解体验的一部分质量,并提出基于数据的改进建议。
一个关键的建议对某些人来说似乎很荒唐,但我的直觉告诉我我们在做对的事。因此,我联系了一个在该项目的完全不同方面工作的团队。我深入研究了他们过去的研究,并收集了任何可以支持我立场的论据。
我最终成功地说服了我的受众,说明我的见解值得追求。如果我一开始没有接受这一点,我将无法通过研究产生影响。
是的,他有三只手,你怎么期望只用两只手完成这些任务?这需要努力,所以你需要尽可能多的手——作者提供的图像(Midjourney)
当你希望你的工作变成真实而有影响的东西时,说服力成为你的新盟友。这不是一种容易学会的技能,但它会帮助你脱颖而出,成为一名卓越的数据科学家。
你的受众在听你说话。这是真的。但这并不意味着他们已经信服。他们为什么要在乎?
他们也必须付出额外的努力来说服你为什么值得花时间研究一些东西。因此,你也不应该不做同样的事情。每个人的时间都很宝贵。
这里有 4 件事你可以做,也应该做,以引起他们的关注
-
不要放弃你强有力的见解。 无论它们对其他人来说多么牵强。相信你的直觉,并为它们辩护,但只有在你对它们的潜力有信心时!!
-
提供针对特定受众的有说服力的论点。 通过用他们的语言讲解来打动他们,让你的见解与他们产生共鸣。确保有数据支持。如果你面对的是产品经理,那就展示你的见解如何与产品相关。
-
制定战略计划。 你需要概述你提出的将这一愿景付诸实践的关键步骤。
-
对成功实施类似项目的团队或公司进行深入研究。强调不落后于人的重要性,并营造紧迫感。
-
重复,重复,再重复。 固定的受众需要多次听到某些内容才能整合进来。但也因为你需要将这些见解重复传达给不同的受众。你永远不知道哪个关键利益相关者会接收到这些信息并解锁下一步。
小心 🚨
在你追求影响力的过程中,记住不是所有东西都可以被人为地强行变得有用
如果你发现自己必须过多地说服他人,这可能表明与你的利益相关者的期望和假设不一致。但当你的见解与他们的需求无缝对接,你的故事在他们的背景下闪耀时,就无需说服——影响力会自己证明。
3. 讲故事的魔力 🤯
还记得我之前提到的深度研究吗?
它引起了我部门 VP 的兴趣,因此我和我的经理必须确保故事流畅且完全合理后再进行展示。
我们在这上面花了时间,因为每个细节都必须有数据支持——我们说的任何内容都可能影响重大决策。
在向决策者展示你的见解时,讲故事的技巧是决定它们是否会进入排行榜的终极差异。
在几周或几个月内深入一个主题后,区分哪些内容真正有价值分享变得具有挑战性。学习如何挑选重要的数据部分并将其与产品建议联系起来,然后说服决策者采取行动是一项关键技能。
成功的演示是技巧性传递和战略性策划相关且引人注目的内容的结果
到目前为止,你知道你想与股东讨论什么。但你是否知道如何讨论它?
如果你是初级人员,你可能不记得。即使是最资深的技术数据科学家也仍在磨练这一技能。
作者提供的图片(Midjourney)
这些是我在为 VP 的审查准备演示时获得的讲故事技巧
首先,确保你了解业务目标、主要战略方向、关注领域以及你的项目如何与之对齐。
这将使你创建一个不孤立的故事。它与公司活跃的生态系统相关联。你的研究不是一项独立的工作。它旨在为更广泛的使命和愿景做出贡献。
在演示中清楚地表述你的工作如何直接与这一宏观目标对齐。
幻灯片 1 — 执行摘要
它概述了你的工作,并包括关键见解和建议的总结。它为你的观众设定了期望。
这通常应包括:
-
关键见解、数字或总结当前问题的观点
-
研究目标 + 达成此目标所用的方法
-
一张展示推动研究的关键统计数据的图表
-
关键见解和建议的要点
执行摘要的模板 – 作者提供的图片
幻灯片 2 — 理由 + 免责声明/警告
-
更详细地描述那个关键见解/数字,并解释你的研究试图进一步实现的最终目标
-
任何值得分享的内容,股东应了解以理解你的研究,均符合警告的标准。例如,这可能是关于数据质量问题的免责声明
作者提供的图片
幻灯片 3 — 关键见解总结
用数据支持每个关键要素。
🔊 一条建议 🔊: 在每个要点旁边添加一个超链接,指向你深入分析该见解的幻灯片。这使得浏览你的幻灯片简单。
作者图片
第 4 页 — 推荐总结
用相应的关键数字支持每个建议。
🔊 一条建议 🔊: 标记相关利益相关者。在这一部分,你需要解释如何将你的建议付诸实践给那个有能力实施的人。
作者图片
正文 — 将你的故事分成章节 + 在每一章末尾插入回顾
每个部分都作为你故事的章节。以下是如何在章节中展示每个发现的示例。
-
确保每个部分为下一个部分铺平道路。记住你在讲述一个故事,因此这些需要无缝衔接。
-
在每章末尾包含回顾。这有助于信息在你观众的脑海中更牢固地留下。
作者图片
最后一页 — 下一步
列出未来需要采取的行动。例如:
“监控 A/B 测试的启动”
作者图片
最后,记住你的故事需要自说自话。 这意味着即使没有你的干预,任何人也应该能够随时获得见解。
讲故事是数据科学家的持续旅程。 随着时间的推移,你将发展出自己的风格。
总结
成为数据科学家的真正成功不仅在于你的技术能力,还在于你有效沟通、影响和激励的能力。你可以通过以下方式做到这一点:
-
将技术术语翻译成英语。 简化复杂概念,以确保非技术人员理解你的见解及其价值。
-
说服你的观众为什么你的见解值得关注。 你让利益相关者支持你的事业的能力可以将单纯的概念转化为行动,创造持久的影响。
-
不断磨练你的讲故事技巧。 成功不仅在于演讲的呈现,还在于内容的精心策划。
掌握这些软技能将推动你的职业生涯迈向新高峰,并使你的工作真正产生影响。
即将推出:揭示终极技能,使数据科学家在技术领域脱颖而出,获得最佳工作
-
技术领域所有数据科学家共有的一项技能
-
一项能开启你梦想数据科学工作的大门的技能
-
一项重要到值得单独讲述的技能
所以,请继续关注,因为你不会想错过。
好吧,现在我开始听起来像个吸引点击的标题了。
下次见👋🏼
我有礼物送给你🎁!
注册我的 newsletter K’s DataLadder,你将自动获得我的终极 SQL 备忘单,其中包含我在大型科技公司每天使用的所有查询+另一个神秘礼物!
我每周分享作为科技行业数据科学家的经历,以及实用的技巧、技能和故事,旨在帮助你提升自己——因为没人真正了解,直到他们自己亲身经历!
如果你还没有做的话
很快见!
逐步指南:通过从单变量分布中采样生成合成数据
学习如何创建合成数据,以防你的项目数据不足或用于模拟
·发表于 Towards Data Science ·阅读时间 10 分钟·2023 年 3 月 27 日
–
图片来源:Debby Hudson 于 Unsplash
数据是数据科学项目中的燃料。但如果观察数据稀少、昂贵或难以测量怎么办?合成数据可以是解决方案。合成数据是人工生成的数据,模拟真实世界事件的统计特性。我将演示如何通过从单变量分布中采样来创建连续合成数据。 首先,我将展示如何通过模拟评估系统和过程,在此过程中我们需要选择概率分布并指定参数。其次,我将演示如何生成模拟现有数据集特性的样本,即根据概率模型分布的随机变量。所有示例均使用 scipy 和 distfit 库创建。
如果你觉得这篇文章有帮助,请使用我的 推荐链接 继续无限制地学习并注册 Medium 会员。此外, 关注我 以便及时获取我的最新内容!
合成数据 — 背景。
在过去十年中,数据量迅速增长,并导致了一个认识,即数据的质量比数量更为重要。更高的质量可以帮助得出更准确的结论和做出更明智的决策。许多组织和领域中,合成数据都能发挥作用,但有一个特别重视合成数据的领域,那就是自动驾驶汽车。在这里,数据被生成用于许多边缘案例,随后用来训练模型。像 Gartner 这样的公司强调了合成数据的重要性,Gartner 预测真实数据将很快被超越[1]。周围已经有很多清晰的例子,如由生成对抗网络(GANs)生成的虚假图像。在这个博客中,我将不会关注由 GANs 生成的图像,而是关注更基本的技术,即基于概率分布创建合成数据。
合成数据可以通过两大类抽样技术来创建:
-
概率抽样; 创建与真实数据分布紧密相似的合成数据,这对于训练机器学习模型和进行统计分析非常有用。
-
非概率抽样; 包括在没有已知选择概率的情况下选择样本,例如便利抽样、滚雪球抽样和配额抽样。这是一种快速、简单且廉价的数据获取方式。
我将重点讨论 概率抽样,其中估计总体的分布参数是关键。换句话说,我们在单变量数据集的情况下寻找最佳拟合的理论分布。通过估计的理论分布,我们可以生成新的样本,即我们的合成数据集。
概率密度函数概述。
找到最适合模拟真实世界事件的理论分布可能具有挑战性,因为存在许多不同的概率分布。像*distfit [2]*这样的库在这种情况下非常有帮助。
了解基础数据分布是数据建模的重要一步,并有许多应用,例如…
图 1 展示了概率密度函数(PDF)的一个很好的概述,其中捕捉了分布的“规范”形状。这样的概述有助于更好地理解和决定哪种分布可能最适合特定的使用案例。在接下来的两个部分中,我们将尝试不同的分布及其参数,看看我们能多好地生成合成数据。
合成数据是使用统计模型生成的人工数据。
图 1. 概率密度函数及其参数概述。创建者:Rasmus Bááth (2012)。
创建用于模拟的合成数据。
使用合成数据是生成大型和多样化数据集以进行模拟的理想选择,这使得测试和探索不同场景成为可能。这有助于获得通过其他手段可能难以或不可能获得的见解和知识,或者在我们需要确定系统和过程的边缘情况时。然而,创建合成数据可能具有挑战性,因为它需要通过使用理论分布和人口参数来模拟现实世界事件。
使用合成数据,我们的目标是通过估计理论分布和人口参数来模拟现实世界事件。
为了演示合成数据的创建,我创建了一个假设用例,我们在安全领域工作,需要了解网络活动的行为。一位安全专家提供了以下信息;大多数网络活动在 8 点开始,并在 10 点左右达到高峰。一些活动会在 8 点之前出现,但不多。下午,活动逐渐减少,并在下午 6 点左右停止。然而,1 点到 2 点之间也有一个小高峰。 请注意,一般来说,描述异常事件比描述正常/预期行为要困难得多,因为正常行为是最常见的,因此观测数据的比例最大。让我们将这些信息转化为统计模型。
将领域知识转化为统计模型。
根据描述,我们需要决定最佳匹配的理论分布。然而,选择最佳理论分布需要调查许多分布的特性(见图 1)。此外,你可能需要多个分布;即概率密度函数的混合。在我们的示例中,我们将创建两个分布的混合,一个用于早晨,一个用于下午活动。
描述早晨:“大多数网络活动在 8 点开始,并在 10 点左右达到高峰。一些活动会在 8 点之前出现,但不多。”
为了对早晨网络活动进行建模,我们可以使用正态分布。它是对称的,没有重尾。我们可以设置以下参数:均值为上午 10 点,且相对较窄的范围,如 sigma=0.5。图 2 中显示了一些具有不同均值和 sigma 参数的正态 PDF。尝试感受 sigma 参数变化对斜率的影响。
图 2. 具有各种参数的正态分布。来源:维基百科
下午描述:“活动逐渐减少并在下午 6 点左右停止。然而,1 到 2 点之间也有一个小峰值。”
适合下午活动的分布可能是一个具有重右尾的偏斜分布,可以捕捉逐渐减少的活动。韦布尔分布可以是一个候选,因为它用于建模具有单调递增或递减趋势的数据。然而,如果我们并不总是期望网络活动单调递减(因为在周二或其他情况中不同),那么考虑如伽马这样的分布可能更好(图 3)。在这里,我们也需要调整参数,以便它最符合描述。为了更好地控制分布的形状,我更喜欢使用广义伽马分布**。**
图 3. 一个具有不同参数的伽马分布。来源:维基百科
在下一部分中,我们将尝试这两种候选分布(正态分布和广义伽马分布),并设置参数以创建代表网络活动用例的 PDF 混合。
优化参数以创建最符合场景的合成数据。
在下面的代码部分,我们将从均值为 10(代表上午 10 点的峰值)和标准差为 0.5 的正态分布中生成 10,000 个样本。接下来,我们从广义伽马分布中生成 2,000 个样本,我将第二个峰值设置在loc=13
。我们本来也可以选择loc=14
,但这会导致两个分布之间的间隔更大。下一步是将两个数据集结合起来并打乱它们。请注意,打乱并不是必须的,但如果不这样做,样本将首先按 10,000 个正态分布样本排序,然后按 1,000 个广义伽马分布样本排序。这种顺序可能会在对数据集进行任何分析或建模时引入偏差。
import numpy as np
from scipy.stats import norm, gengamma
# Set seed for reproducibility
np.random.seed(1)
# Generate data from a normal distribution
normal_samples = norm.rvs(10, 1, 10000)
# Create a generalized gamma distribution with the specified parameters
dist = gengamma(a=1.4, c=1, scale=0.8, loc=13)
# Generate random samples from the distribution
gamma_samples = dist.rvs(size=2000)
# Combine the two datasets by concatenation
dataset = np.concatenate((normal_samples, gamma_samples))
# Shuffle the dataset
np.random.shuffle(dataset)
# Plot
bar_properties={'color': '#607B8B', 'linewidth': 1, 'edgecolor': '#5A5A5A'}
plt.figure(figsize=(20, 15)); plt.hist(dataset, bins=100, **bar_properties)
plt.grid(True)
plt.xlabel('Time', fontsize=22)
plt.ylabel('Frequency', fontsize=22)Let’s plot the distribution and see what it looks like (Figure 3). Usually, it takes a few iterations to tweak parameters and fine-tuning.
图 4. 正态分布和广义伽马分布的概率密度函数混合。作者提供的图像。
我们使用两种分布的混合来创建合成数据,以模拟特定人群网络活动的正常/预期行为(图 4)。我们在上午 10 点模拟了一个主要的峰值,网络活动从早上 6 点开始,一直到下午 1 点。第二个峰值在下午 1 到 2 点左右,右尾很重,延续到晚上 8 点。下一步可能是设置置信区间并追求异常值检测。有关异常值检测的更多细节可以在以下博客 [3] 中找到:
学习如何使用概率密度函数检测异常值,以实现快速、轻量的模型和可解释的结果。
[towardsdatascience.com
创建与真实数据分布高度一致的合成数据。
到目前为止,我们创建了允许通过模拟探索不同场景的合成数据。这里,我们将创建与真实数据分布高度一致的合成数据。作为演示,我将使用 Seaborn 的消费小费数据集 [4] 并使用 distfit library [2] 估算参数。如果你是第一次估算概率密度函数,我推荐阅读关于 distfit 的博客。 tips 数据集仅包含 244 个数据点。让我们首先初始化库,加载数据集并绘制值(见代码部分)。
# Install distfit
pip install distfit
# Initialize distfit
dfit = distfit(distr='popular')
# Import dataset
df = dfit.import_example(data='tips')
print(df)
# tip
# 0 1.01
# 1 1.66
# 2 3.50
# 3 3.31
# 4 3.61
# 239 5.92
# 240 2.00
# 241 2.00
# 242 1.75
# 243 3.00
# Name: tip, Length: 244, dtype: float64
# Make plot
dfit.lineplot(df['tip'], xlabel='Number', ylabel='Tip value')
对数据集进行可视化检查。
加载数据后,我们可以进行可视化检查,以了解范围和可能的异常值(图 5)。244 个小费的范围主要在 2 到 4 美元之间。基于这个图,我们还可以建立预期分布的直观印象,当我们将所有数据点投影到 y 轴时(我将稍后演示)。
图 5. 244 位客户的消费小费数据集。
distfit 的搜索空间设置为流行的 PDF,平滑参数设置为 3。样本量过少会使直方图出现不平滑,并导致分布拟合不佳。
# Import library
from distfit import distfit
# Initialize with smoothing and upperbound confidence interval
dfit = distfit(smooth=3, bound='up')
# Fit model
dfit.fit_transform(df['tip'], n_boots=100)
# Plot PDF/CDF
fig, ax = plt.subplots(1,2, figsize=(25, 10))
dfit.plot(chart='PDF', n_top=10, ax=ax[0])
dfit.plot(chart='CDF', n_top=10, ax=ax[1])
# Show plot
plt.show()
# Create line plot
dfit.lineplot(df['tip'], xlabel='Number', ylabel='Tip value', projection=True)
最佳拟合的 PDF 是beta(图 6,红线)。上界置信区间 alpha=0.05
为 5.53,根据视觉检查,这似乎是一个合理的阈值(红色垂直线)。
图 6. 左:PDF,右:CDF。顶部 5 个拟合的理论分布以不同颜色显示。最佳拟合为 Beta,用红色标记。(图片由作者提供)
找到最佳分布后,我们可以将估算的 PDF 投影到我们的折线图上,以获得更好的直观感受(图 7)。请注意,PDF 和经验 PDF 与图 6 中完全一致。
图 7. 244 位客户的消费小费数据集。基于当前数据估算的经验 PDF。理论 PDF 是最佳拟合分布。(图片由作者提供)
使用最佳拟合分布的估计参数,我们可以开始创建关于小费的合成数据(见下方代码部分)。让我们创建 100 个新样本并绘制数据点(见图 8)。合成数据提供了许多机会,即它可以用于训练模型,也可以帮助我们了解诸如使用小费储蓄特定金额所需的时间等问题。
# Create synthetic data
X = dfit.generate(100)
# Ploy the data
dfit.lineplot(X, xlabel='Number', ylabel='Tip value', grid=True)
图 8。合成数据。我们可以看到值在 2-4 之间,有一些离群值。红色水平线是先前估计的 alpha=0.05 的置信区间。经验 PDF 是基于当前数据估计的。理论 PDF 是基于我们之前的拟合。这允许快速比较生成的数据和拟合的理论 PDF。(图片由作者提供)
最后的话。
我展示了如何通过使用概率密度函数以单变量方式创建合成数据。使用distfit库,可以评估 89 种理论分布,估计的参数可以用于模拟现实世界事件。尽管这很棒,但创建合成数据也存在一些局限性。首先,合成数据可能无法完全捕捉现实世界事件的复杂性,缺乏多样性可能导致模型在训练时无法泛化。此外,由于不正确的假设或参数估计,合成数据可能会引入偏差。务必始终对你的合成数据进行合理性检查。
保持安全。保持冷静。
干杯,E.
如果你觉得这篇文章有帮助,可以使用我的 推荐链接 继续无限学习并注册 Medium 会员。还有, 关注我 以保持最新内容的更新!
软件
让我们联系!
参考文献
-
Gartner, Maverick Research: 忘掉你的真实数据——合成数据是 AI 的未来, Leinar Ramos, Jitendra Subramanyam, 2021 年 6 月 24 日。
-
E. Taskesen, 如何找到最适合你数据的理论分布, 2023 年 2 月 Medium。
-
E. Taskesen, 在单变量数据集中使用分布拟合进行离群值检测, Medium 2023
理解的垫脚石:知识图谱作为可解释链式思维推理的支撑
·发表于数据科学前沿 ·7 分钟阅读·2023 年 11 月 21 日
–
使用人工智能软件来增强本文的语法、流畅性和可读性。
大型语言模型(LLMs)在大量文本数据的训练下,引发了 AI 领域的革命。它们仅凭简短文本提示即可生成极具 eloquent 和连贯的语言,开辟了从创意写作到对话助手等各个领域的新视野。
然而,单凭语言表达的掌握并不等同于真正的智能。大型语言模型(LLMs)仍然缺乏对概念的语义理解和情境理解及复杂问题解决所需的逻辑推理能力。它们的知识仍局限于从训练语料中 discerned superficial patterns,而不是关于真实世界的基础事实。
当我们对这些模型提出更多开放性、多方面的问题时,它们的局限性变得越来越明显。它们无法从不同文档中逻辑性地综合细节,或进行多步骤推理以得出答案。
一旦查询开始偏离训练数据的分布,就会出现虚幻或矛盾的回应。
为了应对这些问题,AI 社区将重点转向了检索增强生成(RAG)框架。这些系统旨在将语言模型的语言能力与对外部知识来源的快速、针对性访问相结合,以将其基础于事实背景中,而不是虚幻的内容。
目前大多数现有架构使用语义相似性从文本语料库的向量表示中检索补充信息。然而,这在检索的段落与实际查询上下文之间的模糊相关性上存在困难。当将段落浓缩为单一不透明的向量时,关键信息容易丢失,缺乏上下文链接。通过逻辑推理将离散事实结合成连贯叙事仍然很艰难。
这强调了纳入封装现实世界实体及其之间关系的结构化知识源的必要性。知识图谱满足了这一需求——将事实编码为可以沿解释路径遍历的互联节点和边。然而,有效地将语言模型的自由形式推理建立在结构化图谱上存在接口挑战。创造性地将神经方法与符号表示桥接仍然是一个未解问题。
一种在这一方向上展现出希望的新兴技术是思维链(CoT)提示。CoT 促使语言模型以逐步推理链条的形式展示其推理过程。每一个连接变得清晰可见,增强了透明度。然而,在完全自由形式的语言空间中,长时间的历史往往会迅速破裂。知识图谱可能提供缺失的支撑结构,以给这些逐渐展开的推理轨迹提供结构。
明确地沿知识图谱路径追踪 CoT 步骤可能会实现基于事实链条的逻辑推理。然而,找到非结构化神经输出与结构化符号知识之间的正确对齐仍然是一个未解的挑战。在这方面的创新为融合两种方法的优点提供了希望——将符号表示与基于真实世界实体的可靠推理链条结合,通过向量空间流畅地连接,从而实现高效的统计推断。
文章的其余部分将探讨知识图谱与 CoT 推理在大型语言模型中的有前景的交集,以实现更稳健的情境智能。我们将深入研究利用每种方法的互补优势,同时减轻它们在孤立状态下的缺陷的技术。
I. 知识图谱用于稳健的少样本学习
自然语言接口到数据库一直是工业界和学术界的圣杯。最近,进展……
ai.plainenglish.io ## 向量搜索并非你所需的一切
介绍
[towardsdatascience.com
现有的大多数 RAG 系统仅依赖于段落嵌入进行语义相似性匹配。然而,这些系统在处理模糊相关性和无法联合分析分散在多个段落中的连接事实方面存在困难。知识图谱通过保留符号事实和关系来解决这些问题,从而支持可解释的多跳推理。
多样的图算法用于多用途推理
知识图谱为我们提供了一整套新的算法,优化用于不同的推理模式:
-
像个性化 PageRank 这样的图遍历算法通过分析实体之间的间接连接来支持灵活的关联推理。这支持从跨多个边的推理链中推导出新的关系。
-
为搜索优化的算法(例如,近似最近邻)可以高效查询与特定实体相关的事实。这有助于精确的事实检索。
-
图总结算法可以简明地提炼出包含最相关信息的子图,以简化推理。这减少了噪音并提高了焦点。
优化的知识图谱嵌入
此外,知识图谱中的元素如实体、关系和文本也可以编码到向量空间中,从而支持数学操作:
-
传递性嵌入通过在关系组成中保持等价性来改善跨多跳推理链的演绎推理。
-
层次嵌入编码了实体之间的分类层级,允许基于继承的推理。这从祖先类继承事实。
-
大型变换器语言模型中的上下文嵌入捕捉了实体和关系文本属性中的语义细微差别。
丰富的符号表示与灵活的向量空间之间的合作为少量学习提供了最佳基础——结构化的知识用于支撑显式逻辑推理,通过动态流畅的向量空间提炼出显著的模式。
II. 用结构化知识图谱增强思维链
## 在混乱的背景下通过思维链提示实现 LLMs 的结构化推理和…
大型语言模型(LLMs)展示了令人印象深刻的少量学习能力,能够快速适应新任务……
[towardsdatascience.com [## 思维图:使用大型语言模型解决复杂问题
我们介绍了 Graph of Thoughts(GoT):一个提升大型语言模型(LLMs)提示能力的框架…
大型语言模型(LLMs)在复杂任务中展示了令人印象深刻的推理能力。然而,它们缺乏…
链式推理(CoT)提示指导语言模型通过解释性推理步骤链展示其推理过程。然而,当推理跨越更长的历史时,一致性通常会在自由形式的语言空间中解构。知识图谱可以提供缺失的结构。
显式编码概念和关系
知识图谱将概念编码为相互链接的符号节点,捕捉它们之间的关系。通过这个明确的网络遍历解释路径可以支撑链式推理。像 Graph-of-Thoughts(GoT)这样的近期方法探索组装情境图来建模不断演变的链式推理步骤。
超越建模,结构化表示可以参与引导推理:
-
查询本体:初始本体查询建立定义和高层次背景,可以框定推理。
-
遍历关系:图算法可以收集与每个 CoT 步骤相关的连接事实。
-
更新表示:嵌入编码提取的细节,集中注意力。
协调混合推理
将神经 CoT 提示与结构化知识图谱整合需要协调分布式推理模块:
-
管理者:排序模块执行,平衡语言模型请求与检索。
-
提示者:通过 CoT 提示从语言模型中引出自由形式的理由。
-
检索器:使用个性化 PageRank 等算法收集相关的图形细节。
-
解析器:将检索到的事实转换为自然语言或向量。
-
评分器:评估检索到的事实在当前上下文中的相关性。
-
融合器:将显著知识与更新提示结合,为下一轮准备。
模块化架构允许结合神经和符号方法的优点。语言模型思维流畅,而图形保留逻辑——彼此弥补对方的局限性。
编排混合推理
协调结构化知识与流体向量推断之间的分阶段互动是解锁结合以下内容的新推理能力的关键:
-
使用嵌入的可扩展模式识别来解释显式符号建模的可解释性。
-
公理知识的逻辑合理性与神经方法的自适应即兴发挥。
-
图谱遍历提供的可解释性与向量的高效计算。
这种综合方法的创新承诺比单独使用任何一种方法提供更可靠、多功能和透明的推理。这些合作伙伴关系为情境智能开辟了新前沿。
III. 当前差距与未来方向
知识图谱通过表示事实为相互连接的实体,已成为增强的关键技术…
图谱在现代数据驱动的商业世界中无处不在。
尽管知识图谱有助于支撑推理,但要实现其全部潜力面临如次优构建、对齐、个性化及处理演变等障碍:
综合的高保真知识图谱
手动策划涵盖多样化领域的广泛高质量知识图谱会遇到扩展瓶颈。同时,开源图谱存在稀疏、不一致和噪音问题,不适合支持健全的推理链。清晰的本体知识与嘈杂的网络提取结合带来了整合难题。
平滑集成向量和符号空间
将知识图谱的符号结构与语言模型的潜在向量空间桥接,以实现信息的无缝交换并非易事。像直接向量查找这样的简单方法难以充分捕捉符号语义。更先进的技术如图神经网络展现了优雅地将图谱嵌入语言模型向量空间的潜力,从而实现紧密耦合的推理。但研究仍处于起步阶段。
个性化和当前时态图谱
静态知识图谱无法有效反映个体用户的独特背景,限制了与个人世界知识对齐的个性化推理。构建可定制的用户特定知识图谱依然成本过高。同时,静态图谱也会逐渐过时,无法跟踪不断变化的现实世界状态和事件,这些对当代推理至关重要。准确反映我们短暂环境的动态图谱至关重要。
探索克服限制的创新
然而,创新技术通过融合技术结合策划和提取的知识、改进的基础算法深度结合符号和神经推理、智能助手辅助的可定制动态图谱构建以及持续更新表示的流学习,展现了缓解这些限制的潜力——这些都共同实现了综合推理的共生潜力。
资料来源:
大型语言模型(LLMs)显著提升了语言智能领域,这一点通过…
作者提供的图片
3D 跟踪的立体视觉系统
你只需要两只眼睛
·
关注 发表在 Towards Data Science ·6 分钟阅读·2023 年 1 月 8 日
–
照片由 Adriano Pinto 提供,来源于 Unsplash
就像地球上绝大多数有视力的动物一样,我们有两只眼睛。我们进化中的这一奇妙特性使我们能够以三维的方式看待环境。
要从场景中获取 3D 信息,我们可以通过至少两台相机协同工作来模拟双眼视觉。这种设置被称为立体视觉系统。当相机经过正确校准后,每台相机都会对特定特征点的 3D 坐标提供约束。通过至少两台经过校准的相机,可以计算特征点的 3D 坐标。
在本文中,我们将校准一对相机,并使用此校准来计算在一系列图像中跟踪的特征点的 3D 坐标。你可以在这个仓库找到相应的代码。
立体视觉系统
图 1 显示了我使用的立体视觉系统。如你所见,没有什么花哨的:一对通过 3D 打印部件、绑带和热熔胶固定在一起的网络摄像头。
图 1:立体视觉系统。作者提供的图像。
正好我有两台相同型号的网络摄像头闲置在抽屉里,但并不一定需要完全相同的相机。由于相机是独立校准的,它们可以具有不同的内在参数,并且仍然在立体视觉系统中发挥作用。
相机的校准
投影矩阵
相机的校准归结为计算它们的投影矩阵。针孔相机模型的投影矩阵是一个 3x4 矩阵,它允许从世界参考框架中的 3D 坐标计算特征点的像素坐标。
在公式(1)中,i 指代相机索引。在一个由两台相机组成的系统中,i 属于{1, 2}。
Pᵢ 是相机 i 的 3x4 投影矩阵。
(uᵢ, vᵢ) 是特征点的像素坐标,从相机 i 看到的情况。 (X, Y, Z) 是特征点的 3D 坐标。
标量 λᵢ 是保持方程同质性的缩放因子(即,两边向量的最后一个元素是 1)。它的存在来自于将 3D 点投影到 2D 平面(相机传感器)时信息的丧失,因为多个 3D 点映射到同一个 2D 点。
假设我们知道相机的投影矩阵,并且我们有一个特征点的像素坐标,我们的目标是隔离(X, Y, Z)。
将(3)代入(2)的前两行:
公式(6) 表明,每个相机视图为我们提供两个未知数(X, Y, Z)的线性方程。如果我们至少有两个相机视图的相同 3D 点,我们可以通过求解一个过定的线性方程组来计算 3D 坐标。
太棒了!但我们如何计算投影矩阵呢?
投影矩阵的计算
要计算相机的投影矩阵,我们需要大量已知的 3D 点及其对应的像素坐标。我们使用一个棋盘格标定图案,尽可能精确地放置在测量距离上的立体设备前。
图 2:在已知位置的棋盘格标定图案。作者提供的图像。
该仓库包括标定模式图像,适用于两台相机。
图 3:60 cm 距离摄像头的棋盘格标定模式图像。图片由作者提供。
你可以使用这个 Python 程序运行整个标定过程。
每个标定图像中的方形交点通过 CheckerboardIntersections 类的一个实例进行检测,该类在我之前的文章中介绍过。
在这种情况下,我们将交点检测器的参数设置得相对灵敏,以便检测所有真实交点,并且有一定量的假阳性(换句话说,完美的召回,合理的精度)。由于标定是一次性的过程,我们可以承受手动去除假阳性的工作。程序会遍历标定模式图像并要求用户选择假阳性。
图 4:找到的交点,手动去除假阳性前后的情况。图片由作者提供。
正如我们在我关于相机径向失真的补偿文章中看到的,原始交点坐标必须是未失真的。径向失真模型之前已经为两台相机计算,相应的文件已在仓库中。未失真的坐标是我们用来构建针孔相机模型的投影矩阵的坐标。
此时,我们有 7(不同距离的拍摄)x 6 x 6(方形交点)= 252 对应于每台相机的 3D 点和像素坐标。
为了计算投影矩阵的条目,我们将重新开始使用方程(1),但这次假设我们知道(u, v)ₖ 和(X, Y, Z)ₖ,并且我们要解决 P 的条目。下标 k 指的是(pixel_coords, XYZ_world)对的索引。标量 λₖ(每个点一个)也是未知的。我们可以通过一些操作将 λₖ 从线性方程组中消除:
方程(8)和(9)可以写成 Ap = 0 的形式:
方程 (10) 显示每个对应关系提供了 12 个未知数中的两个齐次线性方程。至少需要 6 个对应关系来解出 P 的条目。我们还需要我们的 3D 点是非共面的。通过 7 个平面中的 252 个对应关系,我们是安全的。
在执行校准程序后,我们可以验证投影矩阵是否正确地将已知的 3D 点投影回其未畸变的像素坐标。
图 5:图像中棋盘格 3D 点的投影。图像由作者提供。
在图 5 中,蓝色点是经过径向畸变补偿后由交点检测器找到的点。黄色圆圈是图像中 3D 点的投影。我们可以看到,两台摄像头的投影矩阵表现良好。请注意,偏离标注点与棋盘格交点不重合,这是由于径向畸变补偿造成的。
3D 跟踪
我们现在可以使用校准后的立体系统来计算特征点的 3D 位置。为了演示这一点,我们将跟踪一个易于检测的特征点(一个红色方块的中心)在一系列图像中的位置。
你可以在这里找到跟踪程序。
图 6:左:跟踪的红色方块的图像。右:检测到的斑点。图像由作者提供。
图 6 展示了跟踪红色方块的检测示例。简而言之,方块是通过首先识别图像中蓝色成分占主导的区域来跟踪的,因为红色方块周围的区域是蓝色的。然后,在蓝色主导区域内找到红色成分占主导的区域。详细信息请参阅代码。
图 7:红色方块的中心在 3D 中被跟踪。坐标单位为厘米。动画由作者提供。
使用两台摄像头的未畸变像素坐标及其对应的投影矩阵,可以计算出每张图像中特征点的 3D 位置,如上面的动画所示。
结论
我们用一对网络摄像头构建了一个简单的立体视觉系统。我们通过补偿径向畸变并计算投影矩阵来校准这两台摄像头。我们可以使用经过校准的系统来跟踪一系列图像中一个特征点的 3D 位置。
请随意尝试代码。
如果你有立体视觉的应用想法,请告诉我,我会非常感兴趣了解!
网络交流让我找到工作,即使我曾被拒绝,看看我是怎么做到的。
别低估 LinkedIn 网络交流的重要性,它阻碍了你找到数据科学工作的机会。
·发表于 Towards Data Science ·12 分钟阅读·2023 年 11 月 5 日
–
欢迎来到 LinkedIn 101 — 图片由作者提供 (Dall.E)
三年前,当我还是一名学生时,我申请了一个在科技领域非常有竞争力且真的很酷的数据科学实习职位,这是我非常渴望的。
剧透警告:我被拒绝了。两次。
但我还是得到了实习机会。
怎么做?我把 LinkedIn 网络交流技巧付诸实践。在这篇文章中,我将向你展示如何自己做到这一点,并让你更接近梦想中的工作。然后,我会详细讲述我获得这个实习职位的故事!
现在,作为一名 Spotify 数据科学家,我每天都被渴望成为数据科学家的消息淹没。他们知道,就像我一样,LinkedIn 上的网络交流不仅有用,而且对职业发展至关重要。
没有它你不会走得远。
如果你是一名寻找数据科学职位的求职者,这篇文章可能会改变你的游戏规则。在这里,我将深入探讨有效的网络交流策略,这些策略帮助我获得了想要的机会,即使在申请过程中被拒绝之后。
说到 LinkedIn,你可以在这里找到我。
职场竞争激烈,极其竞争,而且不总是公平的。
根据《福布斯》,75% 的简历 被申请跟踪软件 在招聘经理看到之前就已被拒绝。
这对你意味着两件事:
-
如果你不利用社交关系,你的职业生涯可能不会走得太远。
-
如果你不这样做,确保别人会做到,他们会让你一无所有。
你必须做的远远不止按下发送按钮。
我也经历过——发了数千份申请,但都无济于事。
要成功,你需要脱颖而出,为此你需要一个策略。
仍然不信服?这里有四个统计数据会让你完全重新思考你如何申请工作以及为什么人际网络如此重要:
-
80%的职位从未被发布,仅通过人际网络才能找到。
-
在 2016 年,70%的人在他们已经与公司里的某个人建立了联系的公司获得了聘用。
-
仅有 7%的求职者获得员工推荐,但这些推荐导致了 40%的聘用! 基本上,来自内部人士的好话可以大大提高你的成功几率。
-
80%的专业人士将人际网络归功于他们的职业成功。
注意 — 在求职的情况下,人际网络只能帮助你让申请更引人注目,其余的还是要靠你自己。如果你对你所瞄准的工作不够资格,人际网络就没有意义了。
就我而言,我被录用是因为我已经具备了技能,唯一的问题是让他们知道我存在。这就是人际网络改变游戏规则的地方。
申请陷入困境 vs. 人际网络的力量 — 作者(Dall.E)的图片
你在人际网络方面很差
或者至少,你很可能不擅长这方面。大多数人不知道如何进行人际网络。我甚至会说,很多人在人际网络方面表现得很糟糕。你可能也是其中之一。
这没关系。我们从学校毕业时没人给我们一本操作手册。我自己也不是很棒,但当我意识到成功需要这些技巧时,我很早就学到了许多窍门。这确实有效。
当你还在求职者的另一边游泳时,人际网络更加困难——这是一个几乎没有职业经验的求职者的侧面。
让我们做一个思维实验——假设你想申请xyz公司,你已经找到了一些可以在 LinkedIn 上联系以获取更多信息或帮助的人。
如果你发送的消息内容是:“我们可以聊聊你的数据科学职业历程吗?”或者“我很想了解你是如何做到现在的位置的?”,那你做错了。
你可能已经在自我设限,因为你很可能以错误的方式接近他们。
我怎么知道的?我曾经在池子的两边。当我还是一个寻找第一个工作的挣扎的学生时,现在作为一个被希望获得第一个工作的人的 Data Scientist。
这是我用来正确开展人际网络的策略。
步骤 1. 利用您的网络
您的网络是一个金矿。这里的“网络”指的是您已经认识的人:朋友、家人、同学和同事。
让他们了解您的职业目标和抱负。我相信您一定在动态中见过一两条类似的帖子,里面的人在向他们的网络寻求更多曝光。
不要羞于做同样的事情。在最坏的情况下,您将继续失业,这与目前的状态没有区别。在最好情况下,您将获得一个机会,那就是您所追求的胜利!
您可以做的具体事情:
-
列出您认为可以帮助或指导您的亲密联系人。也许是以前的同事或同学。
-
组织一次随意的咖啡会面或虚拟见面会,讨论您的职业目标。
-
明确地问“您是否认识[行业/角色]中的任何人,我应该与他们交谈?”
-
发布一条询问您网络曝光的帖子。 您可以在其中分享您的抱负和简历。
您会惊讶于您的网络中有多少人会认识某些人或可以将您推荐给一个符合您寻找的角色的机会。
网络中的某人的推荐至少可以提升您被注意到的机会。
步骤 2. 投网更广
当这不起作用时,就该投网更广了。
致力于扩展您的网络。
如何做到?
-
注册数据/人工智能或感兴趣公司的网络研讨会、工作坊或研讨会。 我在加入俱乐部之前参加了很多 Spotify 的网络研讨会,不要害怕这样做。参加后,您可以通过 LinkedIn 与演讲者或参与者建立联系,发送一条提到活动的个性化消息。
-
参加数据/人工智能活动或会议。 这将让您获得幕后访问权限,并有机会结识相关人员。确保与尽可能多的人建立联系。您永远不知道谁会给您带来胜利的机会!
在与新朋友建立联系时,总是要带上背景介绍自己。与其简单地说“你好”,不如说“你好,我参加了同一个关于 AI 进展的网络研讨会,我很想与您讨论 x 事”。
让我们更深入地探讨如何在 LinkedIn 上与您的网络建立联系⬇
步骤 3. 不要含糊其辞。问实质性的问题
现在您准备扩展您的网络。您找到了一些有兴趣联系的人。那么该如何做呢?
最宝贵的经验教训——不要在提问时含糊其辞!
具体明确地说明,您成功的机会会增加 —— 图片来源:作者(Dall.E)
您要尽量减少您与专业人士之间的摩擦。
泛泛的问题会得到泛泛的回答, 或者更糟的是,根本没有回答。如果您要联系某人,请做好功课。
我必须承认,我总是避免回答那些问我“在 Spotify 工作是什么感觉?”、“能告诉我你的职业经历吗?”、“你做了什么才能成为今天的你?”这样的问题。
这些问题听起来像是存在主义的问题,需要我花费大量的精力来回答,更重要的是 — 时间,这对我来说是最宝贵的资产。
所以规则 #1,直截了当。
与其问“在 Spotify 工作是什么感觉?”,不如尝试问“我注意到 Spotify 最近整合了 AI 以改善播放列表建议。你能分享一下你在这个项目中的角色吗?”,但前提是你确定对方确实参与了这个项目。
我在 Spotify 负责汽车体验方面的工作,因此对播放列表的情况了解不多。将你的问题专门针对你联系的对象。使问题对他们相关,以最大限度地提高得到回复的机会。
你可以做的一些额外事情:
-
在联系之前,花 10–15 分钟研究一下对方的当前角色、公司或任何最近的成就。 这是你想要你的社交媒体跟踪技能最闪光的时候( — 而不是你的前任)。
-
提出展示你已做功课的问题: “我看到你最近的项目涉及[具体细节]。你是如何处理[具体方面]的?”
-
避免宽泛的问题。与其问“对像我这样的人有什么建议?”,不如问“我应该专注于哪些具体技能才能在[具体角色/行业]中表现出色?”
这应该能让你顺利开始!
第 4 步。专业礼仪是必须的
在做这些事情时,你要注意信息的呈现方式。
在给你不认识的人发消息时,要记住两个重要规则:
-
始终仔细检查名字。 这看起来可能微不足道,但它对信息的接收方式以及信息是否会被接收有很大的影响。我遇到过许多人弄错我的名字,这让我感到非常不快。既然你没有花时间正确拼写他们的名字,为什么他们要花时间帮助你呢?这是他们的身份,所以从一开始就要做对。
-
当他们给你提供了你所要求的信息时,请回复。 回复是一种基本的礼仪。如果有人从他们的日程中抽出时间为你提供见解或建议,务必表示感谢。我遇到过许多人在得到他们想要的东西后完全不再回复我的消息,这也让人感到非常不悦。
为什么这些都很重要?
不要让他们的信息陷入沉寂,表示感激 — 图片由作者提供(Dall.E)
这是合乎体面的做法。这表现出你对联系人的尊重和关怀。如果他们第一次回复了,你更有可能在未来得到他们的帮助。
不要破坏未来的机会。
第 5 步。保持更新
如果有人帮助了你,确保他们投入了一些时间和精力,所以要确保通过提供进展更新来跟进。
人们会欣赏与你一起庆祝你的胜利,尤其是当他们在其中发挥了作用时。
他们会看到努力帮助你所带来的影响,这会让他们觉得有意义。这不仅能保持关系的温暖,还鼓励他们在未来帮助更多的人。
你可以做的具体事项:
-
如果有人为你推荐了工作或其他联系,请更新他们结果,即使没有成功。
-
**分享里程碑或成就,**特别是如果他们的建议对其有所贡献。像“感谢你对[具体细节]的建议,我成功地[具体成就]”这样的简短信息就足够了!
第 6 步:优雅地退出
礼貌往往会有很大帮助。这是体面之举。
自从我开始在网上写关于我的经验后,LinkedIn 上向我寻求帮助的人数激增。全职工作、我的博客和个人承诺使得我的时间有限。
我们常听说时间是我们最宝贵的资产,今年我比以往任何时候都更能体会到这一点。时间是我生活中最重视的东西,这对你寻找的其他专业人士来说可能也是如此。
当我确实分配时间来帮助他人时,这是一个有意识的决定,通常意味着其他任务被搁置。大多数情况下,我选择帮助的人都很友好,一直到他们得到想要的东西,那时这种友好突然消失得无影无踪。
这不是期望不断的感激,而是保持基本的人性尊严。记住,网络拓展是关于培养和维护真实关系。
外面的世界很小。匆忙离开或不经过深思可能会回来伤害我们。因此,始终保持高尚的离开方式是好的,这为未来的机会留下了大门。
你可以做的事情:
-
如果有人将你与另一位专业人士联系起来,无论结果如何,都要回头感谢原始联系人。TopResume 于 2021 年进行的一项研究显示,68% 的招聘专业人士承认,面试者的感谢信会影响他们的决定。
-
如果有人花时间回答了你的问题,请花时间回复他们,并且要准时。
保持尊重,重视他人的时间,并且不要忘记表达感激。
成功时回馈
网络圈:从学生到导师 — 作者图像(Dall.E)
当你也成为其他人的资源时,网络圈就完成了。
一旦你成功了,务必记住你的出发点。我见过许多人由于其他专业人士的支持和帮助而取得成功,但没有将同样的礼貌延伸给新的参与者。
在 Medium 上写作是我回馈社区的方式,为了感谢社区在某种程度上给予我的帮助。这是我回报在我最困难时给予我善意的方式。
网络的美妙之处在于共同成长——当你帮助他人成长时,你也在他们的职业旅程中巩固了自己的足迹。他们不会忘记你,你也很可能不会忘记他们。
你怎么做呢?
-
提供指导年轻的专业人士或来自你母校的学生。
-
在你的网络或 LinkedIn 上分享职位空缺或机会。
-
主持或参与网络研讨会、播客,或撰写文章分享你的专业知识和经验。
看到有人因为你的小帮助而成功,这种满足感是无可比拟的。
那么,我是怎么被录用的呢?
我实施了我在这篇文章中提到的大多数步骤。
-
我参加了一次会议,其中一位我感兴趣的公司的高级数据科学家正在演讲。
-
在被拒绝后,我在 LinkedIn 上联系了他。我保持了礼貌和专业。
-
我问他是否可以进一步讨论我的申请,但他把我引导到了招聘人员那里。然后我优雅地结束了对话。
-
与此同时,我被拒绝了申请过程。
-
十天后,他再次联系了我。他告诉我他们正在进行新一轮的招聘,并提出推荐我担任该职位。
-
我给他发送了我的简历,专门为那家公司量身定做。
-
一周后,我已经获得了加入团队的邀请!
我最后没有加入这家公司,因为我随后收到了 Spotify 的录用通知,但正如你所见,除了我刚刚与你分享的内容,没有其他大的秘密。
我最初被拒绝的原因是因为我的简历没有通过筛选测试。造成这种情况的原因有很多:系统没有挑选到简历、招聘人员没有看到简历等等。
我有资格获得这份工作,这也是为什么网络在我这里奏效的原因,所以确保你也是如此。
如果我没有采取额外的步骤进行联系和网络,我就不会有机会通过筛选过程、面试并证明自己是值得的!
要进一步了解,请查看我关于如何破解当前数据科学职位市场的完整指南!
为什么现在很难找到数据科学的工作,以及你可以做些什么
[towardsdatascience.com
总结 — 打造你的网络游戏的步骤
-
利用你现有的网络 — 触及朋友、家人、同学和同事。公开分享你的职业目标,寻求介绍或推荐。
-
扩展你的网络 — 参加行业活动、网络研讨会和会议。与与会者和演讲者互动,并在 LinkedIn 上与他们建立联系。
-
提出具体问题 — 联系时要直接明确。一般性的问题往往被忽视。做些研究,并根据对方的经验或当前角色提出有针对性的问题。
-
保持职业礼仪 — 注意细节,例如正确拼写名字。当有人提供见解或帮助时,总是要表示感谢。注意他人的时间。
-
提供更新 — 如果有人帮助了你,与你分享你的进展和里程碑。这样可以保持关系的温暖,并鼓励他们在必要时进一步帮助你。
-
优雅地结束 — 当你结束互动时,要礼貌和尊重。记住,网络关系是关于建立真实的、长期的关系。
-
传递善意 — 一旦你在职业生涯中取得了进展,记得帮助他人。分享知识、指导他人,甚至仅仅是传递工作机会,都可以对他人的旅程产生重大影响。
我为你准备了礼物 🎁!
注册我的新闻通讯 K’s DataLadder,你将自动获得我的终极 SQL 备忘单,包含我在大科技公司工作中每天使用的所有查询 + 另一个神秘礼物!
我每周分享在科技行业担任数据科学家的经历,以及实用技巧、技能和故事,旨在帮助你提升自己 —— 因为没有人真正了解,直到他们身临其境!
如果你还没有这样做
再见啦!