Kaggle入门:泰坦尼克号生存预测实战
创作时间:
作者:
@小白创作中心
Kaggle入门:泰坦尼克号生存预测实战
引用
CSDN
1.
https://m.blog.csdn.net/qq_73075805/article/details/137377827
Kaggle入门——泰坦尼克号之灾
Kaggle的泰坦尼克号入门比赛是一个经典的机器学习项目,旨在让参与者通过建立模型来预测乘客在泰坦尼克号沉船事件中的生还情况。这个任务提供了一个包含乘客信息的训练数据集,其中包括了乘客的个人信息(如年龄、性别、船舱等级等)以及是否生还的标签。参与者需要使用这些数据建立一个模型,并使用测试数据集来验证模型的准确性。
本文将通过一个完整的项目流程,带领读者熟悉数据科学的基本操作,包括数据读取、数据分析、缺失值处理、特征工程和模型建立等步骤。
1. 数据读取
首先,我们需要导入必要的库并读取数据。
import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
import re
from sklearn.svm import SVC
from sklearn.ensemble import BaggingClassifier, VotingClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier
# 读取数据
train_data = pd.read_csv("./data/train.csv")
test_data = pd.read_csv("./data/test.csv")
2. 数据分析
拿到数据后,不要急于套用算法模型,而是先对数据进行初步探索和分析。
# 查看数据结构
print(train_data.head())
print(train_data.describe())
print(train_data.info())
接下来,我们通过可视化的方式,直观地了解各个特征与生存率之间的关系。
乘客等级与生存率
plt.figure(figsize=(8, 6))
sns.countplot(x="Pclass", hue="Survived", data=train_data, palette="viridis")
plt.title("Survival Count by Pclass")
plt.xlabel("Pclass")
plt.ylabel("Count")
plt.legend(title="Survived", labels=["No", "Yes"])
plt.show()
性别与生存率
plt.figure(figsize=(8, 6))
sns.countplot(x="Sex", hue="Survived", data=train_data, palette="viridis")
plt.title("Survival Count by Sex")
plt.xlabel("Sex")
plt.ylabel("Count")
plt.legend(title="Survived", labels=["No", "Yes"])
plt.show()
年龄与生存率
age_bins = range(0, 90, 10) # 年龄区间,每十岁为一个区间
survival_rate = train_data.groupby(pd.cut(train_data['Age'], bins=age_bins))['Survived'].mean()
plt.bar(survival_rate.index.astype(str), survival_rate.values, align='center')
plt.title('Survival Probability by Age Group')
plt.xlabel('Age Group')
plt.ylabel('Survival Probability')
plt.xticks(rotation=45)
plt.grid(axis='y')
plt.show()
堂兄弟/妹个数与生存率
plt.figure(figsize=(8, 6))
sns.countplot(x="SibSp", hue="Survived", data=train_data, palette="viridis")
plt.title("Survival Count by SibSp")
plt.xlabel("SibSp")
plt.ylabel("Count")
plt.legend(title="Survived", labels=["No", "Yes"])
plt.show()
父母与小孩个数与生存率
plt.figure(figsize=(8, 6))
sns.countplot(x="Parch", hue="Survived", data=train_data, palette="viridis")
plt.title("Survival Count by Parch")
plt.xlabel("Parch")
plt.ylabel("Count")
plt.legend(title="Survived", labels=["No", "Yes"])
plt.show()
票价与生存率
fare_bins = range(0, 600, 50) # 票价区间,每50为一个区间
survival_rate = train_data.groupby(pd.cut(train_data['Fare'], bins=fare_bins))['Survived'].mean()
plt.bar(survival_rate.index.astype(str), survival_rate.values, align='center')
plt.title('Survival Probability by Fare Group')
plt.xlabel('Fare Group')
plt.ylabel('Survival Probability')
plt.xticks(rotation=45)
plt.grid(axis='y')
plt.show()
登船港口与生存率
plt.figure(figsize=(8, 6))
sns.countplot(x="Embarked", hue="Survived", data=train_data, palette="viridis")
plt.title("Survival Count by Embarked")
plt.xlabel("Embarked")
plt.ylabel("Count")
plt.legend(title="Survived", labels=["No", "Yes"])
plt.show()
通过上述分析,我们可以更好地理解各个特征与生存率之间的关系,为后续的特征工程和模型建立提供依据。
3. 缺失值处理
在数据分析阶段,我们发现了一些特征存在缺失值。对于缺失值,我们需要进行适当的处理。
average_age_train = train_data['Age'].mean()
average_age_test = test_data['Age'].mean()
average_fare_test = test_data['Fare'].mean()
max_embarked = train_data['Embarked'].value_counts().idxmax()
train_data['Age'].fillna(average_age_train, inplace=True)
train_data['Embarked'].fillna(max_embarked, inplace=True)
test_data['Age'].fillna(average_age_test, inplace=True)
test_data['Fare'].fillna(average_fare_test, inplace=True)
4. 特征工程
为了提高模型的预测能力,我们需要对现有特征进行工程处理,提取更多有助于预测的信息。
train_data["FamilySize"] = train_data["SibSp"] + train_data["Parch"]
train_data["NameLength"] = train_data["Name"].apply(lambda x: len(x))
test_data["FamilySize"] = test_data["SibSp"] + test_data["Parch"]
test_data["NameLength"] = test_data["Name"].apply(lambda x: len(x))
def get_title(name):
title_search = re.search(' ([A-Za-z]+)\.', name)
if title_search:
return title_search.group(1)
return ""
train_titles = train_data["Name"].apply(get_title)
test_titles = test_data["Name"].apply(get_title)
title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Dr": 5, "Rev": 6, "Major": 7, "Col": 7, "Mlle": 8, "Mme": 8, "Don": 9, "Lady": 10, "Countess": 10, "Jonkheer": 10, "Sir": 9, "Capt": 7, "Ms": 2}
for k,v in title_mapping.items():
train_titles[train_titles == k] = v
test_titles[test_titles == k] = v
train_data['Title'] = train_titles
test_data['Title'] = test_titles
def replace_non_numeric(value):
if not isinstance(value, (int, float)):
return 1
return value
test_data['Title'] = test_data['Title'].apply(lambda x: replace_non_numeric(x))
5. 建立算法模型
最后,我们使用SVM(支持向量机)和RF(随机森林)模型,并通过Bagging方法进行集成。
features = [
'Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked', 'FamilySize',
'NameLength', 'Title'
]
X = train_data[features]
y = train_data['Survived']
features_to_encode = [feature for feature in features if feature != 'Title']
X = pd.get_dummies(X[features_to_encode])
X['Title'] = train_data['Title']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
svm_model = SVC(kernel='linear', random_state=42)
rf_model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1)
voting_model = VotingClassifier(estimators=[('svm', svm_model), ('rf', rf_model)], voting='hard')
bagging_model = BaggingClassifier(base_estimator=voting_model, n_estimators=10, random_state=42)
bagging_model.fit(X_train, y_train)
predictions = bagging_model.predict(X_test)
accuracy = accuracy_score(y_test, predictions)
print("Bagging 模型在测试集上的准确率:", accuracy)
6. 预测与提交
最后,我们使用训练好的模型对测试集进行预测,并生成提交文件。
X_test = test_data[features]
features_to_encode = [feature for feature in features if feature != 'Title']
X_test = pd.get_dummies(X_test[features_to_encode])
X_test['Title'] = test_data['Title']
predictions = bagging_model.predict(X_test)
output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions})
output.to_csv('submission02.csv', index=False)
print("Your submission was successfully saved!")
通过这个项目,我们不仅熟悉了数据科学的基本流程,还掌握了如何处理实际项目中遇到的各种问题。希望这篇文章能帮助你更好地理解数据科学项目的工作流程。
热门推荐
今天不是“大年三十”?未来5年没有年三十,年三十去哪了→
如何理解凯恩斯的货币需求理论
揭秘《红楼梦》:佛教与道教思想
海鸥与丹顶鹤居然是近亲?浙大团队构建鸟类“生命之树”获重要发现
阿尔法波:大脑的“心灵节律器”,如何帮助改善睡眠质量
哪些高膳食纤维粗粮值得推荐
升糖指数低的主食排行榜中,常吃粗粮有哪些好处?
大卡与千焦的能量单位换算指南,科学管理你的健康
地役权通俗易懂的说法:法律实务中的核心解析
马拉松关键在配速:最适合初跑者的配速攻略
公司未缴社保时如何写离职申请?一文详解撰写要点与法律依据
逆矩阵全面解析:性质、计算与解方程组的艺术
为什么外出回家后猫猫会跑来看我们?(猫和主人之间的依恋关系)
状态空间表达式:概念、建立方法与应用
中药熬制糊锅怎么办?这些注意事项请收好
办理失业登记在网上可以办理吗
深入解析硬盘接口及接线图解(探究硬盘三种接口的工作原理与使用方法)
驼奶粉真的能降高血糖吗?
“二月二龙抬头,三月三生轩辕”,下周轩辕诞,5件大事早做准备
手机买卖合同签订指南:从主体到售后的全流程详解
数据分析洛杉矶湖人新秀克内克特到底有多强?
智齿拔了还会再次生长吗?全方面解析智齿再生的可能性!
黑豆山药乌鸡汤:一道滋补养生的传统名汤
上海野生动物园国庆亮点层出不穷
静电、浪涌与TVS(测试标准、参数、选型)
车管所选号的时间限制是多久
库存管理模型有哪些方法
预警税负率:了解企业税收风险的利器
如何控制发票的风险
你见过绿色菊花吗?十种绿菊了解一下!