幸存者偏差

一位年轻的统计学家如何识别一种称为“幸存者偏差”的认知偏差并拯救生命:

第二次世界大战期间,美国希望为其飞机的特定区域增加加固装甲。

分析人员检查了返回的轰炸机,绘制了它们的弹孔和损坏情况(如下图所示),并得出结论,在尾部、机身和机翼上增加装甲将提高它们的生存几率。

但一位名叫亚伯拉罕·沃尔德 (Abraham Wald) 的年轻统计学家指出,这将是一个悲剧性的错误。

通过只绘制返回飞机上的数据,他们系统地忽略了一个关键的、信息丰富的子集上的数据:

受损且无法返航的飞机。

• “看到”的飞机受到了可幸存的损坏。 • “看不见的”飞机遭受了实际未受的损坏。

沃尔德得出的结论是,应该在返回飞机的“未受伤”区域(下图中没有弹孔的区域)添加装甲。

他的深刻逻辑是:幸存者没有受伤的地方,实际上是飞机最脆弱的地方。

根据他的见解,军方加固了发动机和其他易损部件,显着提高了战斗中机组人员的安全,挽救了数千人的生命。

亚伯拉罕·沃尔德(Abraham Wald)发现了一种称为“生存偏差”的认知偏差:

由于系统地关注幸存者(成功)而忽略伤亡(失败)而产生的错误导致我们错过了真正的基本生存率(实际成功概率)并得出有缺陷的结论。

生存偏差无处不在——它给企业带来的成本可能是巨大的。

当我们未能考虑结果的范围和隐藏的证据时,我们就会对现实产生一种扭曲的(而且通常是不正确的)看法。

看不见的东西往往比看得见的东西更有价值。

幸存者偏差是指关注成功结果而忽视非幸存者的倾向。它导致对现实过于乐观的看法——仅对幸存者的分析不够有力或富有洞察力。评估企业和投资的情况经常发生。

你经历过哪些可以归为“幸存者偏差”的事情?

以下是使用Jupyter Notebook进行泰坦尼克号幸存者分类的步骤: 1. 导入必要的库和数据集 ```python import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') ``` 2. 数据探索和可视化 ```python # 查看数据集前5行 train_data.head() # 查看数据集信息 train_data.info() # 查看数据集中数值型特征的统计信息 train_data.describe() # 查看数据集中各特征之间的相关性 sns.heatmap(train_data.corr(), annot=True, cmap='coolwarm') # 查看幸存者和未幸存者的数量 sns.countplot(x='Survived', data=train_data) # 查看不同性别的幸存者和未幸存者的数量 sns.countplot(x='Survived', hue='Sex', data=train_data) # 查看不同船舱等级的幸存者和未幸存者的数量 sns.countplot(x='Survived', hue='Pclass', data=train_data) # 查看不同年龄段的幸存者和未幸存者的数量 sns.histplot(x='Age', hue='Survived', data=train_data, kde=True) ``` 3. 数据清洗和特征工程 ```python # 填充缺失值 train_data['Age'].fillna(train_data['Age'].median(), inplace=True) test_data['Age'].fillna(test_data['Age'].median(), inplace=True) test_data['Fare'].fillna(test_data['Fare'].median(), inplace=True) # 将性别和登船港口转换为数值型特征 train_data['Sex'] = train_data['Sex'].map({'male': 0, 'female': 1}) test_data['Sex'] = test_data['Sex'].map({'male': 0, 'female': 1}) train_data['Embarked'] = train_data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}) test_data['Embarked'] = test_data['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}) # 创建新特征FamilySize和IsAlone train_data['FamilySize'] = train_data['SibSp'] + train_data['Parch'] + 1 test_data['FamilySize'] = test_data['SibSp'] + test_data['Parch'] + 1 train_data['IsAlone'] = np.where(train_data['FamilySize'] == 1, 1, 0) test_data['IsAlone'] = np.where(test_data['FamilySize'] == 1, 1, 0) # 删除无用特征 train_data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp', 'Parch'], axis=1, inplace=True) test_data.drop(['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp', 'Parch'], axis=1, inplace=True) ``` 4. 模型训练和预测 ```python from sklearn.model_selection import train_test_split from sklearn.linear_model import LogisticRegression from sklearn.metrics import accuracy_score X = train_data.drop('Survived', axis=1) y = train_data['Survived'] X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42) model = LogisticRegression() model.fit(X_train, y_train) y_pred = model.predict(X_test) print('Accuracy:', accuracy_score(y_test, y_pred)) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值