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!")
通过这个项目,我们不仅熟悉了数据科学的基本流程,还掌握了如何处理实际项目中遇到的各种问题。希望这篇文章能帮助你更好地理解数据科学项目的工作流程。
热门推荐
第三季度亏损1.64亿元 光明乳业能否守住基本盘?
广州首次发现暴龙超科化石!广东还生活过哪些恐龙?
中阮的三种定弦方法详解
五行相生相克起名详解
信息安全数学基础:同态和同构的概念与应用
律师事务所为何不需营业执照?三种存在模式详解
新加坡数学体系的优势及推荐数学竞赛
手机产业链的主要环节有哪些?
激光成像如何进行高速度的瑕疵检测
探究长期饮用丹参茶的安全性
高考作文要求详解:从基础到发展的全方位指南
养胃生津、补益提气......不同蘑菇营养不同
养胃生津、补益提气......不同蘑菇营养不同
道家思想的核心精髓:回归自然与内心的和谐
如何用日语进行自我介绍(附翻译示例)
以人为本:养老院适老化设计的核心理念
室内适老化设计的重要性及虚拟仿真教学系统的应用
热式气体质量流量计,助力空压机能效提升约15%
小麦如何做好冻害预防
确保气体同位素分装质量的关键步骤
稀有气体产业竞逐需求新赛道
卧室门尺寸标准及门洞预留规范
标准卫生间门尺寸一般是多少?选择合适的家居门尺寸
工业再生水水质检测最新国家标准GB/T 19923—2024
民事诉讼立案申请书的撰写指南与实务解析
个体工商户可以领取失业金吗?条件、流程及注意事项详解
肠梗阻的最佳治疗方法
70岁老人反复便秘导致肠梗阻 专家:老年人3-4天未排便就要引起重视
如何有效召开在线会议
项目经理如何开好周例会