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!")
通过这个项目,我们不仅熟悉了数据科学的基本流程,还掌握了如何处理实际项目中遇到的各种问题。希望这篇文章能帮助你更好地理解数据科学项目的工作流程。
热门推荐
上海无犯罪记录证明线上申请指南(入口+流程)
中山崖口村:“农文旅”闯出兴村富民之路
老年人高血压如何治疗和调理
玛卡知识:功效、种类、食用方法与注意事项全解析
工资个人所得税如何进行合理规划
建设银行卡单日限额怎么解除?必须去开户行解除吗?
股票挂单什么意思?股票挂单的技巧和策略有哪些?
水产低碳养殖水质监测应用方案
全民“补钙”怎么补?最新指南分人群给出精准指导
高铁知识大全:从基础概念到乘坐指南
巴萨vs多特蒙德:状态低迷的多特,能不能将晋级悬念带回德国?
欧冠巴萨VS多特:全面占优,弗里克胜算很大,最强首发11人已浮现
家用雾化器选购指南:关键要素全解析
高温来袭,如何有效防治儿童中暑?
电子电路的基础知识
论苏轼诗词的境界 ——兼与李白诗歌的境界之辨
不锈钢工业焊管的安装与维护指南
财务报表编制流程的关键节点在哪里?
全方位安全防护与应急处理实战指南,守护您的每一刻
尔塔阿雷火山:埃塞俄比亚的地心之门
上吐下泻恶心反胃想吐拉稀
咖啡中的霉菌毒素真相:含量远低于危险水平,符合国标可放心饮用
研究证实:健康App能有效改善冠心病患者生活方式
如何正确使用蛋白粉?
蛋白粉对人体的副作用有哪些
P2P理财暴雷后,现在还有哪些高收益低风险选择?
PMP证书报考条件详解:你需要知道的5个关键点
侏罗纪天空“拼图者”
曲线拟合——最小二乘法(Ordinary Least Square,OLS)
从天朝上国到睁眼看世界,鸦片战争给中国带来了哪些变化?