问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

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!")

通过这个项目,我们不仅熟悉了数据科学的基本流程,还掌握了如何处理实际项目中遇到的各种问题。希望这篇文章能帮助你更好地理解数据科学项目的工作流程。

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号