实验六:泰坦尼克生存预测之缺失值处理

一、任务描述

背景故事:

泰坦尼克号RMS Titanic),又译作铁达尼号,是英国白星航运公司下辖的一艘奥林匹克级游轮,排水量46000吨,于1909331日在北爱尔兰贝尔法斯特港的哈兰德与沃尔夫造船厂动工建造,1911531日下水,191242日完工试航。泰坦尼克号是当时世界上体积最庞大、内部设施最豪华的客运轮船,有“永不沉没”的美誉 。然而不幸的是,在它的处女航中,泰坦尼克号便遭厄运——它从英国南安普敦出发,途经法国瑟堡-奥克特维尔以及爱尔兰科夫(Cobh),驶向美国纽约。19124142340分左右,泰坦尼克号与一座冰山相撞,造成右舷船艏至船中部破裂,五间水密舱进水。415日凌晨220分左右,泰坦尼克船体断裂成两截后沉入大西洋底3700米处。2224名船员及乘客中,1517人丧生,其中仅333具罹难者遗体被寻回。泰坦尼克号沉没事故为和平时期死伤人数最为惨重的一次海难,其残骸直至1985年才被再度发现,目前受到联合国教育、科学及文化组织的保护。

泰坦尼克号的沉没是历史上著名的海难事件,当时登船乘客数以千计。他们的个人信息各不相同,生还罹难遭遇各异。虽然,人们对他们的遭遇表示不幸,但是这个灾难也给数据分析和预测提供了比较丰富的数据样品。

数据集中有部分缺失值,通过不同的方法进行填充

二、数据集分析

数据集来自Kaggle网站,网址为:https://www.kaggle.com/c/titanic

数据集中有12个特征,其中Survived是目标值,其余各个特征代表的意思:

  • PassengerId : 乘客ID,这个是自动生成的
  • Pclass : 乘客等级(1/2/3等舱位)
  • Name : 乘客姓名
  • Sex : 性别
  • Age : 年龄
  • SibSp : 堂兄弟/妹个数
  • Parch : 父母与小孩个数
  • Ticket : 船票信息
  • Fare : 票价
  • Cabin : 客舱
  • Embarked : 登船港口

三、代码实现

import pandas as pd   # 数据分析,组织表格的形式
import numpy as np
import matplotlib.pyplot as plt
from sklearn import neighbors

data = pd.read_csv('train.csv')
print(data.info())
print(data.head())  

# 缺失值的识别
# 判断各变量中是否存在缺失值
print(data.isnull().any(axis=0))
# 各变量中缺失值的数量
print(data.isnull().sum(axis=0))
# 各变量中缺失值的比例
print(data.isnull().sum(axis = 0)/data.shape[0])

# 缺失值的处理方法
# 方法1:删除法
# 删除无效列,drop默认删除行,列需要加axis=1
# 删除缺失严重的Cabin变量
data.drop(labels='Cabin',axis=1,inplace=True)
# 删除无关紧要的变量
data.drop(['PassengerId','Ticket','Name'],axis=1,inplace=True)
print(data.info())
print(data.head())   
# 删除缺失行,根据Embarked变量,删除对应的缺失行
data.dropna(subset=['Embarked'], inplace=True)

#print(data.isnull().sum())  #打印各个特征值的空值总和

# 方法2:替换法,中位数,均值,众数等
'''
print(data.Age)
# 利用所有人年龄的中位数来填补 年龄数据中的缺失值
print(data.Age.describe())
print("年龄的中位数是:",data.Age.median())
print("年龄的均值是:",data.Age.mean())
age_median = data.Age.median()
data.Age.fillna(age_median,inplace=True)
print(data.Age.describe())
print(data.Age)
print(data.info())
'''

# 方法3:插补法,需要用到机器学习算法
# 将字符型的性别变量映射为数值变量
data.Sex = data.Sex.map({'male':1,'female':0})
data.drop(labels='Embarked',axis=1,inplace=True)
print(data)

# 将数据拆分为两组,一是年龄缺失组,二是年龄非缺失组,
missing = data.loc[data.Age.isnull(),]
nomissing = data.loc[~data.Age.isnull(),]
print(missing)
print(nomissing)

# 基于非缺失值构建KNN(K近邻回归)模型,再对缺失组做预测
# 提取出所有的自变量
X = nomissing.columns[nomissing.columns != 'Age']
# 构建模型,K近邻(回归)模型
knn = neighbors.KNeighborsRegressor()
# 模型拟合
knn.fit(nomissing[X], nomissing.Age)
# 年龄预测
pred_age = knn.predict(missing[X])
print(pred_age)
# missing['Age'] = pred_age
data.loc[data.Age.isnull(),'Age'] = pred_age
print(data)

四、重点讲解

1、对于缺失值的处理,归纳为三种方法:

方法一:删除法

该方法通常用来删除缺失值较多,且对最终预测结果影响不大的特征;或者删除缺失值较少的特征所对应的样本,删除少量的样本也并不会影响最终的预测结果。

方法二:替换法

该方法常常通过统计信息,利用需要填充的特征已有的数据,计算中位数、平均数、众数等,选择其一填充进所有的缺失值,缺失值填充的值一致。

方法三:插补法

该方法需要利用回归算法推断出该条样本特定特征最大可能的取值,也就是使用了最有可能的值来填充缺失值,每个缺失值不一定相同,准确性更高。

2、pandas:

  • pandas是一个强大的分析结构化数据的工具集
  • 它的使用基础是Numpy(提供高性能的矩阵运算)
  • 用于数据挖掘和数据分析,同时也提供数据清洗功能

Pandas中常见的数据结构有两种:

  • Pandas Series
    • Pandas series 是像数组一样的一维对象,可以存储很多类型的数据。Pandas series Numpy array之间的主要区别之一是你可以为Pandas series 中的每个元素分配索引标签;另一个区别是Pandas series 可以同时存储不同类型的数据。
  • Pandas DataFrame:

    • ​​​​​​​​​​​​​​Pandas DataFrame 是具有带标签的行和列的二维数据结构,可以存储多种类型的数据,类似于电子表格。

 

  • 15
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值