数据集来源于kaggle经典竞赛数据集
一、目的
根据数据集中的信息,利用python机器学习对泰坦尼克乘客是否生还进行预测。
二、数据集
我的数据集有三个,test、train、genderclassmodel,都是csv格式
test和train数据集中的字段:
从左到右依次是,乘客编号、是否生还、仓位、姓名、性别、年龄、船上同辈亲属的人数、乘客有父母或孩子的人数、船票号、旅费、船舱号、上船的港口(C = Cherbourg, Q = Queenstown, S = Southampton)
genderclassmodel是测试集的实际生还结果:
三、训练思路
通过对数据集的观察以及经验,在数据集中如乘客姓名、船票号、编号这些属性和结果明显无关,是无用的信息,可以先去除掉。数据中有很多空值,缺失值也可以先进行处理。对于船舱号的样本太少,可以不考虑这个特征,先进性删除。
我们选用KNN和随机森林进行训练。
四、数据清洗和特征处理`
引入训练集和测试集、删除姓名、床票号、船舱号的列
import numpy as np
import pandas as pd
#1\数据引入
df_train=pd.read_csv('data/titanic/train.csv')
df_train=df_train.drop(['Name','Ticket','Cabin'],axis=1)
df_test=pd.read_csv('data/titanic/test.csv')
df_test=df_test.drop(['Name','Ticket','Cabin'],axis=1)
对缺失值进行处理,age和fare的缺失值比较多,我用平均值填充,而上船港口有两个缺失值,就直接删除了。
#2、缺失值处理
df_train['Age']=df_train['Age'].fillna(df_train['Age'].mean())
df_train['Fare']=df_train['Fare'].fillna(df_train['Fare'].mean())
df_train=df_train.dropna()
df_test['Age']=df_test['Age'].fillna(df_test['Age'].mean())
df_test['Fare']=df_test['Fare'].fillna(df_test['Fare'].mean())
特征值的归一化和标准化
由于性别和上船港口是字符串类型,我们需要将其转化为数值,用0、1、2代替。而其他的值我用归一化将其转化为0-1之间的数。
#3、特征处理
from sklearn.preprocessing import MinMaxScaler,StandardScaler
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
from sklearn.preprocessing import LabelEncoder,OneHotEncoder
scaler_list=[Age,Fare,Pclass,SibSp,Parch]
column_list=['Age','Fare','Pclass','SibSp','Parch']
for i in range(len(scaler_list)):
if not scaler_list[i]:
df_train[column_list[i]]=MinMaxScaler().fit_transform(df_train[column_list[i]].values.reshape(-1,1)).reshape(1,-1)[0]
df_test[column_list[i]]=MinMaxScaler().fit_transform(df_test[column_list[i]].values.reshape(-1,1)).reshape(1,-1)[0]
else:
df_train[column_list[i]]=StandardScaler().fit_transform