Machine Learning Mastery 统计学教程(四)
用于比较机器学习算法的假设检验
最后更新于 2020 年 9 月 1 日
机器学习模型是根据它们的平均表现来选择的,通常使用 k 倍交叉验证来计算。
平均表现最好的算法有望优于平均表现较差的算法。但是如果平均表现的差异是由统计上的侥幸造成的呢?
解决方法是使用统计假设检验来评估任意两种算法之间的平均表现差异是否真实。
在本教程中,您将发现如何使用统计假设测试来比较机器学习算法。
完成本教程后,您将知道:
- 基于平均模型表现执行模型选择可能会产生误导。
- 使用修改后的学生 t-Test 进行五次重复的双重交叉验证是比较机器学习算法的良好实践。
- 如何使用 MLxtend 机器学习来比较使用统计假设检验的算法。
用我的新书机器学习统计启动你的项目,包括分步教程和所有示例的 Python 源代码文件。
我们开始吧。
比较机器学习算法的假设检验 图片由弗兰克·谢泼德提供,保留部分权利。
教程概述
本教程分为三个部分;它们是:
- 比较算法的假设检验
- 带扩展的 5×2 程序
- 比较分类器算法
比较算法的假设检验
模型选择包括评估一套不同的机器学习算法或建模管道,并根据它们的表现进行比较。
然后,根据您的表现指标获得最佳表现的模型或建模管道将被选为您的最终模型,您可以使用该模型开始对新数据进行预测。
这适用于具有经典机器学习算法和深度学习的回归和分类预测建模任务。过程总是一样的。
问题是,你怎么知道两个模型的区别是真实的,而不仅仅是统计上的侥幸?
这个问题可以通过统计假设检验来解决。
一种方法是在数据的相同 k 倍交叉验证分割上评估每个模型(例如,在每种情况下使用相同的随机数种子分割数据),并为每个分割计算分数。这将为 10 倍交叉验证提供一个 10 分的样本。然后可以使用成对的统计假设检验来比较分数,因为每个算法使用相同的处理(数据行)来得出每个分数。可以使用配对学生测试。
在这种情况下,使用配对学生测验的一个问题是,模型的每个评估都不是独立的。这是因为相同的数据行被多次用于训练数据——实际上,每次都是如此,除了一行数据被用于暂停测试文件夹的时间。这种评估缺乏独立性意味着配对学生的 t-测试是乐观的偏见。
这种统计检验可以调整,以考虑到缺乏独立性。此外,可以配置过程的折叠和重复次数,以实现模型表现的良好采样,该采样可以很好地推广到各种各样的问题和算法。具体为 5 个重复的 2 倍交叉验证,即所谓的 5×2 倍交叉验证。
这种方法是由托马斯·迪特里希在他 1998 年发表的题为“用于比较监督分类学习算法的近似统计测试”的论文中提出的
有关此主题的更多信息,请参见教程:
谢天谢地,我们不需要自己实现这个过程。
带扩展的 5×2 程序
塞巴斯蒂安·拉什卡的mlextend 库通过*paint _ ttest _ 5x2cv()*功能提供了一个实现。
首先,您必须安装 mlxtend 库,例如:
sudo pip install mlxtend
要使用评估,必须首先加载数据集,然后定义要比较的两个模型。
...
# load data
X, y = ....
# define models
model1 = ...
model2 = ...
然后,您可以调用*paintest _ 5x2cv()*函数,并传入您的数据和模型,它将报告关于两种算法的表现差异是否显著的 t 统计值和 p 值。
...
# compare algorithms
t, p = paired_ttest_5x2cv(estimator1=model1, estimator2=model2, X=X, y=y)
p 值必须使用 alpha 值来解释,这是您愿意接受的重要级别。
如果 p 值小于或等于所选的α,我们拒绝零假设,即模型具有相同的平均表现,这意味着差异可能是真实的。如果 p 值大于α,我们不能拒绝零假设,即模型具有相同的平均表现,任何观察到的平均精确率差异都可能是统计上的侥幸。
alpha 值越小越好,常用值为 5%(0.05)。
...
# interpret the result
if p <= 0.05:
print('Difference between mean performance is probably real')
else:
print('Algorithms probably have the same performance')
现在我们已经熟悉了使用假设检验来比较算法的方法,让我们看一些例子。
比较分类器算法
在本节中,让我们比较两种机器学习算法在二进制分类任务上的表现,然后检查观察到的差异是否具有统计学意义。
首先,我们可以使用 make_classification()函数创建一个包含 1000 个样本和 20 个输入变量的合成数据集。
下面的示例创建数据集并总结其形状。
# create classification dataset
from sklearn.datasets import make_classification
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)
# summarize the dataset
print(X.shape, y.shape)
运行该示例会创建数据集并汇总行数和列数,从而证实了我们的预期。
我们可以将这些数据作为比较两种算法的基础。
(1000, 10) (1000,)
我们将在这个数据集上比较两种线性算法的表现。具体来说,一个逻辑回归算法和一个线性判别分析 (LDA)算法。
我喜欢的程序是使用重复的分层 k-fold 交叉验证,重复 10 次和 3 次。我们将使用此过程来评估每个算法,并返回和报告平均分类精确率。
下面列出了完整的示例。
# compare logistic regression and lda for binary classification
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from matplotlib import pyplot
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)
# evaluate model 1
model1 = LogisticRegression()
cv1 = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores1 = cross_val_score(model1, X, y, scoring='accuracy', cv=cv1, n_jobs=-1)
print('LogisticRegression Mean Accuracy: %.3f (%.3f)' % (mean(scores1), std(scores1)))
# evaluate model 2
model2 = LinearDiscriminantAnalysis()
cv2 = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores2 = cross_val_score(model2, X, y, scoring='accuracy', cv=cv2, n_jobs=-1)
print('LinearDiscriminantAnalysis Mean Accuracy: %.3f (%.3f)' % (mean(scores2), std(scores2)))
# plot the results
pyplot.boxplot([scores1, scores2], labels=['LR', 'LDA'], showmeans=True)
pyplot.show()
运行该示例首先报告每个算法的平均分类精确率。
注:考虑到算法或评估程序的随机性,或数值精确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
在这种情况下,结果表明,如果我们只看平均分数,线性判别分析的表现更好:逻辑回归为 89.2%,线性判别分析为 89.3%。
LogisticRegression Mean Accuracy: 0.892 (0.036)
LinearDiscriminantAnalysis Mean Accuracy: 0.893 (0.033)
还创建了一个方框和触须图,总结了准确度分数的分布。
这个情节将支持我选择 LDA 而不是 LR 的决定。
两种算法分类准确率的盒须图
现在我们可以使用假设检验来看看观察到的结果是否具有统计学意义。
首先,我们将使用 5×2 过程来评估算法,并计算 p 值和测试统计值。
...
# check if difference between algorithms is real
t, p = paired_ttest_5x2cv(estimator1=model1, estimator2=model2, X=X, y=y, scoring='accuracy', random_seed=1)
# summarize
print('P-value: %.3f, t-Statistic: %.3f' % (p, t))
然后我们可以用 5%的α值来解释 p 值。
...
# interpret the result
if p <= 0.05:
print('Difference between mean performance is probably real')
else:
print('Algorithms probably have the same performance')
将这些联系在一起,完整的示例如下所示。
# use 5x2 statistical hypothesis testing procedure to compare two machine learning algorithms
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from mlxtend.evaluate import paired_ttest_5x2cv
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)
# evaluate model 1
model1 = LogisticRegression()
cv1 = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores1 = cross_val_score(model1, X, y, scoring='accuracy', cv=cv1, n_jobs=-1)
print('LogisticRegression Mean Accuracy: %.3f (%.3f)' % (mean(scores1), std(scores1)))
# evaluate model 2
model2 = LinearDiscriminantAnalysis()
cv2 = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores2 = cross_val_score(model2, X, y, scoring='accuracy', cv=cv2, n_jobs=-1)
print('LinearDiscriminantAnalysis Mean Accuracy: %.3f (%.3f)' % (mean(scores2), std(scores2)))
# check if difference between algorithms is real
t, p = paired_ttest_5x2cv(estimator1=model1, estimator2=model2, X=X, y=y, scoring='accuracy', random_seed=1)
# summarize
print('P-value: %.3f, t-Statistic: %.3f' % (p, t))
# interpret the result
if p <= 0.05:
print('Difference between mean performance is probably real')
else:
print('Algorithms probably have the same performance')
运行这个例子,我们首先评估之前的算法,然后报告统计假设检验的结果。
注:考虑到算法或评估程序的随机性,或数值精确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
在这种情况下,我们可以看到 p 值约为 0.3,比 0.05 大得多。这导致我们无法拒绝零假设,这表明算法之间的任何观察到的差异可能都不是真实的。
我们可以很容易地选择逻辑回归或线性判别分析,两者的平均表现大致相同。
这突出表明,仅基于平均表现进行模型选择可能是不够的。
LogisticRegression Mean Accuracy: 0.892 (0.036)
LinearDiscriminantAnalysis Mean Accuracy: 0.893 (0.033)
P-value: 0.328, t-Statistic: 1.085
Algorithms probably have the same performance
回想一下,我们在报告绩效时使用的程序(3×10 CV)与统计测试中用于评估绩效的程序(5×2 CV)不同。如果我们使用五次重复的双重交叉验证来看分数,结果可能会有所不同?
更新以下示例,以使用 5×2 CV 报告每个算法的分类精确率。
# use 5x2 statistical hypothesis testing procedure to compare two machine learning algorithms
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.linear_model import LogisticRegression
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from mlxtend.evaluate import paired_ttest_5x2cv
# define dataset
X, y = make_classification(n_samples=1000, n_features=10, n_informative=10, n_redundant=0, random_state=1)
# evaluate model 1
model1 = LogisticRegression()
cv1 = RepeatedStratifiedKFold(n_splits=2, n_repeats=5, random_state=1)
scores1 = cross_val_score(model1, X, y, scoring='accuracy', cv=cv1, n_jobs=-1)
print('LogisticRegression Mean Accuracy: %.3f (%.3f)' % (mean(scores1), std(scores1)))
# evaluate model 2
model2 = LinearDiscriminantAnalysis()
cv2 = RepeatedStratifiedKFold(n_splits=2, n_repeats=5, random_state=1)
scores2 = cross_val_score(model2, X, y, scoring='accuracy', cv=cv2, n_jobs=-1)
print('LinearDiscriminantAnalysis Mean Accuracy: %.3f (%.3f)' % (mean(scores2), std(scores2)))
# check if difference between algorithms is real
t, p = paired_ttest_5x2cv(estimator1=model1, estimator2=model2, X=X, y=y, scoring='accuracy', random_seed=1)
# summarize
print('P-value: %.3f, t-Statistic: %.3f' % (p, t))
# interpret the result
if p <= 0.05:
print('Difference between mean performance is probably real')
else:
print('Algorithms probably have the same performance')
运行该示例会报告两种算法的平均精确率以及统计测试的结果。
注:考虑到算法或评估程序的随机性,或数值精确率的差异,您的结果可能会有所不同。考虑运行该示例几次,并比较平均结果。
在这种情况下,我们可以看到两种算法的平均表现差异甚至更大,89.4%对 89.0%支持逻辑回归,而不是我们在 3×10 CV 中看到的 LDA。
LogisticRegression Mean Accuracy: 0.894 (0.012)
LinearDiscriminantAnalysis Mean Accuracy: 0.890 (0.013)
P-value: 0.328, t-Statistic: 1.085
Algorithms probably have the same performance
进一步阅读
如果您想更深入地了解这个主题,本节将提供更多资源。
教程
报纸
- 比较监督分类学习算法的近似统计测试,1998。
蜜蜂
摘要
在本教程中,您发现了如何使用统计假设测试来比较机器学习算法。
具体来说,您了解到:
- 基于平均模型表现执行模型选择可能会产生误导。
- 使用修改后的学生 t-Test 进行五次重复的双重交叉验证是比较机器学习算法的良好实践。
- 如何使用 MLxtend 机器学习来比较使用统计假设检验的算法。
你有什么问题吗? 在下面的评论中提问,我会尽力回答。
Python 机器学习中的随机数生成器简介
原文:
machinelearningmastery.com/introduction-to-random-number-generators-for-machine-learning/
随机性是机器学习的重要组成部分。
随机性被用作准备数据的工具或特征,以及用于将输入数据映射到输出数据以便做出预测的学习算法。
为了理解机器学习中统计方法的必要性,您必须了解机器学习中随机性的来源。机器学习中的随机性源是一种称为伪随机数发生器的数学技巧。
在本教程中,您将发现伪随机数生成器以及何时控制和控制机器学习中的随机性。
完成本教程后,您将了解:
- 应用机器学习中随机性的来源,侧重于算法。
- 什么是伪随机数生成器以及如何在 Python 中使用它们。
- 何时控制随机数的序列以及何时控制随机数。
让我们开始吧。
用于机器学习的随机数发生器的介绍 照片由 LadyDragonflyCC - &gt ;;&lt; ,保留一些权利。
教程概述
本教程分为 5 个部分;他们是:
- 机器学习中的随机性
- 伪随机数发生器
- 何时播种随机数发生器
- 如何控制随机性
- 常见问题
机器学习中的随机性
应用机器学习中有许多随机性来源。
随机性被用作帮助学习算法更加稳健并最终导致更好的预测和更准确的模型的工具。
让我们看几个随机性来源。
数据的随机性
我们从域中收集的数据样本中有一个随机元素,我们将用它来训练和评估模型。
数据可能有错误或错误。
更深刻的是,数据包含的噪声可能会掩盖输入和输出之间清晰的关系。
评估中的随机性
我们无法访问域中的所有观察结果。
我们只使用一小部分数据。因此,我们在评估模型时利用随机性,例如使用 k 折交叉验证来拟合和评估可用数据集的不同子集上的模型。
我们这样做是为了了解模型如何平均工作而不是特定的数据集。
算法中的随机性
机器学习算法在从数据样本中学习时使用随机性。
这是一个特征,其中随机性允许算法实现比不使用随机性更好的数据映射。随机性是一种特征,它允许算法尝试避免过拟合小训练集并推广到更广泛的问题。
使用随机性的算法通常称为随机算法而不是随机算法。这是因为尽管使用了随机性,但是所得到的模型被限制在更窄的范围内,例如,喜欢有限的随机性。
机器学习算法中使用的一些明显的随机性示例包括:
- 在随机梯度下降的每个训练时期之前改组训练数据。
- 随机森林算法中为吐点选择的输入特征的随机子集。
- 人工神经网络中的随机初始权重。
我们可以看到,我们必须控制两种随机性源,例如数据中的噪声,以及我们可以控制的随机源,例如算法评估和算法本身。
接下来,让我们看一下我们在算法和程序中使用的随机源。
伪随机数生成器
我们注入到程序和算法中的随机源是一种称为伪随机数生成器的数学技巧。
随机数生成器是从真实的随机源生成随机数的系统。经常是物理的东西,比如盖革计数器,结果变成随机数。甚至还有从您可以购买的物理来源生成的随机数书,例如:
我们在机器学习中不需要真正的随机性。相反,我们可以使用伪随机性。伪随机性是看起来接近随机的数字样本,但是使用确定性过程生成。
随机值改组数据和初始化系数使用伪随机数生成器。这些小程序通常是一个可以调用的函数,它将返回一个随机数。再次调用,他们将返回一个新的随机数。包装函数通常也可用,允许您将随机性作为整数,浮点,特定分布,特定范围内等等。
数字按顺序生成。序列是确定性的,并以初始数字播种。如果您没有显式地为伪随机数生成器设定种子,那么它可以使用当前系统时间(以秒或毫秒为单位)作为种子。
种子的价值无关紧要。选择你想要的任何东西重要的是,该过程的相同种子将导致相同的随机数序列。
让我们通过一些例子来具体化。
Python 中的伪随机数生成器
Python 标准库提供了一个名为 random 的模块,它提供了一组用于生成随机数的函数。
Python 使用一种流行且强大的伪随机数生成器,称为 Mersenne Twister 。
可以通过调用 random.seed() 函数来播种伪随机数发生器。通过调用 random.random() 函数可以生成 0 到 1 之间的随机浮点值。
以下示例为伪随机数生成器播种,生成一些随机数,然后重新种子以证明生成了相同的数字序列。
# demonstrates the python pseudorandom number generator
from random import seed
from random import random
# seed the generator
seed(7)
for _ in range(5):
print(random())
# seed the generator to get the same sequence
print('Reseeded')
seed(7)
for _ in range(5):
print(random())
运行该示例将打印五个随机浮点值,然后重新生成伪随机数生成器后的相同五个浮点值。
0.32383276483316237
0.15084917392450192
0.6509344730398537
0.07243628666754276
0.5358820043066892
Reseeded
0.32383276483316237
0.15084917392450192
0.6509344730398537
0.07243628666754276
0.5358820043066892
NumPy 中的伪随机数生成器
在机器学习中,您可能正在使用诸如 scikit-learn 和 Keras 之类的库。
这些库使用了 NumPy,这个库可以非常有效地处理数字的向量和矩阵。
NumPy 还有自己的伪随机数生成器和便捷包装函数的实现。
NumPy 还实现了 Mersenne Twister 伪随机数生成器。重要的是,播种 Python 伪随机数生成器不会影响 NumPy 伪随机数生成器。它必须单独播种和使用。
以下示例为伪随机数生成器提供种子,生成五个随机浮点值的数组,再次为生成器播种,并演示生成相同的随机数序列。
# demonstrates the numpy pseudorandom number generator
from numpy.random import seed
from numpy.random import rand
# seed the generator
seed(7)
print(rand(5))
# seed the generator to get the same sequence
print('Reseeded')
seed(7)
print(rand(5))
在重新生成发生器之后,运行该示例将打印第一批数字和相同的第二批数字。
[0.07630829 0.77991879 0.43840923 0.72346518 0.97798951]
Reseeded
[0.07630829 0.77991879 0.43840923 0.72346518 0.97798951]
现在我们知道如何生成受控随机性,让我们看看我们可以有效地使用它的位置。
何时播种随机数发生器
在预测性建模项目中,有时您应该考虑播种随机数生成器。
我们来看两个案例:
- 数据准备。数据准备可以使用随机性,例如数据的混洗或值的选择。数据准备必须一致,以便在拟合,评估和使用最终模型做出预测时始终以相同的方式准备数据。 Data Splits 。必须一致地进行数据的分割,例如用于训练/测试分割或 k 折叠交叉验证。这是为了确保在相同的数据子样本上以相同的方式训练和评估每个算法。
您可能希望在每个任务之前或在执行一批任务之前为伪随机数生成器播种一次。一般无关紧要。
有时您可能希望算法的行为一致,也许是因为它每次都在完全相同的数据上进行训练。如果在生产环境中使用该算法,则可能发生这种情况。如果您在教程环境中演示算法,也可能会发生这种情况。
在这种情况下,在拟合算法之前初始化种子可能是有意义的。
如何控制随机性
随机机器学习算法每次在相同数据上运行时都会略有不同。
这将导致每次训练时表现略有不同的模型。
如上所述,我们每次都可以使用相同的随机数序列来拟合模型。在评估模型时,这是一种不好的做法,因为它隐藏了模型中固有的不确定性。
更好的方法是以这样的方式评估算法,使得报告的表现包括算法表现中测量的不确定性。
我们可以通过用不同的随机数序列重复多次算法评估来做到这一点。伪随机数发生器可以在评估开始时播种一次,或者可以在每次评估开始时用不同的种子播种。
这里要考虑两个方面的不确定性:
- 数据不确定性:评估多个数据分割的算法将深入了解算法表现如何随训练和测试数据的变化而变化。
- 算法不确定性:在相同的数据分割上多次评估算法,可以深入了解算法表现如何单独变化。
总的来说,我建议报告这两种不确定因素的总和。这是算法适合每次评估运行的数据的不同分割并具有新的随机序列的地方。评估程序可以在开始时对随机数生成器进行一次播种,并且该过程可以重复大约 30 次或更多次,以给出可以概括的表现分数群。
这将对模型表现进行公平的描述,同时考虑到训练数据和学习算法本身的差异。
常见问题
我可以预测随机数吗? 即使使用深度神经网络,也无法预测随机数的序列。
真正的随机数会带来更好的结果吗? 据我所知,除非您正在使用物理过程的模拟,否则使用真实随机性通常无济于事。
最终型号怎么样? 最终模型是所选择的算法和配置,可以使用所有可用的训练数据做出预测。该模型的表现将落在评估模型的方差范围内。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 确认播种 Python 伪随机数生成器不会影响 NumPy 伪随机数生成器。
- 开发在范围和高斯随机数之间生成整数的示例。
- 找到方程式并实现一个非常简单的伪随机数生成器。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
帖子
API
用品
摘要
在本教程中,您发现了随机性在应用机器学习中的作用以及如何控制和利用它。
具体来说,你学到了:
- 机器学习具有随机性源,例如数据样本和算法本身。
- 使用伪随机数生成器将随机性注入到程序和算法中。
- 有时候随机性需要仔细控制,以及需要控制随机性的时间。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
k 折交叉验证的温和介绍
交叉验证是用于估计机器学习模型技能的统计方法。
它通常用于应用机器学习,以比较和选择给定预测性建模问题的模型,因为它易于理解,易于实现,并且导致技能估计通常具有比其他方法更低的偏差。
在本教程中,您将发现 k-fold 交叉验证程序的简要介绍,用于估计机器学习模型的技能。
完成本教程后,您将了解:
- 该 k 折交叉验证是用于估计模型对新数据的技能的过程。
- 您可以使用常用的策略为数据集选择 k 的值。
- 在交叉验证中存在常用的变体,例如 scikit-learn 中可用的分层和重复。
让我们开始吧。
k-fold 交叉验证的温和介绍 Jon Baldock 的照片,保留一些权利。
教程概述
本教程分为 5 个部分;他们是:
- k-fold 交叉验证
- 配置 k
- 工作示例
- 交叉验证 API
- 交叉验证的变化
k-fold 交叉验证
交叉验证是一种重采样程序,用于评估有限数据样本的机器学习模型。
该过程有一个名为 k 的参数,它指的是给定数据样本要分组的组数。因此,该过程通常称为 k 折交叉验证。当选择 k 的特定值时,可以使用它代替模型参考中的 k,例如 k = 10 变为 10 倍交叉验证。
交叉验证主要用于应用机器学习,以估计机器学习模型对未见数据的技能。也就是说,使用有限样本来估计模型在用于对模型训练期间未使用的数据做出预测时通常如何执行。
这是一种流行的方法,因为它易于理解,并且因为它通常比其他方法(例如简单的训练/测试分割)导致对模型技能的偏差或不太乐观的估计。
一般程序如下:
- 随机随机播放数据集。
- 将数据集拆分为 k 个组
- 对于每个独特的组:
- 将该组作为保留或测试数据集
- 将剩余的组作为训练数据集
- 在训练集上拟合模型并在测试集上进行评估
- 保留评估分数并丢弃模型
- 使用模型评估分数样本总结模型的技能
重要的是,数据样本中的每个观察结果都被分配给一个单独的组,并在该过程的持续时间内保留在该组中。这意味着每个样本都有机会在保持集 1 中使用并用于训练模型 k-1 次。
该方法涉及将观察组随机地划分为大小相等的 k 组或折叠。第一个折叠被视为验证集,并且该方法适合剩余的 k-1 倍。
- 第 181 页,统计学习导论,2013。
同样重要的是,在拟合模型之前的任何数据准备都发生在循环内的 CV 分配的训练数据集上而不是更广泛的数据集上。这也适用于超参数的任何调整。在循环内未能执行这些操作可能导致数据泄漏和模型技能的乐观估计。
尽管统计方法学家付出了最大努力,但用户经常无意中偷看测试数据,从而使他们的结果无效。
- 第 708 页,人工智能:现代方法(第 3 版),2009。
k 次交叉验证运行的结果通常用模型技能得分的平均值来概括。优良作法是包括技能分数方差的度量,例如标准偏差或标准误差。
配置 k
必须仔细选择 k 值作为数据样本。
选择不当的 k 值可能会导致对模型技能的错误代表性概念,例如具有高方差的分数(可能会根据用于拟合模型的数据而发生很大变化)或高偏差,(例如高估模型的技巧)。
选择 k 值的三种常用策略如下:
- 代表性:选择 k 的值使得每个训练/测试组的数据样本足够大以在统计上代表更广泛的数据集。
- k = 10 :k 的值固定为 10,这是通过实验发现的值,通常导致具有低偏差的模型技能估计,适度方差。
- k = n :k 的值固定为 n,其中 n 是数据集的大小,以便为每个测试样本提供在保留数据集中使用的机会。这种方法称为留一交叉验证。
k 的选择通常是 5 或 10,但没有正式的规则。随着 k 变大,训练集和重采样子集之间的大小差异变小。随着这种差异减小,技术的偏差变小
- 第 70 页, Applied Predictive Modeling ,2013。
k = 10 的值在应用机器学习领域非常普遍,如果您在努力为数据集选择值,则建议使用 k = 10。
总而言之,在 k 折交叉验证中存在与 k 选择相关的偏方差权衡。通常,考虑到这些考虑因素,使用 k = 5 或 k = 10 执行 k 折交叉验证,因为这些值已经凭经验显示以产生既不受过高偏差也不受非常高方差影响的测试误差率估计。
- 第 184 页,统计学习导论,2013。
如果选择的 k 值不能均匀地分割数据样本,则一个组将包含其余的示例。优选地将数据样本分成具有相同数量的样本的 k 个组,使得模型技能分数的样本都是等效的。
工作示例
为了使交叉验证过程具体,让我们看一个有效的例子。
想象一下,我们有一个包含 6 个观察结果的数据样本:
[0.1, 0.2, 0.3, 0.4, 0.5, 0.6]
第一步是为 k 选择一个值,以确定用于拆分数据的折叠数。在这里,我们将使用 k = 3 的值。这意味着我们将对数据进行洗牌,然后将数据分成 3 组。因为我们有 6 个观测值,每个群体将有相同数量的 2 个观测值。
例如:
Fold1: [0.5, 0.2]
Fold2: [0.1, 0.3]
Fold3: [0.4, 0.6]
然后我们可以使用该样本,例如评估机器学习算法的技能。
每个折叠都训练和评估三个模型,有机会成为保持测试集。
For example:
- Model1 :在 Fold1 + Fold2 上训练,在 Fold3 上测试
- Model2 :在 Fold2 + Fold3 上训练,在 Fold1 上测试
- Model3 :在 Fold1 + Fold3 上训练,在 Fold2 上测试
然后在评估模型之后将它们丢弃,因为它们已经达到了目的。
收集每个模型的技能分数并汇总使用。
交叉验证 API
我们不必手动实现 k 折交叉验证。 scikit-learn 库提供了一个实现,可以将给定的数据样本分开。
可以使用KFold()scikit-learn 类。它取决于分裂的数量,是否对样本进行混洗,以及在混洗之前使用的伪随机数生成器的种子。
例如,我们可以创建一个实例,将数据集拆分为 3 倍,在拆分之前进行混洗,并为伪随机数生成器使用值 1。
kfold = KFold(3, True, 1)
然后可以在提供数据样本作为参数的类上调用 split() 函数。重复调用,拆分将返回每组训练和测试集。具体而言,返回包含索引的数组到观察的原始数据样本中,以用于每次迭代的训练和测试集。
例如,我们可以使用创建的KFold实例枚举数据样本的索引拆分,如下所示:
# enumerate splits
for train, test in kfold.split(data):
print('train: %s, test: %s' % (train, test))
我们可以将所有这些与我们在前一部分的工作示例中使用的小数据集结合在一起。
# scikit-learn k-fold cross-validation
from numpy import array
from sklearn.model_selection import KFold
# data sample
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6])
# prepare cross validation
kfold = KFold(3, True, 1)
# enumerate splits
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train], data[test]))
运行该示例将打印为每个训练和测试集选择的特定观察值。索引直接用于原始数据数组以检索观察值。
train: [0.1 0.4 0.5 0.6], test: [0.2 0.3]
train: [0.2 0.3 0.4 0.6], test: [0.1 0.5]
train: [0.1 0.2 0.3 0.5], test: [0.4 0.6]
有用的是,scikit-learn 中的 k-fold 交叉验证实现作为更广泛方法中的组件操作提供,例如网格搜索模型超参数和对数据集上的模型评分。
然而,KFold类可以直接使用,以便在建模之前分割数据集,使得所有模型将使用相同的数据分割。如果您正在处理非常大的数据样本,这将特别有用。在算法中使用相同的拆分可以为您稍后可能希望对数据执行的统计测试带来好处。
交叉验证的变化
k 折交叉验证程序有许多变化。
三种常用的变体如下:
- 训练/测试分割:取一个极端,k 可以设置为 1,这样就可以创建单个训练/测试分裂来评估模型。
- LOOCV :从另一个极端来看,k 可以设置为数据集中观察的总数,使得每个观察结果都有机会被保留在数据集之外。这称为留一交叉验证,或简称 LOOCV。
- 分层:将数据分成折叠可以通过诸如确保每个折叠具有相同比例的具有给定分类值的观察值(例如类结果值)的标准来控制。这称为分层交叉验证。
- 重复:这是 k 次交叉验证程序重复 n 次的地方,其中重要的是,数据样本在每次重复之前进行混洗,这导致样本的不同分裂。
scikit-learn 库提供了一套交叉验证实现。您可以在模型选择 API 中查看完整列表。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 查找 3 个机器学习研究论文,使用 10 的值进行 k 折交叉验证。
- 使用 k-fold 交叉验证编写自己的函数来分割数据样本。
- 开发示例以演示 scikit-learn 支持的每种主要交叉验证类型。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
帖子
- 如何在 Python 中从零开始实现重采样方法
- 使用重采样评估 Python 中机器学习算法的表现
- 测试和验证数据集有什么区别?
- 机器学习中的数据泄漏
图书
- Applied Predictive Modeling ,2013。
- 统计学习导论,2013 年。
- 人工智能:现代方法(第 3 版),2009。
API
用品
- 维基百科上的重新取样(统计)
- 维基百科的交叉验证(统计)
摘要
在本教程中,您发现了 k-fold 交叉验证程序的简要介绍,用于估计机器学习模型的技能。
具体来说,你学到了:
- 该 k 折交叉验证是用于估计模型对新数据的技能的过程。
- 您可以使用常用的策略为数据集选择 k 的值。
- 交叉验证中常用的变体,例如分层和重复,可用于 scikit-learn。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何计算 McNemar 检验来比较两种机器学习分类器
原文:
machinelearningmastery.com/mcnemars-test-for-machine-learning/
统计假设检验的选择对于解释机器学习结果是一个具有挑战性的开放性问题。
在他 1998 年被广泛引用的论文中,Thomas Dietterich 在那些训练多份分类器模型昂贵或不切实际的案例中推荐了 McNemar 的测试。
这描述了深度学习模型的当前情况,这些模型非常大并且在大型数据集上进行训练和评估,通常需要数天或数周来训练单个模型。
在本教程中,您将了解如何使用 McNemar 的统计假设检验来比较单个测试数据集上的机器学习分类器模型。
完成本教程后,您将了解:
- McNemar 测试对于训练昂贵的模型的建议,适合大型深度学习模型。
- 如何将两个分类器的预测结果转换为列联表,以及如何使用该表来计算 McNemar 测试中的统计量。
- 如何用 Python 计算 McNemar 的测试并解释和报告结果。
让我们开始吧。
如何计算 McNemar 对两台机器学习量词的测试 Mark Kao 的照片,保留一些权利。
教程概述
本教程分为五个部分;他们是:
- 深度学习的统计假设检验
- 列联表
- 麦克尼玛的测试统计
- 解读 McNemar 的分类器测试
- McNemar 的 Python 测试
深度学习的统计假设检验
在他 1998 年重要且广泛引用的关于使用统计假设检验来比较标题为“近似统计检验比较监督分类学习算法”的论文中,Thomas Dietterich 建议使用 McNemar 检验。
具体而言,建议在那些被比较的算法只能评估一次的情况下进行测试,例如,在一个测试集上,而不是通过重采样技术重复评估,例如 k 折交叉验证。
对于只能执行一次的算法,McNemar 的测试是唯一具有可接受的 I 类错误的测试。
- 用于比较监督分类学习算法的近似统计检验,1998。
具体而言,Dietterich 的研究涉及不同统计假设检验的评估,其中一些检验采用重采样方法的结果。该研究的关注点是 I 型错误,即统计检验报告实际上没有效果时的效果(假阳性)。
可以比较基于单个测试集的模型的统计测试是现代机器学习的重要考虑因素,特别是在深度学习领域。
深度学习模型通常很大,可以在非常大的数据集上运行。总之,这些因素可能意味着在快速的现代硬件上对模型的训练可能需要数天甚至数周。
这排除了重采样方法的实际应用以比较模型,并建议需要使用可以对在单个测试数据集上评估训练模型的结果进行操作的测试。
McNemar 的测试可能是评估这些大型和慢速训练深度学习模型的合适测试。
列联表
McNemar 的测试按照列联表进行。
在我们深入测试之前,让我们花一点时间来理解如何计算两个分类器的列联表。
列联表是两个分类变量的列表或计数。在 McNemar 测试的情况下,我们感兴趣的是二进制变量正确/不正确或是/否对于对照和治疗或两种情况。这被称为 2×2 列联表。
列表的列联表乍一看可能不直观。让我们通过一个有效的例子来具体化。
考虑一下我们有两个训练有素的分类器。每个分类器对测试数据集中的 10 个示例中的每个示例进行二进制类预测。预测被评估并确定为正确或不正确。
然后我们可以在表格中总结这些结果,如下所示:
Instance, Classifier1 Correct, Classifier2 Correct
1 Yes No
2 No No
3 No Yes
4 No No
5 Yes Yes
6 Yes Yes
7 Yes Yes
8 No No
9 Yes No
10 Yes Yes
我们可以看到 Classifier1 得到 6 个正确,或者精度为 60%,Classifier2 得到 5 个正确,或者在测试集上有 50%的准确度。
该表现在可以简化为列联表。
列联表依赖于两个分类器都在完全相同的训练数据上训练并在完全相同的测试数据实例上进行评估的事实。
列联表具有以下结构:
Classifier2 Correct, Classifier2 Incorrect
Classifier1 Correct ?? ??
Classifier1 Incorrect ?? ??
对于表中第一个单元格,我们必须将 Classifier1 得到正确且 Classifier2 正确的测试实例总数相加。例如,两个分类器正确预测的第一个实例是实例编号 5.两个分类器正确预测的实例总数为 4。
考虑这一点的另一种更具编程性的方法是在上面的结果表中总结是/否的每个组合。
Classifier2 Correct, Classifier2 Incorrect
Classifier1 Correct Yes/Yes Yes/No
Classifier1 Incorrect No/Yes No/No
将结果组织成一个列联表如下:
Classifier2 Correct, Classifier2 Incorrect
Classifier1 Correct 4 2
Classifier1 Incorrect 1 3
麦克尼玛的测试统计
McNemar 的测试是一个配对的非参数或无分布的统计假设检验。
它也不像其他一些统计假设检验那么直观。
McNemar 的测试是检查两个案件之间的分歧是否匹配。从技术上讲,这被称为列联表的同质性(特别是边际同质性)。因此,McNemar 的测试是一种应变表的同质性测试。
该试验广泛用于医学中以比较治疗对照的效果。
在比较两个二分类算法方面,测试是评论两个模型是否以相同的方式不同意。它没有评论一个模型是否比另一个模型更准确或更准确或更容易出错。当我们查看统计量的计算方式时,这一点很清楚。
McNemar 的检验统计量计算如下:
statistic = (Yes/No - No/Yes)² / (Yes/No + No/Yes)
其中 Yes / No 是 Classifier1 正确且 Classifier2 不正确的测试实例的数量,No / Yes 是 Classifier1 不正确且 Classifier2 正确的测试实例的计数。
测试统计量的这种计算假定计算中使用的列联表中的每个单元具有至少 25 的计数。检验统计量具有 1 自由度的卡方分布。
我们可以看到只使用列联表的两个元素,特别是在计算测试统计量时不使用是/是和否/否元素。因此,我们可以看到统计量报告了两个模型之间不同的正确或不正确的预测,而不是准确率或错误率。在了解统计量的发现时,这一点非常重要。
测试的默认假设或零假设是两个案例不同意相同的数量。如果零假设被拒绝,则表明有证据表明案例在不同方面存在分歧,即分歧存在偏差。
给定显着性水平的选择,通过测试计算的 p 值可以解释如下:
- p&gt; α:不能拒绝 H0,在分歧上没有差异(例如治疗没有效果)。
- p <=α:排斥 H0,不一致的显着差异(例如治疗有效)。
解读 McNemar 的分类器测试
重要的是花点时间清楚地理解如何在两个机器学习分类器模型的上下文中解释测试结果。
计算 McNemar 测试时使用的两个术语捕获了两个模型的误差。具体而言,列联表中的 No / Yes 和 Yes / No 单元格。该测试检查这两个单元格中的计数之间是否存在显着差异。就这些。
如果这些单元格具有相似的计数,则向我们显示两个模型在大小相同的比例中产生错误,仅在测试集的不同实例上。在这种情况下,测试结果不会很明显,零假设也不会被拒绝。
在零假设下,两种算法应该具有相同的错误率......
— Approximate Statistical Tests for Comparing Supervised Classification Learning Algorithm, 1998.
如果这些单元格具有不相似的计数,则表明两个模型不仅产生不同的错误,而且实际上在测试集上具有不同的相对错误比例。在这种情况下,测试的结果将是显着的,我们将拒绝零假设。
因此,我们可以拒绝零假设,以支持两种算法在特定训练中训练时具有不同表现的假设
— Approximate Statistical Tests for Comparing Supervised Classification Learning Algorithm, 1998.
我们可以总结如下:
- 无法拒绝空假设:分类器在测试集上的错误比例相似。
- 拒绝空假设:分类器在测试集上具有不同的错误比例。
在执行测试并找到显着结果之后,报告效果统计测量以量化该发现可能是有用的。例如,一个自然的选择是报告优势比,或列联表本身,尽管这两者都假定一个复杂的读者。
报告测试集上两个分类器之间的差异可能很有用。在这种情况下,请小心您的声明,因为重要测试不会报告模型之间的误差差异,只会报告模型之间误差比例的相对差异。
最后,在使用 McNemar 的测试时,Dietterich 强调了必须考虑的两个重要限制。他们是:
1.没有训练集或模型可变性的度量。
通常,模型行为根据用于拟合模型的特定训练数据而变化。
这是由于模型与特定训练实例的相互作用以及学习期间随机性的使用。将模型拟合到多个不同的训练数据集上并评估技能,就像重采样方法一样,提供了一种测量模型方差的方法。
如果可变性的来源很小,则该测试是合适的。
因此,只有当我们认为这些可变性来源很小时,才应该应用 McNemar 的测试。
— Approximate Statistical Tests for Comparing Supervised Classification Learning Algorithm, 1998.
2.较少的模型直接比较
在单个测试集上评估两个分类器,并且预期测试集小于训练集。
这与使用重采样方法的假设检验不同,因为在评估过程中,如果不是全部数据集的更多(如果不是全部)可用作测试集(从统计角度介绍其自身的问题)。
这提供了较少的机会来比较模型的表现。它要求测试集合适当地代表域,通常意味着测试数据集很大。
McNemar 的 Python 测试
可以使用 mcnemar()Statsmodels 函数在 Python 中实现 McNemar 的测试。
该函数将列联表作为参数,并返回计算的测试统计量和 p 值。
根据数据量,有两种方法可以使用统计量。
如果表中有一个单元用于计算计数小于 25 的测试统计量,则使用测试的修改版本,使用二项分布计算精确的 p 值。这是测试的默认用法:
stat, p = mcnemar(table, exact=True)
或者,如果在列联表中计算测试统计量时使用的所有单元具有 25 或更大的值,则可以使用测试的标准计算。
stat, p = mcnemar(table, exact=False, correction=True)
我们可以在上面描述的示例列联表上计算 McNemar。这个列联表在两个不同的单元中都有一个小的计数,因此必须使用确切的方法。
下面列出了完整的示例。
# Example of calculating the mcnemar test
from statsmodels.stats.contingency_tables import mcnemar
# define contingency table
table = [[4, 2],
[1, 3]]
# calculate mcnemar test
result = mcnemar(table, exact=True)
# summarize the finding
print('statistic=%.3f, p-value=%.3f' % (result.statistic, result.pvalue))
# interpret the p-value
alpha = 0.05
if result.pvalue > alpha:
print('Same proportions of errors (fail to reject H0)')
else:
print('Different proportions of errors (reject H0)')
运行该示例计算列联表上的统计值和 p 值并打印结果。
我们可以看到,该测试强烈证实两种情况之间的分歧差别很小。零假设没有被拒绝。
当我们使用测试来比较分类器时,我们指出两个模型之间的分歧没有统计学上的显着差异。
statistic=1.000, p-value=1.000
Same proportions of errors (fail to reject H0)
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 在机器学习中找到一篇利用 McNemar 统计假设检验的研究论文。
- 更新代码示例,以便列联表显示两种情况之间不一致的显着差异。
- 实现一个函数,该函数将根据提供的列联表使用正确版本的 McNemar 测试。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
文件
- 关于相关比例或百分比之间差异的采样误差的注释,1947。
- 用于比较监督分类学习算法的近似统计检验,1998。
API
用品
摘要
在本教程中,您了解了如何使用 McNemar 的测试统计假设检验来比较单个测试数据集上的机器学习分类器模型。
具体来说,你学到了:
- McNemar 测试对于训练昂贵的模型的建议,适合大型深度学习模型。
- 如何将两个分类器的预测结果转换为列联表,以及如何使用该表来计算 McNemar 测试中的统计量。
- 如何用 Python 计算 McNemar 的测试并解释和报告结果。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
Python 中非参数统计显着性检验简介
原文:
machinelearningmastery.com/nonparametric-statistical-significance-tests-in-python/
在应用机器学习中,我们经常需要确定两个数据样本是否具有相同或不同的分布。
我们可以使用统计显着性检验来回答这个问题,这些检验可以量化样本具有相同分布的可能性。
如果数据没有熟悉的高斯分布,我们必须求助于非参数版本的显着性检验。这些测试以类似的方式操作,但是无分布,要求在可以执行测试之前首先将实值数据转换为等级数据。
在本教程中,您将发现非参数统计测试,您可以使用它来确定数据样本是否来自具有相同或不同分布的群体。
完成本教程后,您将了解:
- 用于比较独立数据样本的 Mann-Whitney U 检验:Student t 检验的非参数版本。
- 用于比较配对数据样本的 Wilcoxon 符号秩检验:配对 Student t 检验的非参数版本。
- Kruskal-Wallis H 和 Friedman 测试用于比较两个以上的数据样本:ANOVA 的非参数版本和重复测量 ANOVA 测试。
让我们开始吧。
- 更新于 May / 2018 :改进了拒绝与拒绝统计测试的语言。
Python 中的非参数统计显着性检验介绍 Jirka Matousek 的照片,保留一些权利。
教程概述
本教程分为 6 个部分;他们是:
- 非参数统计显着性检验
- 测试数据
- Mann-Whitney U 测试
- 威尔科克森签名等级测试
- Kruskal-Wallis H 测试
- 弗里德曼测试
非参数统计显着性检验
非参数统计是那些不假设对数据进行特定分配的方法。
通常,它们指的是不采用高斯分布的统计方法。它们被开发用于序数或区间数据,但实际上也可以用于数据样本中的实值观测值的排序,而不是观察值本身。
关于两个或更多数据集的常见问题是它们是否不同。具体而言,它们的集中趋势(例如平均值或中值)之间的差异是否具有统计学意义。
对于没有使用非参数统计显着性检验的高斯分布的数据样本,可以回答这个问题。这些测试的零假设通常假设两个样本都来自具有相同分布的群体,因此具有相同的群体参数,例如平均值或中值。
如果在计算两个或更多样本的显着性检验后,零假设被拒绝,则表明有证据表明样本来自不同的群体,反过来是样本估计的人口参数之间的差异,例如平均值或中位数可能很重要。
这些测试通常用于模型技能分数的样本,以确认机器学习模型之间的技能差异是显着的。
通常,每个测试计算一个测试统计量,必须用统计学中的一些背景解释并对统计测试本身有更深入的了解。测试还返回一个 p 值,可用于解释测试结果。 p 值可以被认为是在给定基本假设(零假设)的情况下观察两个数据样本的概率,即两个样本是从具有相同分布的群体中抽取的。
可以在称为α的所选显着性水平的上下文中解释 p 值。 alpha 的常见值为 5%或 0.05。如果 p 值低于显着性水平,则测试表明有足够的证据拒绝零假设,并且样本可能来自具有不同分布的群体。
- p <= alpha :拒绝 H0,分布不同。
- p&gt; alpha :无法拒绝 H0,相同的分布。
测试数据集
在我们查看特定的非参数重要性测试之前,让我们首先定义一个测试数据集,我们可以用它来演示每个测试。
我们将生成从不同分布中抽取的两个样本。为简单起见,我们将从高斯分布中抽取样本,尽管如上所述,我们在本教程中审查的测试是针对我们不知道或假设任何特定分布的数据样本。
我们将使用 randn()NumPy 函数在每个样本中生成 100 个高斯随机数的样本,平均值为 0,标准差为 1.第一个样本中的观察值被缩放为具有均值标准偏差为 50,标准偏差为 5.将第二个样品中的观察结果缩放为平均值为 51,标准偏差为 5。
我们希望统计检验发现样本来自不同的分布,尽管每个样本 100 个观察值的小样本量会给这个决定增加一些噪音。
完整的代码示例如下所示。
# generate gaussian data samples
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import std
# seed the random number generator
seed(1)
# generate two sets of univariate observations
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# summarize
print('data1: mean=%.3f stdv=%.3f' % (mean(data1), std(data1)))
print('data2: mean=%.3f stdv=%.3f' % (mean(data2), std(data2)))
运行该示例生成数据样本,然后计算并打印每个样本的均值和标准差,确认它们的不同分布。
data1: mean=50.303 stdv=4.426
data2: mean=51.764 stdv=4.660
Mann-Whitney U 测试
Mann-Whitney U 检验是一种非参数统计显着性检验,用于确定是否从具有相同分布的群体中抽取两个独立样本。
该测试以 Henry Mann 和 Donald Whitney 的名字命名,虽然它有时被称为 Wilcoxon-Mann-Whitney 测试,也以 Frank Wilcoxon 命名,他也开发了测试的变体。
将两个样本组合在一起并排序。策略是确定来自两个样本的值是否在等级排序中随机混合,或者如果它们在组合时聚集在相对的末端。随机排名顺序意味着两个样本没有不同,而一个样本值的集群将指示它们之间的差异。
- 第 58 页,非统计学家的非参数统计:循序渐进的方法,2009 年。
默认假设或零假设是数据样本的分布之间没有差异。拒绝这一假设表明样本之间可能存在一些差异。更具体地,该测试确定来自一个样本的任何随机选择的观察是否同样可能大于或小于另一个分布中的样本。如果违反,则表明不同的分布。
- 无法拒绝 H0 :样本分布相等。
- 拒绝 H0 :样本分布不相等。
为使测试有效,每个数据样本至少需要 20 次观察。
我们可以使用 mannwhitneyu()SciPy 函数在 Python 中实现 Mann-Whitney U 测试。这些函数将两个数据样本作为参数。它返回测试统计和 p 值。
下面的示例演示了测试数据集上的 Mann-Whitney U 测试。
# Mann-Whitney U test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import mannwhitneyu
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# compare samples
stat, p = mannwhitneyu(data1, data2)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distribution (fail to reject H0)')
else:
print('Different distribution (reject H0)')
运行该示例计算数据集上的测试并打印统计量和 p 值。
p 值强烈表明样本分布是不同的,如预期的那样。
Statistics=4025.000, p=0.009
Different distribution (reject H0)
威尔科克森签名等级测试
在某些情况下,数据样本可以配对。
有许多原因可能是这种情况,例如,样品是相关的或以某种方式匹配或代表相同技术的两次测量。更具体地,每个样本是独立的,但来自相同的群体。
机器学习中的配对样本的示例可以是在不同数据集上评估的相同算法,或者在完全相同的训练和测试数据上评估的不同算法。
样品不是独立的,因此不能使用 Mann-Whitney U 检验。相反,使用 Wilcoxon 符号秩检验,也称为 Wilcoxon T 检验,以 Frank Wilcoxon 命名。它相当于配对 T 检验,但是对于排序数据而不是具有高斯分布的实值数据。
Wilcoxon 签名等级测试是一种非参数统计程序,用于比较配对或相关的两个样本。与 Wilcoxon 签名等级测试相对应的参数等名称包括 Student's t 检验,匹配对的 t 检验,配对样本的 t 检验或依赖样本的 t 检验。
- 第 38-39 页,非统计学家的非参数统计:循序渐进的方法,2009。
测试的默认假设,即零假设,即两个样本具有相同的分布。
- 无法拒绝 H0 :样本分布相等。
- 拒绝 H0 :样本分布不相等。
For the test to be effective, it requires at least 20 observations in each data sample.
Wilcoxon 符号秩检验可以使用 wilcoxon()SciPy 函数在 Python 中实现。该函数将两个样本作为参数,并返回计算的统计量和 p 值。
下面是完整的示例,演示了对测试问题的 Wilcoxon 符号秩检验的计算。这两个样本在技术上不配对,但我们可以假装它们是为了证明这个重要性测试的计算。
# Wilcoxon signed-rank test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import wilcoxon
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# compare samples
stat, p = wilcoxon(data1, data2)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distribution (fail to reject H0)')
else:
print('Different distribution (reject H0)')
运行该示例计算并打印统计量并打印结果。
p 值被强烈解释,表明样本是从不同的分布中提取的。
Statistics=1886.000, p=0.028
Different distribution (reject H0)
Kruskal-Wallis H 测试
当使用显着性检验时,例如 Mann-Whitney U 和 Wilcoxon 符号秩检验,数据样本之间的比较必须成对进行。
如果您有许多数据样本并且您只对两个或更多样本是否具有不同的分布感兴趣,则这可能是低效的。
Kruskal-Wallis 检验是单因素方差分析或简称 ANOVA 的非参数版本。它以该方法的开发者命名,William Kruskal 和 Wilson Wallis。该测试可用于确定两个以上的独立样本是否具有不同的分布。它可以被认为是 Mann-Whitney U 检验的推广。
默认假设或零假设是所有数据样本都来自同一分布。具体而言,所有群体的人口中位数相等。拒绝零假设表明有足够的证据表明一个或多个样本支配另一个样本,但测试并未指出哪些样本或多少样本。
当 Kruskal-Wallis H-检验导致显着结果时,则至少一个样品与其他样品不同。但是,测试不能确定差异发生的位置。而且,它没有确定出现了多少差异。为了确定样本对之间的特定差异,研究人员可以使用样本对比或事后测试来分析特定样本对的显着差异。 Mann-Whitney U 检验是在各个样本集之间进行样本对比的有用方法。
- 第 100 页,非统计学家的非参数统计:循序渐进的方法,2009。
- 无法拒绝 H0 :所有样本分布均相等。
- 拒绝 H0 :一个或多个样本分布不相等。
每个数据样本必须是独立的,具有 5 个或更多个观察值,并且数据样本的大小可以不同。
我们可以更新测试问题以获得 3 个数据样本,而不是 2 个,其中两个具有相同的样本均值。鉴于一个样本不同,我们期望测试发现差异并拒绝原假设。
# generate three independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 50
data3 = 5 * randn(100) + 52
Kruskal-Wallis H-test 可以使用 kruskal()SciPy 函数在 Python 中实现。它将两个或多个数据样本作为参数,并返回测试统计量和 p 值作为结果。
下面列出了完整的示例。
# Kruskal-Wallis H-test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import kruskal
# seed the random number generator
seed(1)
# generate three independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 50
data3 = 5 * randn(100) + 52
# compare samples
stat, p = kruskal(data1, data2, data3)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distributions (fail to reject H0)')
else:
print('Different distributions (reject H0)')
运行该示例计算测试并打印结果。
解释 p 值,正确地拒绝所有样本具有相同分布的零假设。
Statistics=6.051, p=0.049
Different distributions (reject H0)
弗里德曼测试
与前面的示例一样,我们可能有两个以上的不同样本,并且对所有样本是否具有相同分布感兴趣。
如果样品以某种方式配对,例如重复测量,那么 Kruskal-Wallis H 测试将是不合适的。相反,可以使用 Friedman 测试,命名为 Milton Friedman。
弗里德曼检验是方差检验的重复测量分析的非参数形式,或重复测量方差分析。该测试可以被认为是对两个以上样品的 Kruskal-Wallis H 检验的推广。
默认假设或零假设是多个配对样本具有相同的分布。拒绝零假设表明配对样本中的一个或多个具有不同的分布。
- 无法拒绝 H0 :配对样本分布相等。
- 拒绝 H0 :配对样本分布不相等。
该测试假设两个或更多配对数据样本,每组 10 个或更多样本。
弗里德曼检验是一种非参数统计程序,用于比较两个以上相关的样本。与该测试等效的参数是重复测量方差分析(ANOVA)。当 Friedman 测试导致显着结果时,至少一个样品与其他样品不同。
- 第 79-80 页,非统计学家的非参数统计:循序渐进的方法,2009。
我们可以使用 friedmanchisquare()SciPy 函数在 Python 中实现 Friedman 测试。此函数将要比较的数据样本作为参数,并返回计算的统计量和 p 值。
可以在与前一节中使用的测试数据集相同的变体上证明该显着性检验。即三个样本,两个具有相同的总体平均值,一个具有略微不同的平均值。虽然样本没有配对,但我们希望测试发现并非所有样本都具有相同的分布。
The complete code example is listed below.
# Friedman test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import friedmanchisquare
# seed the random number generator
seed(1)
# generate three independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 50
data3 = 5 * randn(100) + 52
# compare samples
stat, p = friedmanchisquare(data1, data2, data3)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distributions (fail to reject H0)')
else:
print('Different distributions (reject H0)')
运行该示例计算三个数据样本的测试并打印测试统计和 p 值。
对 p 值的解释正确地表明至少一个样本具有不同的分布。
Statistics=9.360, p=0.009
Different distributions (reject H0)
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 更新所有示例以对具有相同分布的数据样本进行操作。
- 根据每个测试的要求和行为,创建一个流程图,用于选择每个统计显着性检验。
- 考虑 3 个在机器学习项目中比较数据样本的情况,假设样本的非高斯分布,并建议可以在每种情况下使用的测试类型。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 非统计人员的非参数统计:循序渐进的方法,2009 年。
API
- numpy.random.seed()API
- numpy.random.randn()API
- scipy.stats.mannwhitneyu()API
- scipy.stats.wilcoxon()API
- scipy.stats.kruskal()API
- scipy.stats.friedmanchisquare()API
用品
- 维基百科上的非参数统计
- 维基百科上的配对差异测试
- 维基百科上的 Mann-Whitney U 测试
- Wilcoxon 对维基百科的签名等级测试
- Kruskal-Wallis 对维基百科的单因素方差分析
- 弗里德曼在维基百科上的测试
摘要
在本教程中,您发现了非参数统计测试,可用于确定数据样本是否来自具有相同或不同分布的群体。
具体来说,你学到了:
- 用于比较独立数据样本的 Mann-Whitney U 检验:Student t 检验的非参数版本。
- 用于比较配对数据样本的 Wilcoxon 符号秩检验:配对 Student t 检验的非参数版本。
- Kruskal-Wallis H 和 Friedman 测试用于比较两个以上的数据样本:ANOVA 的非参数版本和重复测量 ANOVA 测试。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何在 Python 中计算参数统计显着性检验
原文:
machinelearningmastery.com/parametric-statistical-significance-tests-in-python/
参数统计方法通常意味着假设数据样本具有高斯分布的那些方法。
在应用机器学习中,我们需要比较数据样本,特别是样本的平均值。也许要看一种技术在一个或多个数据集上的表现是否优于另一种技术。为了量化这个问题并解释结果,我们可以使用参数假设检验方法,如 T 检验和方差分析。
在本教程中,您将发现参数统计显着性检验,用于量化两个或多个数据样本均值之间的差异。
完成本教程后,您将了解:
- Student's t 检验用于量化两个独立数据样本的平均值之间的差异。
- 配对 Student's t 检验用于量化两个依赖数据样本的平均值之间的差异。
- ANOVA 和重复测量 ANOVA 用于检查 2 个或更多个数据样本的平均值之间的相似性或差异。
让我们开始吧。
- 更新于 May / 2018 :改进了拒绝与拒绝统计测试的语言。
Python 中使用参数统计意义测试介绍 照片由 nestor ferraro 拍摄,保留一些权利。
教程概述
- 参数统计显着性检验
- 测试数据
- 学生的 t-测试
- 配对 T 检验
- 方差检验分析
- 重复测量方差分析测试
参数统计显着性检验
参数统计测试假设数据样本来自特定的人口分布。
它们通常指的是假设高斯分布的统计检验。由于数据适合此分布是如此常见,因此更常用的是参数统计方法。
我们可能有两个或更多数据样本的典型问题是它们是否具有相同的分布。参数统计显着性检验是假设数据来自相同的高斯分布的统计方法,即具有相同均值和标准差的数据分布:分布的参数。
通常,每个测试计算一个测试统计量,必须用统计学中的一些背景解释并更深入地了解统计测试本身。测试还返回一个 p 值,可用于解释测试结果。 p 值可以被认为是在给定基本假设(零假设)的情况下观察两个数据样本的概率,即两个样本是从具有相同分布的群体中抽取的。
可以在称为α的所选显着性水平的上下文中解释 p 值。 alpha 的常见值为 5%或 0.05。如果 p 值低于显着性水平,则测试表明有足够的证据拒绝零假设,并且样本可能来自具有不同分布的群体。
- p <= alpha :拒绝零假设,不同分布。
- p&gt; alpha :无法拒绝原假设,相同的分布。
测试数据
在我们查看特定的参数显着性检验之前,让我们首先定义一个测试数据集,我们可以用它来演示每个测试。
我们将生成从不同分布中抽取的两个样本。每个样本将从高斯分布中抽取。
我们将使用 randn()NumPy 函数在每个样本中生成 100 个高斯随机数的样本,平均值为 0,标准差为 1.第一个样本中的观察值被缩放为具有均值标准偏差为 50,标准偏差为 5.将第二个样品中的观察结果缩放为平均值为 51,标准偏差为 5。
我们希望统计检验发现样本来自不同的分布,尽管每个样本 100 个观察值的小样本量会给这个决定增加一些噪音。
完整的代码示例如下所示。
# generate gaussian data samples
from numpy.random import seed
from numpy.random import randn
from numpy import mean
from numpy import std
# seed the random number generator
seed(1)
# generate two sets of univariate observations
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# summarize
print('data1: mean=%.3f stdv=%.3f' % (mean(data1), std(data1)))
print('data2: mean=%.3f stdv=%.3f' % (mean(data2), std(data2)))
运行该示例生成数据样本,然后计算并打印每个样本的均值和标准差,确认它们的不同分布。
data1: mean=50.303 stdv=4.426
data2: mean=51.764 stdv=4.660
学生的 t-测试
T 检验是一个统计假设检验,两个独立的数据样本已知具有高斯分布,具有相同的高斯分布,以 William Gosset 命名,使用化名“Student]“。
最常用的 t 检验之一是独立样本 t 检验。当您想要比较给定变量上两个独立样本的均值时,可以使用此测试。
- 第 93 页,普通英语统计,第三版,2010 年。
测试的假设或零假设是两个群体的平均值相等。拒绝这一假设表明,有足够的证据表明人口的均值是不同的,反过来说,分布是不相等的。
- 无法拒绝 H0 :样本分布相等。
- 拒绝 H0 :样本分布不相等。
学生的 t 检验可通过 ttest_ind()SciPy 函数在 Python 中获得。该函数将两个数据样本作为参数,并返回计算的统计量和 p 值。
我们可以证明学生对测试问题的 t 检验,期望测试发现两个独立样本之间的分布差异。完整的代码示例如下所示。
# Student's t-test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import ttest_ind
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# compare samples
stat, p = ttest_ind(data1, data2)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distributions (fail to reject H0)')
else:
print('Different distributions (reject H0)')
运行该示例计算生成的数据样本的 Student t 检验并打印统计和 p 值。
对统计量的解释发现样本均值不同,其显着性至少为 5%。
Statistics=-2.262, p=0.025
Different distributions (reject H0)
配对 T 检验
我们可能希望比较以某种方式相关的两个数据样本之间的平均值。
例如,数据样本可以表示对同一对象的两个独立测量或评估。这些数据样本是重复的或依赖的,并称为配对样本或重复测量。
由于样本不是独立的,我们不能使用学生的 t 检验。相反,我们必须使用测试的修改版本来纠正数据样本依赖的事实,称为配对 Student's t 检验。
依赖样本 t 检验也用于比较单个因变量上的两个均值。然而,与独立样本测试不同,依赖样本 t 检验用于比较单个样本或两个匹配或配对样本的平均值。
- 第 94 页,普通英语统计,第三版,2010 年。
该测试被简化,因为它不再假设观察结果之间存在差异,观察是在对同一受试者或受试者进行治疗之前和之后成对进行的。
测试的默认假设或零假设是样本之间的平均值没有差异。拒绝零假设表明有足够的证据表明样本均值不同。
- 无法拒绝 H0 :配对样本分布相等。
- 拒绝 H0 :配对样本分布不相等。
配对 Student's t 检验可以使用 ttest_rel()SciPy 函数在 Python 中实现。与未配对版本一样,该函数将两个数据样本作为参数,并返回计算的统计值和 p 值。
我们可以在测试数据集上演示配对 Student's t 检验。虽然样本是独立的,而不是配对的,但我们可以假装为了证明观察结果并计算统计量。
下面列出了完整的示例。
# Paired Student's t-test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import ttest_rel
# seed the random number generator
seed(1)
# generate two independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 51
# compare samples
stat, p = ttest_rel(data1, data2)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distributions (fail to reject H0)')
else:
print('Different distributions (reject H0)')
运行该示例计算并打印测试统计和 p 值。对结果的解释表明样品具有不同的平均值,因此具有不同的分布。
Statistics=-2.372, p=0.020
Different distributions (reject H0)
方差检验分析
有时我们可能会有多个独立的数据样本。
我们可以对每个数据样本组合成对执行 Student t 检验,以了解哪些样本具有不同的均值。如果我们只关心所有样品是否具有相同的分布,那么这可能是繁重的。
为了回答这个问题,我们可以使用方差分析或简称 ANOVA。 ANOVA 是一种统计检验,假设两组或更多组的平均值相等。如果证据表明情况并非如此,则拒绝零假设,并且至少一个数据样本具有不同的分布。
- 无法拒绝 H0 :所有样本分布均相等。
- 拒绝 H0 :一个或多个样本分布不相等。
重要的是,测试只能评论所有样本是否相同;它不能量化哪些样本不同或多少。
单因素方差分析(单向 ANOVA)的目的是比较一个因变量上两个或多个组(自变量)的均值,以查看组均值是否彼此显着不同。
- 第 105 页,普通英语统计,第三版,2010 年。
该测试要求数据样本是高斯分布,样本是独立的,并且所有数据样本具有相同的标准偏差。
可以使用 f_oneway()SciPy 函数在 Python 中执行 ANOVA 测试。该函数将两个或多个数据样本作为参数,并返回测试统计和 f 值。
我们可以修改我们的测试问题,使两个样本具有相同的均值,第三个样本具有略微不同的均值。然后我们期望测试发现至少一个样本具有不同的分布。
The complete example is listed below.
# Analysis of Variance test
from numpy.random import seed
from numpy.random import randn
from scipy.stats import f_oneway
# seed the random number generator
seed(1)
# generate three independent samples
data1 = 5 * randn(100) + 50
data2 = 5 * randn(100) + 50
data3 = 5 * randn(100) + 52
# compare samples
stat, p = f_oneway(data1, data2, data3)
print('Statistics=%.3f, p=%.3f' % (stat, p))
# interpret
alpha = 0.05
if p > alpha:
print('Same distributions (fail to reject H0)')
else:
print('Different distributions (reject H0)')
运行该示例计算并打印测试统计量和 p 值。
对 p 值的解释正确地拒绝了表示一个或多个样本均值不同的零假设。
Statistics=3.655, p=0.027
Different distributions (reject H0)
重复测量方差分析测试
我们可能有多个相关或依赖的数据样本。
例如,我们可以在不同时间段对主题重复相同的测量。在这种情况下,样本将不再是独立的;相反,我们将有多个配对样本。
我们可以多次重复成对学生的 t 检验。或者,我们可以使用单个测试来检查所有样本是否具有相同的均值。可以使用 ANOVA 测试的变体,修改以测试超过 2 个样品。该测试称为重复测量 ANOVA 测试。
默认假设或零假设是所有配对样本具有相同的均值,因此具有相同的分布。如果样本表明情况并非如此,则拒绝零假设,并且一个或多个配对样本具有不同的均值。
- 无法拒绝 H0 :所有配对样本分布均相等。
- 拒绝 H0 :一个或多个配对样本分布不相等。
然而,重复测量 ANOVA 与配对 t 检验相比具有许多优点。首先,通过重复测量 ANOVA,我们可以检查在两个以上时间点测量的因变量的差异,而使用独立 t 检验,我们只能比较两个时间点的因变量的得分。
- 第 131 页,普通英语统计,第三版,2010 年。
不幸的是,在撰写本文时,SciPy 中没有可用的重复测量 ANOVA 测试版本。希望这个测试很快就会加入。
如果您在项目中需要它并且能够寻找并找到替代实现,我提到此测试是否完整。
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 更新所有示例以对具有相同分布的数据样本进行操作。
- 根据每个测试的要求和行为,创建一个流程图,用于选择三个统计显着性检验中的每一个。
- 考虑 3 个在机器学习项目中比较数据样本的情况,假设样本的非高斯分布,并建议可以在每种情况下使用的测试类型。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 普通英语统计,第三版,2010 年。
API
- numpy.random.seed()API
- numpy.random.randn()API
- scipy.stats.ttest_ind()API
- scipy.stats.ttest_rel()API
- scipy.stats.f_oneway()API
用品
- 维基百科的统计意义
- 维基百科上的 T 检验
- 维基百科上的配对差异测试
- 维基百科的方差分析
- 在维基百科上重复测量设计
摘要
在本教程中,您发现了参数统计显着性检验,用于量化两个或多个数据样本均值之间的差异。
具体来说,你学到了:
- Student's t 检验用于量化两个独立数据样本的平均值之间的差异。
- 配对 Student's t 检验用于量化两个依赖数据样本的平均值之间的差异。
- ANOVA 和重复测量 ANOVA 用于检查两个或更多个数据样本的均值之间的相似性或差异。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
机器学习中的预测区间
原文:
machinelearningmastery.com/prediction-intervals-for-machine-learning/
从机器学习角度预测是隐藏该预测的不确定性的单一点。
预测间隔提供了量化和传达预测中的不确定性的方法。它们与置信区间不同,而是设法量化群体参数中的不确定性,例如均值或标准差。预测间隔描述了单个特定结果的不确定性。
在本教程中,您将发现预测间隔以及如何计算简单线性回归模型。
完成本教程后,您将了解:
- 预测间隔量化单点预测的不确定性。
- 对于简单模型,可以分析地估计预测间隔,但对于非线性机器学习模型则更具挑战性。
- 如何计算简单线性回归模型的预测区间。
让我们开始吧。
机器学习的预测间隔 照片由 Jim Bendon 拍摄,保留一些权利。
教程概述
本教程分为 5 个部分;他们是:
- 什么是错误的点估计?
- 什么是预测区间?
- 如何计算预测区间
- 线性回归的预测区间
- 工作示例
为什么要计算预测区间?
在预测性建模中,给定一些输入变量,预测或预测是单个结果值。
例如:
yhat = model.predict(X)
其中 _ 是 _ 是由训练模型对给定输入数据X进行的估计结果或预测。
这是一个点预测。
根据定义,它是估计值或近似值,并包含一些不确定性。
不确定性来自模型本身的误差和输入数据中的噪声。该模型是输入变量和输出变量之间关系的近似值。
鉴于用于选择和调整模型的过程,它将是给定可用信息的最佳近似值,但它仍然会产生错误。来自域的数据自然会模糊输入和输出变量之间的潜在和未知关系。这将使拟合模型成为一项挑战,同时也会使拟合模型成为预测的挑战。
鉴于这两个主要的误差来源,他们从预测模型中预测的点数不足以描述预测的真实不确定性。
什么是预测区间?
预测区间是预测的不确定性的量化。
它提供了结果变量估计的概率上限和下限。
单个未来观察的预测间隔是具有指定置信度的区间,其将包含来自分布的未来随机选择的观察。
- 第 27 页,统计间隔:从业者和研究人员指南,2017 年。
在使用回归模型做出预测或预测时,最常使用预测区间,其中正在预测数量。
预测间隔的呈现示例如下:
_ 鉴于给定'x'的'y'预测,'a'到'b'的范围有 95%可能覆盖真实结果。_
预测间隔围绕模型进行的预测,并希望涵盖真实结果的范围。
下图有助于直观地理解预测,预测间隔和实际结果之间的关系。
预测,实际值和预测区间之间的关系。 取自“用于估计模型输出的预测间隔的机器学习方法”,2006。
预测间隔与置信区间不同。
置信区间量化估计的人口变量的不确定性,例如平均值或标准差。而预测间隔量化了从群体估计的单个观察的不确定性。
在预测性建模中,置信区间可用于量化模型的估计技能的不确定性,而预测区间可用于量化单个预测的不确定性。
预测间隔通常大于置信区间,因为它必须考虑置信区间和输出变量的方差。
预测间隔总是比置信区间宽,因为它们考虑了与 e [误差]相关的不确定性,即不可减少的误差。
- 第 103 页,统计学习导论:应用于 R ,2013。
如何计算预测区间
预测区间被计算为模型的估计方差和结果变量的方差的某种组合。
预测间隔很容易描述,但在实践中很难计算。
在线性回归等简单情况下,我们可以直接估计置信区间。
在非线性回归算法(如人工神经网络)的情况下,它更具挑战性,需要选择和实现专门技术。可以使用诸如自举重采样方法之类的一般技术,但计算上计算成本很高。
论文“基于神经网络的预测区间和新进展综合评述”提供了一个合理的近期研究神经网络背景下非线性模型的预测区间。以下列表总结了一些可用于非线性机器学习模型的预测不确定性的方法:
- Delta 方法,来自非线性回归领域。
- 贝叶斯方法,来自贝叶斯建模和统计。
- 均值 - 方差估计方法,使用估计的统计量。
- 自举法,使用数据重采样和开发模型集合。
我们可以使用下一节中的工作示例来具体计算预测区间。
线性回归的预测区间
线性回归是描述输入的线性组合以计算输出变量的模型。
例如,估计的线性回归模型可以写成:
yhat = b0 + b1 . x
是预测的 ,b0和b1是根据训练数据估计的模型的系数,x是输入变量。
我们不知道系数b0和b1的真实值。我们也不知道真实的群体参数,例如x或y的平均值和标准偏差。必须估计所有这些元素,这为模型的使用带来了不确定性,以便做出预测。
我们可以做出一些假设,例如x和y的分布,并且由模型做出的预测误差(称为残差)是高斯分布。
附近的预测间隔可以如下计算:
yhat +/- z * sigma
y是预测值,z是高斯分布的临界值(例如,95%间隔为 1.96),sigma是标准偏差预测的分布。
我们在实践中并不知道。我们可以如下计算预测标准偏差的无偏估计(取自 _ 用于估计模型输出 _ 的预测间隔的机器学习方法):
stdev = sqrt(1 / (N - 2) * e(i)² for i to N)
stdev是预测分布的标准偏差的无偏估计,n是所做的总预测,而 e(i) 是之间的差异。 ith 预测和实际价值。
工作示例
让我们以线性回归预测区间为例,用一个实例说明。
首先,让我们定义一个简单的双变量数据集,其中输出变量(y)取决于具有一些高斯噪声的输入变量(x)。
下面的示例定义了我们将用于此示例的数据集。
# generate related variables
from numpy import mean
from numpy import std
from numpy.random import randn
from numpy.random import seed
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
x = 20 * randn(1000) + 100
y = x + (10 * randn(1000) + 50)
# summarize
print('x: mean=%.3f stdv=%.3f' % (mean(x), std(x)))
print('y: mean=%.3f stdv=%.3f' % (mean(y), std(y)))
# plot
pyplot.scatter(x, y)
pyplot.show()
首先运行该示例打印两个变量的均值和标准差。
x: mean=100.776 stdv=19.620
y: mean=151.050 stdv=22.358
然后创建数据集的图。
我们可以看到变量之间的明确的线性关系与点的扩展突出了关系中的噪声或随机误差。
相关变量的散点图
接下来,我们可以开发一个简单的线性回归,给出输入变量x,将预测y变量。我们可以使用 linregress()SciPy 函数拟合模型并返回模型的b0和b1系数。
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)
我们可以使用系数来计算每个输入变量的预测y值,称为yhat。结果点将形成表示学习关系的线。
# make prediction
yhat = b0 + b1 * x
下面列出了完整的示例。
# simple linear regression model
from numpy.random import randn
from numpy.random import seed
from scipy.stats import linregress
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
x = 20 * randn(1000) + 100
y = x + (10 * randn(1000) + 50)
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)
print('b0=%.3f, b1=%.3f' % (b1, b0))
# make prediction
yhat = b0 + b1 * x
# plot data and predictions
pyplot.scatter(x, y)
pyplot.plot(x, yhat, color='r')
pyplot.show()
运行该示例适合模型并打印系数。
b0=1.011, b1=49.117
然后将系数与来自数据集的输入一起使用以做出预测。得到的输入和预测的y值被绘制为数据集的散点图顶部的线。
我们可以清楚地看到模型已经学习了数据集中的基础关系。
简单线性回归模型的线数据集散点图
我们现在准备用我们的简单线性回归模型做出预测并添加预测间隔。
我们将像以前一样适应模型。这次我们将从数据集中取一个样本来演示预测间隔。我们将使用输入做出预测,计算预测的预测间隔,并将预测和间隔与已知预期值进行比较。
首先,让我们定义输入,预测和期望值。
x_in = x[0]
y_out = y[0]
yhat_out = yhat[0]
接下来,我们可以估计预测方向上的标准偏差。
SE = sqrt(1 / (N - 2) * e(i)² for i to N)
我们可以使用 NumPy 数组直接计算它,如下所示:
# estimate stdev of yhat
sum_errs = arraysum((y - yhat)**2)
stdev = sqrt(1/(len(y)-2) * sum_errs)
接下来,我们可以计算所选输入的预测间隔:
interval = z . stdev
我们将使用 95%的显着性水平,即高斯临界值 1.96。
一旦计算了间隔,我们就可以将预测的界限汇总给用户。
# calculate prediction interval
interval = 1.96 * stdev
lower, upper = yhat_out - interval, yhat_out + interval
我们可以将所有这些结合在一起。下面列出了完整的示例。
# linear regression prediction with prediction interval
from numpy.random import randn
from numpy.random import seed
from numpy import power
from numpy import sqrt
from numpy import mean
from numpy import std
from numpy import sum as arraysum
from scipy.stats import linregress
from matplotlib import pyplot
# seed random number generator
seed(1)
# prepare data
x = 20 * randn(1000) + 100
y = x + (10 * randn(1000) + 50)
# fit linear regression model
b1, b0, r_value, p_value, std_err = linregress(x, y)
# make predictions
yhat = b0 + b1 * x
# define new input, expected value and prediction
x_in = x[0]
y_out = y[0]
yhat_out = yhat[0]
# estimate stdev of yhat
sum_errs = arraysum((y - yhat)**2)
stdev = sqrt(1/(len(y)-2) * sum_errs)
# calculate prediction interval
interval = 1.96 * stdev
print('Prediction Interval: %.3f' % interval)
lower, upper = y_out - interval, y_out + interval
print('95%% likelihood that the true value is between %.3f and %.3f' % (lower, upper))
print('True value: %.3f' % yhat_out)
# plot dataset and prediction with interval
pyplot.scatter(x, y)
pyplot.plot(x, yhat, color='red')
pyplot.errorbar(x_in, yhat_out, yerr=interval, color='black', fmt='o')
pyplot.show()
运行该示例估计yhat标准差,然后计算置信区间。
一旦计算出,预测间隔就会呈现给用户以获得给定的输入变量。因为我们设计了这个例子,我们知道了真实的结果,我们也展示了它。我们可以看到,在这种情况下,95%的预测间隔确实涵盖了真实的预期值。
Prediction Interval: 20.204
95% likelihood that the true value is between 160.750 and 201.159
True value: 183.124
还创建了一个图,将原始数据集显示为散点图,将数据集预测为红线,将预测和预测间隔分别显示为黑点和线。
线性模型和预测区间的数据集散点图
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 总结容差,置信度和预测间隔之间的差异。
- 为标准机器学习数据集开发线性回归模型,并计算小测试集的预测间隔。
- 详细描述一种非线性预测区间方法的工作原理。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
帖子
图书
- 了解新统计:影响大小,置信区间和元分析,2017 年。
- 统计间隔:从业者和研究人员指南,2017 年。
- 统计学习简介:应用于 R ,2013。
- 新统计学概论:估计,开放科学及其他,2016 年。
- 预测:原则与实践,2013。
文件
- 神经网络模型的一些误差估计的比较,1995。
- 用于估计模型输出的预测区间的机器学习方法,2006。
- 基于神经网络的预测间隔和新进展综述,2010。
API
用品
摘要
在本教程中,您发现了预测间隔以及如何计算简单线性回归模型。
具体来说,你学到了:
- 预测间隔量化单点预测的不确定性。
- 对于简单模型,可以分析估计预测间隔,但对于非线性机器学习模型则更具挑战性。
- 如何计算简单线性回归模型的预测区间。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
应用统计学与机器学习的密切关系
原文:
machinelearningmastery.com/relationship-between-applied-statistics-and-machine-learning/
机器学习从业者具有算法传统,并且注重结果和模型技能,而不是其他关注点,例如模型可解释性。
统计学家在应用统计和统计学习的名义下处理大致相同类型的建模问题。从数学背景来看,他们更关注模型的行为和预测的可解释性。
两种解决同一问题的方法之间的密切关系意味着两个领域都有很多可以相互学习的东西。统计学家需要考虑在经典的“_ 两种文化 _”论文中提出的算法方法。机器学习从业者也必须注意,保持开放的心态,并从应用统计学中学习术语和相关方法。
在这篇文章中,您将发现机器学习和统计学习是两个密切相关但对同一问题的不同观点。
阅读这篇文章后,你会知道:
- “_ 机器学习 ”和“ 预测性建模 _”是关于建模数据的计算机科学观点,侧重于算法方法和模型技能。
- “_ 统计 ”和“ 统计学习 _”是建模数据的数学视角,侧重于数据模型和拟合优度。
- 机器学习从业者必须保持开放的思维并利用方法,并从应用统计和统计学习的密切相关领域中理解术语。
让我们开始吧。
应用统计与机器学习之间的密切关系 James Loesch 的照片,保留一些权利。
机器学习
机器学习是人工智能的一个子领域,与更广泛的计算机科学领域有关。
在开发机器学习模型以做出预测时,重点关注算法,代码和结果。
机器学习比开发模型更广泛,以便做出预测,正如 Tom Mitchell 在 1997 年经典教科书中的定义所示。
机器学习领域涉及如何构建自动改进经验的计算机程序的问题。
- 第 xv 页,机器学习,1997 年。
在这里,我们可以看到,从研究的角度来看,机器学习实际上是用计算机程序学习的研究。事实上,这些学习程序中的一些对于预测性建模问题很有用,而实际上有些已经从其他领域借用,例如统计学。
线性回归就是一个很好的例子。它是一种超过一个世纪的方法,来自(当时:新生)统计领域,用于将线或平面拟合到实值数据。从机器学习的角度来看,我们将其视为一个学习权重(系数)的系统,以响应来自域的示例。
在人工智能和机器学习领域已经开发了许多方法,有时由统计学家开发,这些方法对于预测性建模的任务非常有用。一个很好的例子是分类和回归树,它们与统计学中的经典方法没有相似之处。
预测性建模
从业者的机器学习的有用部分可以称为预测性建模。
这显然忽略了统计和机器学习之间的区别。它还消除了统计学(理解数据)和机器学习(理解软件学习)这些更广泛的目标,并且只顾其名称所暗示的问题,开发模型做出预测。
术语预测性建模可能会引起诸如机器学习,模式识别和数据挖掘之类的关联。实际上,这些关联是恰当的,这些术语所暗示的方法是预测性建模过程的一个组成部分。但预测性建模不仅仅包括用于揭示数据中模式的工具和技术。预测性建模的实践定义了开发模型的过程,我们可以通过这种方式理解和量化模型对未来未见数据的预测准确率。
- 第 vii 页, Applied Predictive Modeling ,2013
预测性建模提供激光聚焦于开发模型,目的是在某些模型技能测量方面获得最佳结果。这种务实的方法通常意味着以最高技能或最小错误的形式获得的结果是以牺牲几乎所有其他方式为代价的。
我们称之为流程,机器学习或预测性建模并不重要。从某种意义上说,它是营销和群体识别。获得成果和提供价值更重要的是从业者。
统计学习
使用数据集和开发预测模型的过程也是统计学中的一项任务。
传统上统计学家可能将该活动称为应用统计。
统计学是数学的一个子领域,这种遗产提供了一个定义明确,精心挑选的方法的焦点。需要不仅要了解选择特定模型的原因,还要了解具体预测的方式和原因。
从这个角度来看,模型技能通常很重要,但不如模型的可解释性重要。
尽管如此,现代统计学家已将新视角作为应用统计学的子领域,称为“_ 统计学习 ”。它可能是“ 预测性建模 _”的统计等效,其中模型技能很重要,但也许更加强调仔细选择和引入学习模型。
统计学习是指用于建模和理解复杂数据集的一组工具。它是最近开发的统计学领域,与计算机科学,特别是机器学习的并行发展相结合。
- 第 7 页, 2013 年 R 中的应用统计学习导论。
我们可以看到统计量中的字段和子字段之间存在大量的想法。机器学习从业者必须了解机器学习和基于统计的问题方法。鉴于在两个领域中使用不同的术语,这一点尤为重要。
在他的统计学课程中, Rob Tibshirani ,一位也参与机器学习的统计学家,提供词汇表,将统计学中的术语映射到机器学习中的术语,转载如下。
词汇表将统计学中的术语映射到机器学习中的术语
这凸显了机器学习从业者更加需要专注于预测性建模,并对方法,思想和术语持开放态度,无论原点如何。这可能适用于生物信息学和计量经济学等现代领域,但更适用于紧密相关且历史悠久的统计领域。
两种文化
最近,现在或许还是现在,应用统计学家们看不起机器学习领域和任何成本预测模型的实践。
这两个领域都提供了巨大的价值,但也许与预测性建模相同的一般问题的微妙不同风格。
从机器学习的计算机科学角度(例如上面提到的决策树和人工神经网络,最近重新标记的深度学习)建立了真实和有价值的贡献,以命名两个众所周知的例子。
正如机器学习从业者必须密切关注应用统计学和统计学习一样,统计学家必须密切关注机器学习。
在 Leo Breiman 的题为“统计模型:两种文化”的 2001 年(也许是着名的)论文中清楚地表达了这一呼吁。
在其中,他将统计学家的“_ 数据建模文化 ”与机器学习所属的所有其他领域的“ 算法建模文化 _”进行了对比。他强调这些文化是思考将输入映射到输出的相同问题的方法,其中统计方法是关注拟合优度测试,算法方法侧重于预测准确率。
他认为统计领域将因忽略算法方法而失去相关性和方法的脆弱性。他称之为“_ 数据模型 _”的经典方法,“从业者选择并关注模型行为(例如逻辑回归)而不是可能的数据和过程的重点微妙但重要的转变”生成了它。
这可能被描述(可能不公平),因为专注于使数据适合模型,而不是选择或调整模型以适应数据。
统计界一直致力于几乎独家使用数据模型。这种承诺导致了无关紧要的理论,可疑的结论,并使统计人员无法处理大量有趣的当前问题。 [...]如果我们作为一个领域的目标是使用数据来解决问题,那么我们需要摆脱对数据模型的独占依赖,并采用更多样化的工具集。
这是一篇重要的论文,仍然 相关并且超过 15 年后阅读量很大。
统计学家的“_ 统计学习 _”等子字段的出现表明正在取得进展。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
- 统计建模:两种文化,2001。
- 统计与机器学习,战斗! ,2008 年。
- 两种文化:统计与机器学习?在交叉验证
- 术语表:机器学习与统计学,现代应用统计学:统计学习的要素。
摘要
在这篇文章中,您发现机器学习和统计学习是两个密切相关但对同一问题的不同观点。
具体来说,你学到了:
- “_ 机器学习 ”和“ 预测性建模 _”是关于建模数据的计算机科学观点,侧重于算法方法和模型技能。
- “_ 统计 ”和“ 统计学习 _”是建模数据的数学视角,侧重于数据模型和拟合优度。
- 机器学习从业者必须保持开放的思维并利用方法,并从应用统计和统计学习的密切相关领域中理解术语。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。
如何使用置信区间报告分类器表现
原文:
machinelearningmastery.com/report-classifier-performance-confidence-intervals/
为分类问题选择机器学习算法后,需要向利益相关者报告模型的表现。
这很重要,因此您可以设置模型对新数据的期望。
常见的错误是仅报告模型的分类准确率。
在这篇文章中,您将了解如何计算模型表现的置信区间,以提供模型技能的校准和稳健指示。
让我们开始吧。
如何使用置信区间报告分类器表现 Andrew 的照片,保留一些权利。
分类准确率
分类机器学习算法的技能通常被报告为分类准确率。
这是所有预测的正确预测百分比。计算方法如下:
classification accuracy = correct predictions / total predictions * 100.0
分类器可以具有诸如 60%或 90%的准确度,并且这仅在问题域的上下文中具有意义。
分类错误
在向利益相关者讨论模型时,谈论分类错误或只是错误可能更为相关。
这是因为利益相关者认为模型表现良好,他们可能真的想知道模型是否容易出错。
您可以将分类错误计算为对预测数量的错误预测百分比,表示为 0 到 1 之间的值。
classification error = incorrect predictions / total predictions
分类器可能具有 0.25 或 0.02 的误差。
该值也可以通过乘以 100 转换为百分比。例如,0.02 将变为(0.02 * 100.0)或 2%分类错误。
验证数据集
您使用什么数据集来计算模型技能?
从建模过程中提取验证数据集是一种很好的做法。
这意味着随机选择可用数据的样本并从可用数据中删除,以便在模型选择或配置期间不使用它。
在针对训练数据准备最终模型之后,可以使用它来对验证数据集做出预测。这些预测用于计算分类准确度或分类错误。
置信区间
不是仅呈现单个错误分数,而是可以计算置信区间并将其呈现为模型技能的一部分。
置信区间由两部分组成:
- 范围。这是模型上可以预期的技能的下限和上限。
- 概率。这是模型技能落在范围内的概率。
通常,分类错误的置信区间可以如下计算:
error +/- const * sqrt( (error * (1 - error)) / n)
如果 error 是分类错误,const 是定义所选概率的常数值,sqrt 是平方根函数,n 是用于评估模型的观察(行)数。从技术上讲,这被称为 Wilson 评分区间。
const 的值由统计提供,常用值为:
- 1.64(90%)
- 1.96(95%)
- 2.33(98%)
- 2.58(99%)
使用这些置信区间会产生一些您需要确保可以满足的假设。他们是:
- 验证数据集中的观察结果独立地从域中提取(例如它们是独立且相同分布的)。
- 至少使用 30 个观察值来评估模型。
这是基于采样理论的一些统计量,它将分类器的误差计算为二项分布,我们有足够的观测值来逼近二项分布的正态分布,并且通过中心极限定理我们分类的观察结果越多,我们越接近真实但未知的模型技能。
置信区间示例
在具有 50 个示例(n = 50)的验证数据集上考虑具有 0.02(错误= 0.02)的错误的模型。
我们可以如下计算 95%置信区间(const = 1.96):
error +/- const * sqrt( (error * (1 - error)) / n)
0.02 +/- 1.96 * sqrt( (0.02 * (1 - 0.02)) / 50)
0.02 +/- 1.96 * sqrt(0.0196 / 50)
0.02 +/- 1.96 * 0.0197
0.02 +/- 0.0388
或者,换句话说:
置信区间[0.0,0.0588]有 95%的可能性涵盖模型对未见数据的真实分类误差。
请注意,分类错误的置信区间必须剪切为值 0.0 和 1.0。不可能有负误差(例如小于 0.0)或误差大于 1.0。
进一步阅读
摘要
在这篇文章中,您了解了如何计算分类器的置信区间。
具体来说,你学到了:
- 报告结果时如何计算分类准确度和分类错误。
- 在计算要报告的模型技能时要使用的数据集。
- 如何计算选定可能性水平的分类误差的下限和上限。
您对分类器置信区间有任何疑问吗? 在下面的评论中提出您的问题。
统计量分布的简要介绍
原文:
machinelearningmastery.com/statistical-data-distributions/
数据样本将形成分布,到目前为止,最着名的分布是高斯分布,通常称为正态分布。
该分布提供参数化的数学函数,该函数可用于计算来自样本空间的任何单独观察的概率。该分布描述了观测的分组或密度,称为概率密度函数。我们还可以计算观察值等于或小于给定值的可能性。观察之间的这些关系的概述称为累积密度函数。
在本教程中,您将发现高斯和相关分布函数以及如何计算每个函数的概率和累积密度函数。
完成本教程后,您将了解:
- 简要介绍标准分布,以总结观察的关系。
- 如何计算和绘制高斯分布的概率和密度函数。
- T 和卡方分布与高斯分布有关。
让我们开始吧。
统计量分布的简要介绍 Ed Dunens 的照片,保留一些权利。
教程概述
本教程分为 4 个部分;他们是:
- 分布
- 高斯分布
- 学生的 t 分布
- 卡方 Distribution
分布
从实际角度来看,我们可以将分布视为描述样本空间中观察之间关系的函数。
例如,我们可能对人类的年龄感兴趣,其中个体年龄代表域中的观察,并且样本空间的范围为 0 到 125 岁。分布是描述不同高度的观测关系的数学函数。
分布只是变量上的数据或分数的集合。通常,这些分数按照从最小到最大的顺序排列,然后它们可以以图形方式呈现。
- 第 6 页,普通英语统计,第三版,2010 年。
许多数据符合众所周知且易于理解的数学函数,例如高斯分布。函数可以通过修改函数的参数来拟合数据,例如在高斯的情况下的均值和标准偏差。
一旦知道了分布函数,它就可以用作描述和计算相关量的简写,例如观察的可能性,以及绘制域中观察之间的关系。
密度函数
分布通常根据其密度或密度函数来描述。
密度函数是描述数据的比例或观察比例的可能性如何在分布范围内变化的函数。
两种类型的密度函数是概率密度函数和累积密度函数。
- 概率密度函数:计算观察给定值的概率。
- 累积密度函数:计算观察的概率等于或小于一个值。
概率密度函数或 PDF 可用于计算分布中给定观察的可能性。它还可用于总结分布样本空间中观察的可能性。 PDF 的图显示了熟悉的分布形状,例如高斯分布的钟形曲线。
分布通常根据其概率密度函数及其相关参数来定义。
累积密度函数(CDF)是考虑观察值的可能性的不同方式。 CDF 不是像 PDF 那样计算给定观察的可能性,而是计算观察的累积可能性以及样本空间中的所有先前观察结果。它允许您快速了解和评论给定值之前和之后的分布数量。 CDF 通常绘制为从 0 到 1 的曲线,用于分布。
PDF 和 CDF 都是连续的功能。用于离散分布的 PDF 的等效物称为概率质量函数或 PMF。
接下来,让我们看看高斯分布以及与使用统计方法时将遇到的高斯相关的其他两个分布。我们将根据它们的参数,概率和累积密度函数依次查看每个函数。
高斯分布
以 Carl Friedrich Gauss 命名的高斯分布是统计学领域的重点。
令人惊讶的是,许多研究领域的数据可以使用高斯分布来描述,以至于分布通常被称为“_ 正常 _”分布,因为它是如此常见。
可以使用两个参数描述高斯分布:
- 表示:用希腊小写字母 mu 表示,是分布的预期值。
- 方差:用希腊小写字母 sigma 表示为第二次幂(因为变量的单位是平方),描述了从均值观察的传播。
通常使用称为标准偏差的方差的归一化计算
- 标准差:用希腊小写字母 sigma 表示,描述了从均值中观察的归一化扩散。
我们可以通过规范 SciPy 模块处理高斯分布。 norm.pdf()函数可用于创建具有给定样本空间,均值和标准差的高斯概率密度函数。
下面的示例创建一个高斯 PDF,其样本空间为-5 到 5,平均值为 0,标准差为 1.具有这些平均值和标准差值的高斯分布称为标准高斯。
# plot the gaussian pdf
from numpy import arange
from matplotlib import pyplot
from scipy.stats import norm
# define the distribution parameters
sample_space = arange(-5, 5, 0.001)
mean = 0.0
stdev = 1.0
# calculate the pdf
pdf = norm.pdf(sample_space, mean, stdev)
# plot
pyplot.plot(sample_space, pdf)
pyplot.show()
运行该示例将创建一个线图,显示 x 轴上的样本空间以及 y 轴的每个值的似然性。线图显示了高斯分布的熟悉的钟形。
钟的顶部显示分布中最可能的值,称为期望值或平均值,在本例中为零,正如我们在创建分布时指定的那样。
高斯概率密度函数的线图
norm.cdf()函数可用于创建高斯累积密度函数。
下面的示例为同一样本空间创建高斯 CDF。
# plot the gaussian cdf
from numpy import arange
from matplotlib import pyplot
from scipy.stats import norm
# define the distribution parameters
sample_space = arange(-5, 5, 0.001)
# calculate the cdf
cdf = norm.cdf(sample_space)
# plot
pyplot.plot(sample_space, cdf)
pyplot.show()
运行该示例将创建一个绘图,显示 S 形,x 轴上的样本空间和 y 轴的累积概率。
我们可以看到,值 2 接近 100%的观测值,只有非常薄的分布尾部超出该点。
我们还可以看到,零点的平均值显示了该点之前和之后 50%的观测值。
高斯累积密度函数的线图
学生的 t 分布
学生的 t 分布,或简称为 t-distribution,由 William Sealy Gosset 以化名“学生”命名。
这是在尝试使用不同大小的样本估计正态分布的均值时出现的分布。因此,当描述必须考虑样本的大小时,在描述从高斯分布中提取的数据的估计人口统计相关的不确定性或误差时,这是一个有用的捷径。
虽然您可能不直接使用学生的 t 分布,但您可以根据其他统计方法(例如统计显着性检验)中所需的分布估算值。
可以使用单个参数描述分布:
- 自由度数:用小写希腊字母 nu(v)表示,表示数量自由度。
使用 t 分布的关键是知道所需的自由度数。
自由度的数量描述了用于描述人口数量的信息的数量。例如,平均值具有n自由度,因为样本中的所有n观察结果用于计算总体平均值的估计值。在计算中使用另一个统计量的统计量必须从自由度中减去 1,例如在样本方差的计算中使用均值。
T 分布中的观察结果是根据正态分布中的观察结果计算的,以便描述正态分布中种群平均值的区间。观察结果计算如下:
data = (x - mean(x)) / S / sqrt(n)
x是来自高斯分布的观察值,_ 平均值 _ 是x的平均值,S 是标准差,n是观察总数。得到的观察结果形成了( n - 1 )自由度的 t 观察。
实际上,如果在计算统计量时需要 t 分布的值,那么自由度的数量可能是 n - 1 ,其中n是从高斯分布中抽取样本的大小。
您针对给定问题使用的具体分布取决于样本的大小。
- 第 93 页,普通英语统计,第三版,2010 年。
SciPy 提供了在 stats.t 模块中处理 t 分布的工具。 t.pdf() 函数可用于创建具有指定自由度的 Student t 分布。
下面的示例使用-5 到 5 和(10,000 - 1)自由度的样本空间创建 t 分布。
# plot the t-distribution pdf
from numpy import arange
from matplotlib import pyplot
from scipy.stats import t
# define the distribution parameters
sample_space = arange(-5, 5, 0.001)
dof = len(sample_space) - 1
# calculate the pdf
pdf = t.pdf(sample_space, dof)
# plot
pyplot.plot(sample_space, pdf)
pyplot.show()
运行该示例将创建并绘制 t 分布 PDF。
我们可以看到熟悉的铃声形状与正常情况一样。关键的区别在于分布中较胖的尾部,突出了与高斯分布相比尾部观察的可能性增加。
T 分布概率密度函数的线图
t.cdf() 函数可用于创建 t 分布的累积密度函数。以下示例在与上述相同的范围内创建 CDF。
# plot the t-distribution cdf
from numpy import arange
from matplotlib import pyplot
from scipy.stats import t
# define the distribution parameters
sample_space = arange(-5, 5, 0.001)
dof = len(sample_space) - 1
# calculate the cdf
cdf = t.cdf(sample_space, dof)
# plot
pyplot.plot(sample_space, cdf)
pyplot.show()
运行这个例子,我们看到了熟悉的 S 形曲线,正如我们所看到的高斯分布,尽管从较零的概率转变为较胖的尾部的一个概率。
T 分布累积密度函数的线图
卡方 Distribution
卡方分布表示为小写希腊字母 chi(X)上升到第二幂(X ^ 2)。
与学生的 t 分布一样,卡方分布也用于统计方法,用于从高斯分布中提取的数据来量化不确定性。例如,卡方分布用于卡方统计检验中的独立性。事实上,卡方分布用于推导学生的 t 分布。
卡方分布有一个参数:
- _ 自由度 _,表示为 k。
将卡方分布中的观察值计算为从高斯分布绘制的k平方观测值的总和。
chi = sum x[i]² for i=1 to k.
chi是具有卡方分布的观察值,x是从高斯分布中得出的观察值,k是 _x 的数量 _ 观察也是卡方分布的自由度数。
同样,与学生的 t 分布一样,数据不符合卡方分布;相反,在计算高斯数据样本的统计方法时,从该分布中得出观察结果。
SciPy 提供 stats.chi2 模块,用于计算卡方分布的统计量。 chi2.pdf()函数可用于计算 0 到 50 之间具有 20 个自由度的样本空间的卡方分布。回想一下,平方和值必须为正,因此需要正样本空间。
# plot the 卡方 pdf
from numpy import arange
from matplotlib import pyplot
from scipy.stats import chi2
# define the distribution parameters
sample_space = arange(0, 50, 0.01)
dof = 20
# calculate the pdf
pdf = chi2.pdf(sample_space, dof)
# plot
pyplot.plot(sample_space, pdf)
pyplot.show()
运行该示例计算卡方 PDF 并将其显示为线图。
通过 20 个自由度,我们可以看到分布的期望值刚好小于样本空间的值 20。如果我们认为高斯分布中的大多数密度介于-1 和 1 之间,那么这是直观的,然后来自标准高斯的平方随机观测值的总和将总和恰好低于自由度数,在这种情况下为 20。
尽管分布具有钟形形状,但分布不对称。
Chi-Sared 概率密度函数的线图
chi2.cdf()函数可用于计算同一样本空间的累积密度函数。
# plot the 卡方 cdf
from numpy import arange
from matplotlib import pyplot
from scipy.stats import chi2
# define the distribution parameters
sample_space = arange(0, 50, 0.01)
dof = 20
# calculate the cdf
cdf = chi2.cdf(sample_space, dof)
# plot
pyplot.plot(sample_space, cdf)
pyplot.show()
运行该示例会创建卡方分布的累积密度函数图。
该分布有助于看到 20 左右的卡方值的可能性,分布右侧的肥尾可能会在情节结束后很长时间内持续。
卡方分布累积密度函数的线图
扩展
本节列出了一些扩展您可能希望探索的教程的想法。
- 使用新的样本空间重新创建一个分布的 PDF 和 CDF 图。
- 计算并绘制 Cauchy 和 Laplace 分布的 PDF 和 CDF。
- 从零开始查找并实现 PDF 和 CDF 的方程式。
如果你探索任何这些扩展,我很想知道。
进一步阅读
如果您希望深入了解,本节将提供有关该主题的更多资源。
图书
- 普通英语统计,第三版,2010 年。
API
用品
- 维基百科上的概率密度函数
- 维基百科上的累积分布函数
- 维基百科上的概率质量函数
- 维基百科上的正态分布
- 学生在维基百科上的 t 分布
- [维基百科上的卡方分布](en.wikipedia.org/wiki/卡方 _distribution)
摘要
在本教程中,您发现了高斯和相关分布函数以及如何计算每个函数的概率和累积密度函数。
具体来说,你学到了:
- 简要介绍标准分布,以总结观察的关系。
- 如何计算和绘制高斯分布的概率和密度函数。 T 和卡方分布与高斯分布有关。
你有任何问题吗? 在下面的评论中提出您的问题,我会尽力回答。