【Kaggle】Titanic – Machine Learning from Disaster

文章目录

1. 题目描述

[En]

The process is to download the dataset and copy it to the project directory. Then the data is processed, including missing values, invalid fields, and so on. The first thing you need to understand is the meaning of each field, and then decide which fields are invalid, and then deal with them programmatically. For example, the data format is:

; 3. 解答

[En]

The most direct way is to build a sequence model and then predict it. That is:

def train(feature, label, epochs=10):
model = tf.keras.Sequential()
model.summary()
history = model.fit(feature, label, epochs=epochs, batch_size=64)
plot_loss_and_accuracy(history)
return model


def plot_loss_and_accuracy(history):
"""
绘制loss和accuracy的图像
"""
history_loss = history.history['loss']
history_accuracy = history.history['accuracy']

plt.plot(history_loss, label="loss")
plt.plot(history_accuracy, label="accuracy")
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.show()


[En]

Here, consider to see what other people write. Of course, record your own code:

"""
by: 梦否
date: 2022-4-11
"""
import pandas as pd
import numpy as np
import tensorflow as tf
import matplotlib.pyplot as plt

def get_raw_data(dataset_name):
return train_data

def get_train_data(dataset_name):
raw_data = get_raw_data(dataset_name)

drop_data = raw_data.drop(['Name'], axis=1)

drop_data.replace('male', 0, inplace=True)
drop_data.replace('female', 1, inplace=True)

drop_data.fillna(0, inplace=True)
average_age = round(drop_data['Age'].mean())
drop_data['Age'] = drop_data['Age'].apply(lambda age: average_age if age == 0 else age)

drop_data = drop_data.drop(['Ticket'], axis=1)
drop_data = drop_data.drop(['Cabin'], axis=1)
drop_data = drop_data.drop(['Embarked'], axis=1)
drop_data = drop_data.drop(['PassengerId'], axis=1)

train_feature = drop_data.iloc[:, 1:].to_numpy()
train_label = drop_data.iloc[:, 0].to_numpy()
return train_feature, train_label

def get_test_data(dataset_name):
raw_data = get_raw_data(dataset_name)

drop_data = raw_data.drop(['Name'], axis=1)
drop_data = drop_data.drop(['Ticket'], axis=1)
drop_data = drop_data.drop(['Cabin'], axis=1)
drop_data = drop_data.drop(['Embarked'], axis=1)

drop_data.replace('male', 0, inplace=True)
drop_data.replace('female', 1, inplace=True)

drop_data.fillna(0, inplace=True)
average_age = round(drop_data['Age'].mean())
drop_data['Age'] = drop_data['Age'].apply(lambda age: average_age if age == 0 else age)

identify = drop_data.iloc[:, 0].to_numpy()
feature = drop_data.iloc[:, 1:].to_numpy()
return identify, feature

def train(feature, label, epochs=10):
model = tf.keras.Sequential()
model.summary()
history = model.fit(feature, label, epochs=epochs, batch_size=64)
plot_loss_and_accuracy(history)
return model

def plot_loss_and_accuracy(history):
"""
绘制loss和accuracy的图像
"""
history_loss = history.history['loss']
history_accuracy = history.history['accuracy']

plt.plot(history_loss, label="loss")
plt.plot(history_accuracy, label="accuracy")
plt.grid(True, linestyle='--', alpha=0.5)
plt.legend()
plt.show()

def predict_model(model, feature):
predict = model.predict(feature)
predict[predict < 0.5] = 1
predict[predict >= 0.5] = 0
return predict

if __name__ == '__main__':
train_x, train_y = get_train_data("./dataset/train.csv")
print(train_x)
identify, feature = get_test_data("./dataset/test.csv")
model = train(train_x, train_y, epochs=500)
predict = predict_model(model, feature)
submission = pd.DataFrame({
"PassengerId": identify,
"Survived": predict[:, 0].astype(int)
})
submission.to_csv('result.csv', index=False)

1. 代码学习

4.1 数据集处理

; 2. 分析字段Fare

[En]

Here the author’s missing value handling is worth recording:

test_df["Fare"].fillna(test_df["Fare"].median(), inplace=True)


[En]

It is populated directly with the original data average, which is divided into several steps in my code:


drop_data.fillna(0, inplace=True)
average_age = round(drop_data['Age'].mean())
drop_data['Age'] = drop_data['Age'].apply(lambda age: average_age if age == 0 else age)



fare_not_survived = titanic_df["Fare"][titanic_df["Survived"] == 0]
fare_survived     = titanic_df["Fare"][titanic_df["Survived"] == 1]


[En]

Then, calculate the average and standard deviation:


avgerage_fare = DataFrame([fare_not_survived.mean(), fare_survived.mean()])
std_fare      = DataFrame([fare_not_survived.std(), fare_survived.std()])


[En]

Then the average value is drawn as a bar graph, and the standard deviation is used as the error line, that is:


avgerage_fare.plot(yerr=std_fare,kind='bar',legend=False)


3. 分析字段Age

[En]

There is also a missing value in this field, and the processing here is as follows:

generate random numbers between (mean – std) & (mean + std)


average_age_titanic   = titanic_df["Age"].mean()
std_age_titanic       = titanic_df["Age"].std()
count_nan_age_titanic = titanic_df["Age"].isnull().sum()


[En]

Then, generate the corresponding random number:


rand_1 = np.random.randint(average_age_titanic - std_age_titanic, average_age_titanic + std_age_titanic, size = count_nan_age_titanic)



titanic_df["Age"][np.isnan(titanic_df["Age"])] = rand_1
test_df["Age"][np.isnan(test_df["Age"])] = rand_2



titanic_df['Age'] = titanic_df['Age'].astype(int)


[En]

Looking at the picture above, we can see that whether it is survival or death, the distribution of age data is similar and indistinguishable. So the author made a statistic:

[En]

According to the statistics of the number of survivors at all ages, it can be seen here that it is related, that is, it is easier to survive when young or old. That is, relevant.

4. 分析字段Cabin

[En]

Because its missing value is too much, it is excluded directly.

5. 分析字段Parch & SibSp

titanic_df['Family'] =  titanic_df["Parch"] + titanic_df["SibSp"]


[En]

To facilitate processing, convert directly to:

titanic_df['Family'].loc[titanic_df['Family'] > 0] = 1


[En]

Then draw the relationship between the two:

family_perc = titanic_df[["Family", "Survived"]].groupby(['Family'],as_index=False).mean()
sns.barplot(x='Family', y='Survived', data=family_perc, order=[1,0], ax=axis2)


[En]

Observation shows that the survival rate of people without families is about 0.2 lower than that of families with families. Most people do not have a family, so some families may have a higher survival rate. That is, relevant.

6. 分析字段Sex

def get_person(passenger):
age,sex = passenger
return 'child' if age < 16 else sex

titanic_df['Person'] = titanic_df[['Age','Sex']].apply(get_person,axis=1)
test_df['Person']    = test_df[['Age','Sex']].apply(get_person,axis=1)



person_perc = titanic_df[["Person", "Survived"]].groupby(['Person'],as_index=False).mean()
sns.barplot(x='Person', y='Survived', data=person_perc, ax=axis2, order=['male','female','child'])


[En]

What is more prominent is that the number of children is the least, but the survival rate is relatively high; the number of women is relatively small, but the survival rate is also much higher than that of men, and the polarity difference is relatively large, so this factor is more important.

; 4.2 模型搭建

[En]

After the data is processed, the logical regression model is used directly:

logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
Y_pred = logreg.predict(X_test)
logreg.score(X_train, Y_train)


random_forest = RandomForestClassifier(n_estimators=100)
random_forest.fit(X_train, Y_train)
Y_pred = random_forest.predict(X_test)
random_forest.score(X_train, Y_train)


submission = pd.DataFrame({
"PassengerId": test_df["PassengerId"],
"Survived": Y_pred
})
submission.to_csv('titanic.csv', index=False)


4.3 总结

Original: https://blog.csdn.net/qq_26460841/article/details/124107000
Author: 梦否
Title: 【Kaggle】Titanic – Machine Learning from Disaster

(0)

大家都在看

• 【机器学习】——白话入门及术语解释

文章目录 前言 一、以普通例子循序渐进讲解什么是机器学习 二、通过西瓜的例子类比学习一些相关术语 * 1. 以数据表格方式学习 2. 还记得坐标系么 3. 训练相关的一些术语 三、…

人工智能 2023年7月26日
0125
• python绘制热度图(heatmap)

1、简单的代码 from matplotlib import pyplot as plt import seaborn as sns import numpy as np impo…

人工智能 2023年7月14日
0135
• 什么是池化，它有哪些不同的类型

什么是池化？ 池化（Pooling）是深度学习中的一种常用操作，它的主要功能是减小卷积神经网络（CNN）中特征图的空间尺寸。池化层通常紧跟在卷积层之后，通过将特征图的空间维度降低，…

人工智能 2024年1月1日
0172
• matlab 回归 逻辑斯蒂_逻辑斯蒂回归模型

概率无向图模型 主要思想：根据现有的数据对分类边界线（decision boundary）建立回归公式，以此分类。 逻辑斯蒂回归模型 在线性回归模型的基础上，使用Sigmoid函数…

人工智能 2023年6月18日
0171
• 【WeiboSpider】微博爬虫使用攻略

啊哦~你想找的内容离你而去了哦 内容不存在，可能为如下原因导致： ① 内容还在审核中 ② 内容以前存在，但是由于不符合新 的规定而被删除 ③ 内容地址错误 ④ 作者删除了内容。 可…

人工智能 2023年7月4日
0133
• linux下载/解压ImageNet-1k数据集

&#x672C;&#x6587;&#x5728;Linux&#x4E2D;&#xFF0C;&#x5904;&#x7406;&…

人工智能 2023年6月23日
0526
• 【图像处理】获取图片像素点

获取图片像素点 本文通过两种方法获取图片的像素点，方法1通过java自带的API，方法2通过OpenCV的API。 1.Java自带API获取像素点 函数声明： public in…

人工智能 2023年6月17日
0138
• 将yolov5中的PANet层改为BiFPN

人工智能 2023年7月26日
0137
• 航空公司客户价值聚类分析

航空公司客户价值聚类分析 特征工程 K-means聚类 RFM模型 DBSCAN算法 描述 信息时代的来临使得企业营销焦点从产品中心转变成客户中心。具体地，对不同的客户进行分类管理…

人工智能 2023年6月4日
0157
• pandas大总结（宝典）—看这篇就够了

目录 一、pandas统计分析 1、读取数据 2、DataFrame的增删改查 3、DataFrame的描述分析 4、时间数据 5、分组聚合 6、透视表与交叉表 二、数据预处理 1…

人工智能 2023年7月7日
0109
• MYSQL 主从复制 — binlog

一个MYSQL数据库存在的问题 在谈主从复制之前，应该都会有一个疑问，那么就是一个MYSQL数据库存在的问题呢？ 读和写所有压力都由一台数据库承担，压力大 数据库服务器磁盘损坏则数…

人工智能 2023年7月29日
0150
• 仅5天注册用户超百万，爆火ChatGPT究竟是什么？

作者：qizailiu，腾讯 IEG 应用研究员，来自腾讯技术工程 OpenAI 近期发布聊天机器人模型 ChatGPT，迅速出圈全网。它以对话方式进行交互。以更贴近人的对话方式与…

人工智能 2023年7月31日
0157
• 使用Anaconda安装pytorch（CPU版）

一、准备 1.Python版本选择 在官方文档（https://pytorch.org/get-started/locally/）中显示：目前，Windows 上的 PyTorch…

人工智能 2023年7月22日
0165
• make和shell入门

make基础 1. make的显式规则 在Linux操作系统下编程时，通常利用make命令来自动完成编译工作。Make命令根据一个称为makefile的文件来完成并自动维护编译工作…

人工智能 2023年6月4日
0140
• 10分钟让小白的你懂得机器视觉与抓取对象机械手系统设计

1.本文基于机器视觉的可以分为三层：决策层。处理层和执行层。 本文主要拟解决以下关键技术问题。 [En] The following key technical issues ar…

人工智能 2023年5月27日
0134
• vue页面实现语音播报

1、vue页面添加鼠标滑动事件 默认情况下，现代浏览器不支持自动语音广播。你需要第一次主动开机，然后就会自动播出。 [En] Modern browsers do not supp…

人工智能 2023年5月27日
0343