华为云主机泰坦尼克号数据预处理实验
【摘要】 本书为华为产学研合作项目,机器学习能源实战,适用于大三以上对机器学习和人工智能有一定基础的同学或者希望了解数据预处理的读者。本实验指导书共包含1个实验,介绍对泰坦尼克号数据集进行数据预处理包括:填补缺失值,数据归一化,one-hot编码,drop无用列,PCA降维。
简介
本书为华为产学研合作项目,机器学习能源实战,适用于大三以上对机器学习和人工智能有一定基础的同学或者希望了解数据预处理的读者。
内容描述
本实验指导书共包含1个实验,介绍对泰坦尼克号数据集进行数据预处理包括:填补缺失值,数据归一化,one-hot编码,drop无用列,PCA降维。
读者知识背景
本课程为机器学习高阶课程,为了更好地掌握本书内容,阅读本书的读者应首先具备以下基本条件:
- 具有基本的人工智能知识背景,同时了解python语言的相关基础知识。
实验环境说明
本实验采用华为云资源,华为云主机。
实验场景说明
数据预处理是数据分析、机器学习和数据挖掘过程中不可或缺的一环。它不仅能够解决数据质量问题,还能提升模型的性能和准确性。因此,在进行数据分析或构建机器学习模型之前,务必重视并认真执行数据预处理步骤。
- 目录
- 简介
- 内容描述
- 读者知识背景
- 实验环境说明
- 实验场景说明
- 1 泰坦尼克号数据预处
- 1.1 实验介绍
- 1.1.1 关于本实验
- 1.1.2 实验目的
- 1.1.3 实验环境
- 1.2 进入华为云主机
- 1.3 准备实验数据-泰坦尼克号数据集
- 1.3.1 实验数据说明
- 1.3.2 实验任务说明
- 1.4 实验任务
- 1.4.1 实验步骤
- 1.5 总结
1 泰坦尼克号数据预处理
1.1 实验介绍
1.1.1 关于本实验
本案例以泰坦尼克号数据集为基础,通过五步填补缺失值,数据归一化,one-hot编码,drop无用列,PCA降维。达到让大家全面了解数据预处理的基础方法。
1.1.2 实验目的
- 掌握填补缺失值,数据归一化,one-hot编码,drop无用列,PCA降维的方法。
1.1.3 实验环境
华为云主机
1.2 进入华为云主机
- huaweicloud.com输入华为云网址,使用华为云账号,登录华为云。进入开发者空间。
图1-1 登录华为云账
图1-2 进入华为云主机
- 进入华为云主机后,打开云存储空间和codeart
图1-3华为云主机界面
图1-4 华为云存储空间界面
- 从云空间中下载数据集,并拷贝codeart新建的项目中。在创建新的项目中,先点击左上方“文件列表”,点击新建找到工程,在图1-5中特别需要注意的是创建的过程中一定要勾选全局站点包,再点击创建。
图1-5 codeart界面创建项目
- 创建好以后,把在云存储空间下载的csv文件,拷贝当前工程的目录下面。这样环境和数据就已经准备好了。如图1-6所示:
Note(如果缺相关包的安装,请参照,华为云主机相关机器学习第三方包安装文档。)
图1-6 codearts界面
1.3 准备实验数据-泰坦尼克号数据集
1.3.1 实验数据说明
该数据集包含了1309条数据,如下图所示,包括12个列。其中Survived 是标签,其他的是特征列。具体每个特征代表如下所示:
(1)PassengerId = 乘客ID
(2)Pclass = 客舱等级(1/2/3等舱位)
(3)Name = 乘客姓名
(4)Sex = 性别
(5)Age = 年龄
(6)SibSp = 兄弟姐妹数/配偶数
(7)Parch = 父母数/子女数
(9)Ticket = 船票编号
(9)Fare = 船票价格
(10)Cabin = 客舱号
(11)Embarked = 登船港口
(12)Survived = 是否生存
图1-7泰坦尼克号数据集部分展示
1.3.2 实验任务说明
为了有更好的数据给模型,所以这里我们需要对数据集进行数据预处理。
1.4 实验任务
1.4.1 实验步骤
图1-8 泰坦尼克号数据预处理实验总流程
实验总流程如图1-7所示,导入库按照用到在调用的方式进行,所以这里跳过导入库从载入数据集开始。需要安装包pip install seaborn
- 载入数据集,代码如下导入数据集,把特征和标签分开,最后打印infomation看X_train里每一列的缺失值情况。缺失值如下图1-9所示。一共四列具有缺失值,Age、Cabin、Embarked、Fare。
#调包
import seaborn as sns
import numpy as np
import pandas as pd
#导入数据集
features= pd.read_csv('titanic_dataset.csv')
#把标签和特征分开
y_train1=features['Survived']
X_train=features.drop('Survived',axis=1)
X_train.info()
图1-9 X_train.info()输出展示
- 数据预处理:为了完成实验,实验预处理分成了4步,
- 填补缺失值,这里我们用了三种方式填补年龄列的缺失值,分别是年龄中位数,同时考虑年龄和性别的中位数,同时考虑年龄、性别和客舱等级的中位数。并且如图1-10所示绘制图片和原数据集中年龄的数据分布进行对比。代码如下所示:
import matplotlib.pyplot as plt
plt.rcParams['font.family'] = ['SimHei']
fig1=plt.figure()
ax=fig1.add_subplot(2,2,1)
plt.title('原数据集')
# 先看下数据集的 Age 分布状态
sns.distplot(X_train['Age'].dropna(), hist=True, kde=True,axlabel=None)
# 将数据集中的NaN数据使用中值填充。
Xtrain1=X_train.copy()
#np.nanmedian沿指定轴计算中位数,而忽略NaN。
Xtrain1['Age'].replace(np.nan, np.nanmedian(Xtrain1['Age']),inplace=True)
#sns.distplot(Xtrain1['Age'].dropna(), hist=True, kde=True)
#性别有关的中位数
age_sex_median=X_train.groupby('Sex').Age.median()
Xtrain2=X_train.set_index('Sex')
Xtrain2.Age.fillna(age_sex_median,inplace=True)
Xtrain2.reset_index(inplace=True)
Xage2=Xtrain2['Age']
#同时考虑性别和仓位
age_Pclass=X_train.groupby(['Pclass','Sex']).Age.median()
X_train.set_index(['Pclass','Sex'],inplace=True)
X_train.Age.fillna(age_Pclass,inplace=True)
X_train.reset_index(inplace=True)
ax=fig1.add_subplot(2,2,2)
plt.title('同时考虑性别和仓位')
sns.distplot(X_train['Age'], hist=True, kde=True)
ax=fig1.add_subplot(2,2,3)
plt.title('性别中位数')
sns.distplot(Xtrain1['Age'], hist=True, kde=True)
ax=fig1.add_subplot(2,2,4)
plt.title('中位数')
plt.xlabel('')
sns.distplot(Xtrain2['Age'], hist=True, kde=True)
plt.subplots_adjust(wspace=0,hspace=0.5)
plt.show()
图1-10不同填补缺失值策略年龄数据分布
可以看出同时考虑性别和客舱等级的中位数是最接近源数据的,这里使用的华为云主机没办法显示中文,故截图用英文替代了。
图1-11Embarked列数据分布图
填补Embarked的缺失值,根据图1-11百分之80以上的人登船口岸都是在S,所以这里我们用S对Embarked列的缺失值进行填补,Cabin的缺失值由于超过50%无法确定其分布,故直接删除。Fare船票价格列只有一个缺失值,船票价格,主要与客舱等级和登船口岸有关,故根据缺失值定位找到其'Pclass == 3 & Embarked == "S"的所有船票价格,在对取出来的船票列取中位数,填补Fare的缺失值。代码如下:
# Cabin 的缺失值太多,从 Dataframe 中移除后,也不会影响预测的
X_train.drop("Cabin", axis=1, inplace=True)
# 我们来看下乘客都在哪些站登船的
# S 表示:Southampton,英国南安普敦
# C 表示:Cherbourg-Octeville,法国瑟堡-奥克特维尔
# Q 表示:Queenstown,爱尔兰昆士敦
X_train.Embarked.value_counts()
# 登船情况
fig5=plt.figure()
fig5=sns.countplot(x='Embarked', data=X_train)
X_train['Embarked'].replace(np.nan, 'S', inplace=True)
# 数据集有一个缺失数据,我们把它找出来,然后附上中值
X_train[np.isnan(X_train["Fare"])]
# 查询从 英国南安普敦 上船,级别是3的船票价格
pclass3_fares = X_train.query('Pclass == 3 & Embarked == "S"')['Fare']
# 先将空值填充为0
pclass3_fares = pclass3_fares.replace(np.nan, 0)
# 然后取中值
median_fare = np.median(pclass3_fares)
# 最后更新中值到缺失值的那处
X_train.loc[X_train['PassengerId'] == 1044, 'Fare'] = median_fare
- 对无用列删除,“名字”和“ID”和“船票编号”三个列对是否生存无法提供有价值的数据故把这三个列删除掉
#数据集中name和ID重合了,删掉name
X_train.drop('Name',axis=1,inplace=True)
#也是重合了删掉船票编号
X_train.drop('Ticket',axis=1,inplace=True)
X_train.drop('PassengerId',axis=1,inplace=True)
前面人为认为Age列和性别和Pclass 相关,但是我们是用数据说话的,所以在我们把所有无关列删除以后,把变量数据改成数值数据。然后得到相关矩阵。如图1-12所示。Age列最相关的是Pclass、船票价格和兄弟姐妹数,船票价格从一定程度上与Pclass相关所以这里,同学想得到最好的数据,在填补缺失值的时候,需要同时考虑的不是Pclass和sex,而是Pclass和SibSp,具体代码如下:
X_train['Sex'].replace(['male', 'female'], [1,0], inplace=True)
X_train['Embarked'].replace(['S', 'C','Q'], [1,2,3], inplace=True)
corr = np.corrcoef(X_train,rowvar=False)
图1-12所示相关矩阵数据展示
- 离散变量one-hot编码,这边我是用replace的函数进行替换,其实可以用函数LabelEncoder,更加合适。这里先把Sex中'male', 'female替换成1和0。然后对离散变量大于2的列进行one-hot编码. get_dummies函数会把离散变量转换成ture和false值,我们需要把bool值的列在转换成数字。
#one-hot编码
for i in ['Pclass','Embarked','SibSp']:
X_train = pd.get_dummies(X_train, columns=[i])
#找到bool值的列
bool_columns = [col for col in X_train.select_dtypes(include=[bool]).columns]
print(bool_columns)
#bool值的列在转换成数字
for i in bool_columns:
X_train[i] = X_train[i].astype(int)
- 切割数据集
from sklearn.model_selection import train_test_split
#把原数据集分割成训练集train和测试集test
train_df, test_df, y_train, y_test = train_test_split(X_train, y_train1, test_size=0.2,random_state=50)
- 归一化分别对训练集和测试集进行操作,因为根据机器学习的规定我们是不知道X_test的数据的,所以只能根据训练集的数据,对测试集的数据进行转换。
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train = scaler.fit_transform(train_df)
X_test = scaler.transform(test_df)
- 降维,这里需要注意的是和归一化一样分别对训练集和测试集进行操作
from sklearn.decomposition import PCA
pca = PCA()
X_train = pca.fit_transform(X_train)
X_test = pca.transform(X_test)
1.5 总结
本实验主要是验证实验,对泰坦尼克号的数据集进行数据预处理。文中留下的如何让填补缺失值更合理。同学们可以回去自己试试,看看填补出来的年龄的数据分布会不会和原数据集更像。也可以使用一些算法。看看根据最优填补方案,准确率是否可以提升。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)