数据科学家须知:统计学中的5个悖论

2025-10-24 14:34:48 情怀礼包

我们可以在医学测试中看到准确性悖论的例子。假设有一种罕见的疾病,其发病率仅为十万分之一。如果创建了一种检测疾病的准确率为99.9%的测试,但将其用于只有0.1%的人患有这种疾病的人群,则该测试将具有99.9%的高准确率。然而,它将导致大量的假阳性,这意味着许多健康人将被错误地诊断为这种疾病。

相比使用准确性评估分类任务,精确度和召回率是更好的选择——这些指标与假阳性悖论有关,我们接着看:

2

假阳性悖论(False Positive Paradox)

当模型的准确性很高,但假阳性率也很高时,就会出现假阳性悖论。换句话说,当大量实例实际上是负的时,模型可以将它们分类为正的。这种悖论会导致错误的结论和决策。

示例:

# Define variablesnormal_count = 9999fraud_count = 1false_positives = 499.95false_negatives = 0

# Calculate precisionprecision = fraud_count / (fraud_count + false_positives)print(f "Precision: {precision:.2f}")

# Calculate recallrecall = fraud_count / (fraud_count + false_negatives)print(f "Recall: {recall:.2f}")

# Calculate accuracytrue_negatives = normal_count - false_positivesaccuracy = (true_negatives + fraud_count) / (normal_count + fraud_count)print(f "Accuracy: {accuracy:.2f}")

Output:Precision: 0.00Recall: 1.00Accuracy: 0.95

下面是产生悖论的Python代码示例:

# generate a binary classification datasetX, y = make_classification(n_samples= 1000, n_features= 10, n_informative= 5, n_redundant= 5, random_state= 42)

# split the dataset into train and test setsX_train, X_test, y_train, y_test = train_test_split(X, y, test_size= 0.3, random_state= 42)

# train a logistic regression modelmodel = LogisticRegression(random_state= 42) model.fit(X_train, y_train)

# predict on test set and get the confusion matrixy_pred = model.predict(X_test)tn, fp, fn, tp = confusion_matrix(y_test, y_pred).ravel

# calculate the accuracy, precision, and recallaccuracy = (tp + tn) / (tp + tn + fp + fn)precision = tp / (tp + fp)recall = tp / (tp + fn)

print(f "Accuracy: {accuracy:.2f}") print(f "Precision: {precision:.2f}") print(f "Recall: {recall:.2f}")

Output:Accuracy: 0.79Precision: 0.82Recall: 0.75

在这种情况下,精确度和召回率是评估模型性能的更好方法。精确度测量所有阳性分类中真阳性的比例,而召回率测量所有实际阳性实例中真阳性的比例。这些措施可以帮助避开产出假阳性悖论,并为模型的性能提供更准确的评估。

3

赌徒谬论 (Gambler’s Fallacy)

赌徒谬论,即相信过去的事件可以在随机过程中影响未来事件的概率。例如,在轮盘游戏中,一些玩家认为,如果球连续几次旋转都落在黑色上,那么下一次落在红色上的机会就会更高,尽管结果仍然是随机的。

通过Python示例,我们使用NumPy模块来模拟抛硬币:

# Simulate flipping a coin 10times results = np.random.randint( 0, 2, size= 10) print(f "Coin flips: {results}")

# Count the number of consecutive heads ortails consecutive = 0fori in range( 1, len(results)): ifresults[i] == results[i -1]: consecutive += 1else: consecutive = 0

# Print the resultifconsecutive > 0: print(f "Number of consecutive flips: {consecutive + 1}") else: print( "No consecutive flips")

Output:Coin flips: [ 0100000010] No consecutive flips

在上面的示例中,代码模拟抛硬币10次,然后计算连续正面或反面的数量。赌徒谬论表明,如果连续出现几个正面,那么下一个翻转更有可能是反面,反之亦然。然而,在现实中,每一次抛硬币都是独立的,并且产生正面或反面的机会是均等的。

我们可以在股票市场中看到赌徒谬论的例子。一些投资者可能认为,如果一只股票的价值连续几天持续上涨,那么它更有可能很快下跌,尽管市场走势本质上仍然不可预测,并受到一系列因素的影响。

4

辛普森悖论 (Simpson’s Paradox)

辛普森悖论是一种统计现象,即当一个趋势出现在一个小数据集上而数据集被划分为子组时,趋势消失或逆转。如果数据分析不正确,这可能导致错误的结论。

图片来自pexels,作者: Dominik

假设我们想要比较一所大学男女生的录取率,我们有两个部门的数据:部门A和部门B.

男性和女性的录取率示例

在上述表格中,男性和女性的综合录取率为50%。然而,当我们按部门分析数据时,我们看到在每个部门中,女性的录取率都高于男性的录取率。这似乎违反了我们的感知,因为男性的总体录取率更高。

这一悖论的出现是因为每个系的申请人数和录取率都不一样。A系的整体录取率较高,但女性报考者的比例较低。部门B的整体录取率较低,但女性报考者的比例较高。

在Python中,我们可以使用以下代码来演示:

# Create a dataframedf = pd.DataFrame({ 'Department': [ 'A', 'A', 'B', 'B'], 'Gender': [ 'Male', 'Female', 'Male', 'Female'], 'Applicants': [ 100, 80, 500, 400], 'Admitted': [ 60, 40, 40, 70]})

# Calculate admission ratesdf[ 'Admission Rate'] = df[ 'Admitted'] / df[ 'Applicants'] * 100

# Display the dataframeprint(df)

# Calculate overall admission rateoverall_rate = df[ 'Admitted'].sum / df[ 'Applicants'].sum * 100print(f "Overall Admission Rate: {overall_rate:.2f}%")

# Calculate admission rates by department andgender department_rates = df.groupby([ 'Department', 'Gender'])[ 'Admission Rate'].mean print(department_rates)

Ouput:Department Gender Applicants Admitted Admission Rate0A Male 1006060.01A Female 804050.02B Male 500408.03B Female 4007017.5Overall Admission Rate: 19.44% Department GenderA Female 50.0Male 60.0B Female 17.5Male 8.0Name: Admission Rate, dtype: float64

在上面的代码中,我们使用与上表中相同的数据创建了一个dataframe ,然后,我们计算录取率并显示dataframe 。接下来,我们计算整体录取率,即19.44%。最后,我们按部门和性别对数据进行分组,并计算每个亚组的录取率。我们看到,尽管男性的总体录取率更高,但女性在这两个部门的录取率都更高。这,即是辛普森悖论。

5

伯克森悖论 (Berkson’s Paradox)

同样作为一种统计现象,伯克森悖论,指其中两个独立或任意变量之间呈现负相关,但当数据被分成亚组时,尽管它们之间没有实际相关性,还是出现了正相关。当两个自变量具有共同的影响或原因,而该影响或原因不包括在分析中时,就会出现这种悖论。

接下来,我们使用IRIS数据集解释这个悖论——先让我们将萼片长度和宽度作为两个变量。我们可以使用PANDAS中的corr方法计算这两个变量之间的相关系数:

iris = sns.load_dataset( 'iris')

correlation = iris[ 'sepal_length'].corr(iris[ 'sepal_width']) print( 'Correlation between sepal length and width:', correlation)

Correlation between sepal length andwidth: -0.11756978413300208

正如我们所看到的,在整个数据集中,萼片长度和宽度之间存在负相关。

然而,如果我们按物种划分数据集,并分别计算每个物种的相关系数,我们可能会得到不同的结果。例如,如果我们只考虑刚毛藻物种,我们会得到一个正相关:

Correlation between sepal length andwidth forsetosa: 0.7425466856651597

这意味着刚毛藻的萼片长度和宽度之间存在正相关,与总体负相关相反。

这一悖论的出现是因为与其他物种相比,刚毛属物种的萼片长度和宽度的数值范围较小。因此,当我们只考虑刚毛藻物种时,整个数据集内的负相关性被刚毛藻物种内的正相关性所掩盖。

结论

总之,理解统计悖论对于数据科学家至关重要,它们可以帮助我们避免数据分析中的常见错误和偏差。

准确性悖论告诉我们,仅有准确性不足以评估分类任务,精确度和召回率提供的信息更多。

假阳性悖论强调了理解假阳性成本的重要性。

赌徒谬论提醒我们,每个事件都是独立的,过去的结果不会影响未来的结果。

辛普森悖论表明,汇总数据可以模糊变量之间的关系,并导致错误的结论。

最后,伯克森悖论表明,当从总体中选择非随机样本时,抽样偏差是如何发生的。

统计学中的5个悖论

意识到这些悖论可以帮助数据科学家在工作中做出更准确、更明智的决策。

原文作者:Simranjeet Singh

翻译作者:高佑兮

美工编辑:过儿

校对审稿:Chuang

本周公开课预告

USDC稳定币破发,硅谷银行倒闭引发加密市场大动荡

保姆级指南:如何利用OpenAI和Python让你的简历更出彩!

Pandas的秘密:5个鲜为人知的功能,将彻底改变你的数据分析技能

ChatGPT带你掌握高效技巧,让你的Excel效率猛增10倍!

点「在看」的人都变好看了哦返回搜狐,查看更多