重采样方法完整指南

machine learningpythondata science

重采样是一种统计技术,用于收集更多数据样本,从中可以推断出总体或生成初始数据的过程。当需要根据给定数据估计总体参数或可访问的数据点很少时,这些方法被广泛用于数据分析。重采样方法通常使用引导、刀切法和置换测试等技术来估计标准误差、置信区间和 p 值。分析和解释数据是数据科学家最重要的职责之一。然而,提供的数据并不总是具有足够的代表性,这可能会导致错误的推断。在这些情况下,可以使用重采样技术从现有数据创建新样本,以便更准确地估计参数或测试假设。本文将全面概述重采样策略(引导和置换检验),包括其种类、优点和缺点。

引导

引导是一种重采样技术,其中重复对数据集进行替换采样以提供新样本,然后使用这些新样本来计算有趣统计数据的变异性。可以使用这种方法估算各种统计模型和估计量的标准误差、置信区间和假设检验的 p 值。在引导法中,会针对每个新样本获取感兴趣的统计数据,然后利用这些统计数据的分布来推导统计数据的总体变异性。

优点

  • 引导法是一种非参数方法,因为它不依赖于总体分布假设。

  • 它是一种有价值的数据分析方法,因为它可以抵抗数据中的异常值和非正态性。

  • 可以使用此方法估计许多其他统计数据的变异性,例如平均值、中位数、相关性和回归系数。

  • 它是假设检验和置信区间计算的有力工具,因为它可以精确估计统计不确定性。

缺点

  • 引导法可以计算要求很高,特别是当数据集很大或感兴趣的统计数据需要复杂的计算时。

  • 在样本量有限或总体偏斜的情况下,可能会引入偏差。

  • 由于它基于数据点是独立的这一想法,因此它可能不适合依赖数据,例如时间序列数据。

示例

本示例将使用 scikit-learn 中的 iris 数据集。

import numpy as np
from sklearn.datasets import load_iris

# 加载 iris 数据集
iris = load_iris()
X = iris.data
y = iris.target

# bootstrap 函数
def bootstrap(data, n_bootstraps, statistic):
   """Generate new samples by bootstrapping the data and calculate the statistic."""
   
   # 初始化数组来存储统计数据
   boot_statistic = np.zeros(n_bootstraps)
  
   # 通过引导数据生成新样本
   for i in range(n_bootstraps):
       bootstrap_sample = np.random.choice(data, size=len(data), replace=True)
       boot_statistic[i] = statistic(bootstrap_sample)
  
   return boot_statistic

# 通过 bootstrapping 计算平均萼片长度
mean_sepal_length = np.mean(X[:, 0])
boot_means = bootstrap(X[:, 0], n_bootstraps=1000, statistic=np.mean)
lower, upper = np.percentile(boot_means, [2.5, 97.5])
print(f"平均萼片长度: {mean_sepal_length:.2f}")
print(f"95% 置信区间: ({lower:.2f}, {upper:.2f})")

输出

平均萼片长度: 5.84
95% 置信区间: (5.72, 5.99)

在开始之前,鸢尾花数据集最初加载到代码示例中从特征矩阵 X 中提取萼片长度值。然后,定义一个引导函数,该函数接受三个参数:数据、引导次数和统计函数。通过引导数据,该函数创建新样本并计算每个引导样本提供的统计数据。

接下来,我们计算原始数据集的平均萼片长度,使用引导函数生成 1000 个新样本,然后计算每个样本的平均萼片长度。然后使用百分位数函数获取平均萼片长度的 95% 置信区间。

置换检验

在重采样方面,置换检验是一种可靠且适应性强的方法,可用于多种统计检验。与使用放回抽样的引导不同,置换检验通过随机排列初始数据集中一个或多个变量的值来创建新样本。因此,它们对于评估有关两个或多个组之间的差异的假设或确定两个测量值之间差异的重要性特别有用。每种类型的数据都可以进行置换检验,这与底层的总体分布假设无关。

优点

  • 置换检验中使用的总体分布不做任何假设。它们是灵活的工具,可以处理各种数据类型和实验布局。

  • 置换检验用于从原始数据集生成新样本,从而产生不确定性和重要性的精确估计。它们更可靠,因为它们不像传统测试那样依赖于样本大小或总体分布的假设。

  • 置换检验可用于运行各种统计测试,包括 t 检验、方差分析和相关性分析。

  • 在样本量有限或数据非正态分布的情况下,置换检验通常比传统测试更成功。

缺点

  • 当样本量或排列数量很大时,置换检验在计算上要求很高。

  • 几种类型的数据或实验设计可能不适合置换检验,特别是当数据包含异常值或缺失值时。

  • 向非专家解释置换检验可能具有挑战性,因为它可能比专业人士更难理解。标准测试。

示例

当然!这是一个使用 scipy 模块的示例,用于展示如何在 Python 中进行排列测试。将使用"鸢尾花"数据集,其中包含三种不同类型的鸢尾花的萼片长度、萼片宽度、花瓣长度和花瓣宽度的测量值。

import numpy as np
from scipy.stats import ttest_ind

# 加载鸢尾花数据集
from sklearn.datasets import load_iris
iris = load_iris()
setosa_petal_length = iris.data[:50, 2] # 选择第一个物种的花瓣长度
versicolor_petal_length = iris.data[50:100, 2] # 选择第二个物种的花瓣长度

# 计算两组之间观察到的均值差异
obs_diff = np.mean(setosa_petal_length) - np.mean(versicolor_petal_length)

# 置换检验
n_permutations = 10000
diffs = []
for i in range(n_permutations):

    # 随机排列数据
    permuted_data = np.random.permutation(np.concatenate([setosa_petal_length, versicolor_petal_length]))
    
    # 将排列后的数据分成两组
    permuted_setosa = permuted_data[:50]
    permuted_versicolor = permuted_data[50:]
    
    # 计算两组之间的均值差异
    permuted_diff = np.mean(permuted_setosa) - np.mean(permuted_versicolor)
    diffs.append(permuted_diff)

# 计算 p 值,即排列后差异大于或等于观察到的差异的比例
p_value = np.sum(np.array(diffs) >= obs_diff) / n_permutations
print('Observed difference in means:', obs_diff)
print('p-value:', p_value)

输出

Observed difference in means: -2.7979999999999996
p-value: 1.0

在本例中,我们将应用置换检验来调查鸢尾花品种 setosa 和 versicolor 的花瓣长度没有差异的断言。计算两组之间的观察到的平均差异后,对数据进行随机置换,并确定每次置换的平均差异。p 值计算为在该方法重复 10,000 次后,置换差异大于或等于观察到的差异的比例。如果 p 值低于预定的显著性水平,则忽略零假设,并判定两个品种的花瓣长度存在显著差异(例如 0.05)。

结论

总之,为了有效地估计不确定性和衡量统计检验的显著性,重采样技术是数据科学家工具箱中的重要组成部分。重采样技术使数据科学家能够得出有关潜在种群分布的结论,而无需对其特征或形式做出任何假设。这一点至关重要,因为典型的统计测试在应用于小样本或有偏差的样本时可能不准确。使用重采样技术,还可以评估机器学习模型的稳定性,并预测它们在未经测试的新数据上的性能。数据科学家可以通过采用引导、交叉验证和置换测试等重采样技术来确保他们的发现是可靠的、值得信赖的和可重复的。


相关文章