文章目录

  • 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(二)相关推荐

  1. Kaggle | Titanic - Machine Learning from Disaster【泰坦尼克号生存预测】 | baseline及优秀notebook总结

    文章目录 一.数据介绍 二.代码 三.代码优化方向 一.数据介绍   Titanic - Machine Learning from Disaster是主要针对机器学习初学者开展的比赛,数据格式比较简 ...

  2. 机器学习案例学习【每周一例】之 Titanic: Machine Learning from Disaster

     下面一文章就总结几点关键: 1.要学会观察,尤其是输入数据的特征提取时,看各输入数据和输出的关系,用绘图看! 2.训练后,看测试数据和训练数据误差,确定是否过拟合还是欠拟合: 3.欠拟合的话,说明模 ...

  3. 小白的机器学习之路(1)---Kaggle竞赛:泰坦尼克之灾(Titanic Machine Learning from Disaster)

    我是目录 前言 数据导入 可视化分析 Pclass Sex Age SibSp Parch Fare Cabin Embarked 特征提取 Title Family Size Companion A ...

  4. 大数据第一课(满分作业)——泰坦尼克号生存者预测(Titanic - Machine Learning from Disaster)

    大数据第一课(满分作业)--泰坦尼克号生存者预测(Titanic - Machine Learning from Disaster) 1 项目背景 1.1 The Challenge 1.2 What ...

  5. 【kaggle入门题一】Titanic: Machine Learning from Disaster

    原题: Start here if... You're new to data science and machine learning, or looking for a simple intro ...

  6. Kaggle——泰坦尼克号(Titanic: Machine Learning from Disaster)详细过程

    一.简介 1.数据 (1)训练集(train.csv) (2)测试集(test.csv) (3)提交文件示例(gender_submission.csv) 对于训练集,我们为每位乘客提供结果.模型将基 ...

  7. Kaggle比赛(一)Titanic: Machine Learning from Disaster

    泰坦尼克号幸存预测是本小白接触的第一个Kaggle入门比赛,主要参考了以下两篇教程: https://www.cnblogs.com/star-zhao/p/9801196.html https:// ...

  8. 数据分析入门项目之 :Titanic: Machine Learning from Disaster

    1.摘要: 本文详述了新手如何通过数据预览,探索式数据分析,缺失数据填补,删除关联特征以及派生新特征等数据处理方法,完成Kaggle的Titanic幸存预测要求的内容和目标. 2.背景介绍: Tita ...

  9. Titanic: Machine Learning from Disaster-kaggle入门赛-学习笔记

    Titanic: Machine Learning from Disaster 对实验用的数据的认识,数据中的特殊点/离群点的分析和处理,特征工程(feature engineering)很重要. 注 ...

最新文章

  1. LeetCode简单题之拥有最多糖果的孩‭子
  2. 用java实现给图片增加图片水印或者文字水印(也支持视频图像帧添加水印)
  3. 解题报告(五)组合计数(ACM / OI)超高质量题解
  4. opencv-python:win7下,搭建python2.7.5环境,配置opencv3.1.0准备开工-OpenCV步步精深
  5. android 使用shell模拟触屏_android命令行模拟输入事件(文字、按键、触摸等)
  6. R语言 最新TwoSampleMR、MRInstruments包安装教程
  7. ns3在packet中加入自定义数据
  8. 优科豪马冬季SUV轮胎G072的性能特点全解
  9. Python:1019 数字黑洞
  10. C# loadlibrary C++dll 句柄为空,dll加载失败
  11. python读csv文件中文乱码问题简单解决(附python遍历目录下csv文件并输出内容的代码)
  12. 想准确识别各地方言?这套15000小时方言语音数据推荐了解一下
  13. Trade strategy交易策略
  14. Matlab中meshgrid的用法简介
  15. 【数据处理】超好用的Excel数据拆分工具
  16. Bios工程师手边事—ACPI电源管理
  17. html 盒子模型添加图片,[HTML/CSS]盒子模型,块级元素和行内元素
  18. 展会圆满收官 柏克利招商峰会业绩闪亮
  19. 图释仿射(Affine)变换与平行投影
  20. json-editor-vue3 Vue3 json编辑器使用

热门文章

  1. PHP借用Redis消息队列实现高并发下发送邮件功能
  2. java.lang.NullPointterException:
  3. 算法——动态规划(DP)
  4. autoconf使用
  5. 最新苹果开发者账号注册申请流程最强详解!
  6. 日期格式符RR和YY的区别
  7. python基础第二课(小白piao分享)
  8. 【vbs脚本】02.高级
  9. Python_Cxfreeze打包exe
  10. 单例模式(饥汉式、懒汉式)