【Kaggle】Titanic - Machine Learning from Disaster(二)
文章目录
- 1. 前言
- 2. 预备-环境配置
- 3. 数据集处理
- 3.1 读取数据集
- 3.2 查看pandas数据信息
- 3.2.1 查看总体信息
- 3.2.2 数据集空值统计
- 3.3. 相关性分析
- 3.3.1 可以对Survived字段进行简单统计分析,观察其其大致的分布规律
- 3.3.2 训练集和测试集的单变量分析
- 3.4 相关系数分析
- 3.5 定义模型
1. 前言
在上篇文章:【Kaggle】Titanic - Machine Learning from Disaster中简单实现了比较粗暴的做法,直接堆叠了几层神经网络。但是,观察大家在Kaggle
发布的代码来看,仅仅将这个问题看做简单的机器学习模型问题即可。将该问题归纳为回归问题,可以直接使用经典的模型来解决,比如逻辑回归。当然上述问题也仅是其一。最重要的是,大家在分析问题和处理数据的时候,充分考虑了各个因素和目标变量之间的关系,通过简单的统计分析可以排除不相关因素,进而更有利于模型的拟合。在这篇文章中,将对这个题目进行较为正规和形式化的处理。
2. 预备-环境配置
由于通过kaggle
命令行的方式更加方便于提交结果和下载数据,所以在本地需要安装kaggle
。使用pip
安装即可:
pip install kaggle
或者到对应的虚拟环境中进行安装:
(base) C:\Users\w>conda install kaggle
然后到Kaggle
个人主页:
点击Account
,进入个人账户主页。点击Create New API Token
:
然后就回自动下载一个kaggle.json
文件:
打开文件可以发现,其实也就是用户登录信息。然后需要将改文件放入用户目录下的.kaggle
隐藏文件夹内:
然后修改一下Kaggle
数据集下载的时候默认下载路径(默认下载路径就是上图路径),通过命令:
C:\Users\w>kaggle config set -n path -v d://Kaggle_Dataset
- path is now set to: d://Kaggle_Dataset
比如下载来测试一下:
kaggle competitions download -c titanic
结果可以得到一个压缩包:
3. 数据集处理
3.1 读取数据集
from zipfile import ZipFile
import pandas as pd
# 1. 解压压缩文件zipfiles = ZipFile("./competitions/titanic/titanic.zip")
zipfiles.extractall("competitions/titanic/")test_data = pd.read_csv(baseDir+"test.csv")
train_data = pd.read_csv(baseDir+"train.csv")
3.2 查看pandas数据信息
3.2.1 查看总体信息
test_data.info()
结果:
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId 418 non-null int64
Pclass 418 non-null int64
Name 418 non-null object
Sex 418 non-null object
Age 332 non-null float64
SibSp 418 non-null int64
Parch 418 non-null int64
Ticket 418 non-null object
Fare 417 non-null float64
Cabin 91 non-null object
Embarked 418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB
3.2.2 数据集空值统计
test_data.isna().sum()
结果:
PassengerId 0
Pclass 0
Name 0
Sex 0
Age 86
SibSp 0
Parch 0
Ticket 0
Fare 1
Cabin 327
Embarked 0
dtype: int64
由于测试数据集共418条数据,而缺失达到了327,故而对于Cabin可以直接丢弃。
# 删除训练集和测试集的Cabin字段train_data = train_data.drop(['Cabin'], axis=1)test_data = test_data.drop(['Cabin'], axis=1)
3.3. 相关性分析
由于根据题意需要分析的是最终的测试集的Survived字段,故而从两个角度来分析:
- 异常值检验,可以对Survived字段进行简单统计分析,观察其其大致的分布规律
- 训练集和测试集的单变量分析,也就是对训练集和测试集中的对应特征,可以进行简单的单变量分布规律对比;
- 相关性分析,也就是分析各个字段对Survived字段的相关性;
import seaborn as sns
3.3.1 可以对Survived字段进行简单统计分析,观察其其大致的分布规律
sns.set()
sns.histplot(train_data['Survived'], kde=True)
观察上图可知,绘制该图没有意义,因为可取值只有1和0。只能反映一个问题就是死亡人数超过存活人数。
3.3.2 训练集和测试集的单变量分析
# 样本总数train_count = train_data.shape[0]
test_count = test_data.shape[0]
# 不同取值水平汇总后排序,再除以样本总数train_data['Pclass'].value_counts().sort_index()/train_count
# 绘制分布图(train_data['Pclass'].value_counts().sort_index()/train_count).plot()
更加直接的来说,可以绘制左右的因素在训练集和测集上的分布规律:
import matplotlib.pyplot as plt
features = ['Pclass', 'Name', 'Sex', 'Age', 'SibSp', 'Parch', 'Ticket', 'Fare', 'Embarked']for feature in features:(train_data[feature].value_counts().sort_index()/train_count).plot()(test_data[feature].value_counts().sort_index()/test_count).plot()plt.legend(['train', 'test'])plt.xlabel(feature)plt.ylabel('ratio')plt.show()
等等。这里不再完全贴出。很明显,从上述图中可以发现训练集和测试集数据分布不一致的字段有:Name、Ticket,故而可以这里可以直接将这两个字段进行删除。
# 删除训练集和测试集的Cabin字段train_data = train_data.drop(['Name', 'Ticket'], axis=1)test_data = test_data.drop(['Name', 'Ticket'], axis=1)
train_data.info()
注意到,SibSp, Parch字段的数据分布极为相似,所以这里可以对其进行合并处理,操作如下:
# 1. 将Parch和SibSp合并为Family# 训练集
train_data['Family'] = train_data['Parch'] + train_data['SibSp']
train_data['Family'].loc[train_data['Family'] > 0] = 1
train_data['Family'].loc[train_data['Family'] == 0] = 0# 删除列Parch、SibSp
train_data = train_data.drop(['Parch', 'SibSp'], axis=1)# 测试集
test_data['Family'] = test_data['Parch'] + test_data['SibSp']
test_data['Family'].loc[test_data['Family'] > 0] = 1
test_data['Family'].loc[test_data['Family'] == 0] = 0# 删除列Parch、SibSp
test_data = test_data.drop(['Parch', 'SibSp'], axis=1)
注意到train_data和test_data中均有PassengerId,故而这里可以简单校验一下数据的PassengerId是否有重复:
train_data['PassengerId'].nunique() == train_count
test_data['PassengerId'].nunique() == test_count
也就是,满足唯一条件。由于PassengerId仅用于表示数据,故而可以在训练数据集中删除,由于测试集最后输出的预测结果需要和PassengerId对应,这里先不删除。
# 删除列PassengerId
train_data = train_data.drop(['PassengerId'], axis=1)
train_data.info()
<class 'pandas.core.frame.DataFrame'>RangeIndex: 891 entries, 0 to 890Data columns (total 7 columns):Survived 891 non-null int64Pclass 891 non-null int64Sex 891 non-null objectAge 714 non-null float64Fare 891 non-null float64Embarked 889 non-null objectFamily 891 non-null int64dtypes: float64(2), int64(3), object(2)memory usage: 48.8+ KB
注意到此时,Age和Embarked字段还没有对缺失值处理,这里需要继续处理。
# 使用(mean - std) & (mean + std) 之间的随机数来填充import numpy as npage_mean = train_data['Age'].mean()
age_std = train_data['Age'].std()count_nan_age = train_data["Age"].isnull().sum()random_ages = np.random.randint(age_mean - age_std, age_mean + age_std, size=count_nan_age)train_data['Age'].loc[np.isnan(train_data['Age']) == True] = random_ages
test_data的Fare字段缺少部分值,
test_data['Fare'].isna().sum()
结果为1。由于只有一个,直接使用众数填充:
test_data['Fare'].loc[test_data['Fare'].isna() == True] = test_data['Fare'].median()
test_data.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 7 columns):
PassengerId 418 non-null int64
Pclass 418 non-null int64
Sex 418 non-null object
Age 418 non-null float64
Fare 418 non-null float64
Embarked 418 non-null object
Family 418 non-null int64
dtypes: float64(2), int64(3), object(2)
memory usage: 22.9+ KB
然后可以进一步的来分析一下每个因素和Sruvived的关系。
plt.figure(figsize=(8,6))
sns.countplot(x='Survived', hue='Sex', data=train_data)
可以看出,女性更容易存活。进一步的,统计一下每个年龄段的存活情况:
plt.figure(figsize=(20,6))train_data.Age = train_data.Age.astype(int)average_age = train_data[['Age', 'Survived']].groupby(['Age'], as_index=False).mean()sns.barplot(x='Age', y='Survived', data=average_age)
这里可以看到,年龄小和大均存活较高,可以结合年龄+性别,将用户分为:孩子、老人、男人、女人。
def get_person(person):age, sex = personif age<= 16:return 0 # 小孩elif age >= 63:return 1 # 老人else:return 2 if sex == 'male' else 3train_data['Person'] = train_data[['Age', 'Sex']].apply(get_person, axis=1)
train_data.drop(['Age', 'Sex'], axis=1, inplace=True)
然后将Embarked字段同样处理为数字,查看下类别:
train_data.Embarked.value_counts()
def get_embarked(c):if c == 'S':return 0elif c == 'Q':return 1else:return 2train_data.Embarked = train_data['Embarked'].apply(get_embarked)
现在数据集:
3.4 相关系数分析
from sklearn.linear_model import LogisticRegression
reg = LogisticRegression()reg.fit(train_feature.to_numpy(), train_label.to_numpy())
pd.DataFrame(data=reg.coef_, columns=train_feature.columns)
这里可以知道,Fare字段相关性并不大,故而可以删除。
train_feature = train_feature[['Pclass', 'Embarked', 'Family', 'Person']]
test_data = test_data[['Pclass', 'Embarked', 'Family', 'Person']]
3.5 定义模型
import tensorflow as tf
epochs = 500
model = tf.keras.Sequential()
model.add(tf.keras.layers.Dense(64, input_shape=(train_feature.shape[1], ), activation='relu'))
model.add(tf.keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
model.summary()
history = model.fit(train_feature.to_numpy(), train_label.to_numpy(), epochs=epochs)
predict = model.predict(test_data)
predict[predict < 0.5] = 0
predict[predict >= 0.5] = 1predict = predict[:, 0].astype(int)
predict
最后存储到csv文件:
submission = pd.DataFrame({"PassengerId": test.PassengerId,"Survived": predict
})
submission.to_csv('titanic.csv', index=False)
提交结果:
提高了一点点。当然,距离大佬的1还是很遥远。在这个过程中了解了数据的分析和处理手段,也挺好的。当然,完整地址:https://gitee.com/weizu_cool/kaggle/blob/master/titanic.ipynb
【Kaggle】Titanic - Machine Learning from Disaster(二)相关推荐
- Kaggle | Titanic - Machine Learning from Disaster【泰坦尼克号生存预测】 | baseline及优秀notebook总结
文章目录 一.数据介绍 二.代码 三.代码优化方向 一.数据介绍 Titanic - Machine Learning from Disaster是主要针对机器学习初学者开展的比赛,数据格式比较简 ...
- 机器学习案例学习【每周一例】之 Titanic: Machine Learning from Disaster
下面一文章就总结几点关键: 1.要学会观察,尤其是输入数据的特征提取时,看各输入数据和输出的关系,用绘图看! 2.训练后,看测试数据和训练数据误差,确定是否过拟合还是欠拟合: 3.欠拟合的话,说明模 ...
- 小白的机器学习之路(1)---Kaggle竞赛:泰坦尼克之灾(Titanic Machine Learning from Disaster)
我是目录 前言 数据导入 可视化分析 Pclass Sex Age SibSp Parch Fare Cabin Embarked 特征提取 Title Family Size Companion A ...
- 大数据第一课(满分作业)——泰坦尼克号生存者预测(Titanic - Machine Learning from Disaster)
大数据第一课(满分作业)--泰坦尼克号生存者预测(Titanic - Machine Learning from Disaster) 1 项目背景 1.1 The Challenge 1.2 What ...
- 【kaggle入门题一】Titanic: Machine Learning from Disaster
原题: Start here if... You're new to data science and machine learning, or looking for a simple intro ...
- Kaggle——泰坦尼克号(Titanic: Machine Learning from Disaster)详细过程
一.简介 1.数据 (1)训练集(train.csv) (2)测试集(test.csv) (3)提交文件示例(gender_submission.csv) 对于训练集,我们为每位乘客提供结果.模型将基 ...
- Kaggle比赛(一)Titanic: Machine Learning from Disaster
泰坦尼克号幸存预测是本小白接触的第一个Kaggle入门比赛,主要参考了以下两篇教程: https://www.cnblogs.com/star-zhao/p/9801196.html https:// ...
- 数据分析入门项目之 :Titanic: Machine Learning from Disaster
1.摘要: 本文详述了新手如何通过数据预览,探索式数据分析,缺失数据填补,删除关联特征以及派生新特征等数据处理方法,完成Kaggle的Titanic幸存预测要求的内容和目标. 2.背景介绍: Tita ...
- Titanic: Machine Learning from Disaster-kaggle入门赛-学习笔记
Titanic: Machine Learning from Disaster 对实验用的数据的认识,数据中的特殊点/离群点的分析和处理,特征工程(feature engineering)很重要. 注 ...
最新文章
- LeetCode简单题之拥有最多糖果的孩子
- 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
- 解题报告(五)组合计数(ACM / OI)超高质量题解
- opencv-python:win7下,搭建python2.7.5环境,配置opencv3.1.0准备开工-OpenCV步步精深
- android 使用shell模拟触屏_android命令行模拟输入事件(文字、按键、触摸等)
- R语言 最新TwoSampleMR、MRInstruments包安装教程
- ns3在packet中加入自定义数据
- 优科豪马冬季SUV轮胎G072的性能特点全解
- Python:1019 数字黑洞
- C# loadlibrary C++dll 句柄为空,dll加载失败
- python读csv文件中文乱码问题简单解决(附python遍历目录下csv文件并输出内容的代码)
- 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
- Trade strategy交易策略
- Matlab中meshgrid的用法简介
- 【数据处理】超好用的Excel数据拆分工具
- Bios工程师手边事—ACPI电源管理
- html 盒子模型添加图片,[HTML/CSS]盒子模型,块级元素和行内元素
- 展会圆满收官 柏克利招商峰会业绩闪亮
- 图释仿射(Affine)变换与平行投影
- json-editor-vue3 Vue3 json编辑器使用