美文网首页
实战1 kaggle泰坦尼克号生存率

实战1 kaggle泰坦尼克号生存率

作者: Canes | 来源:发表于2020-04-21 18:28 被阅读0次

下载数据

地址:[kaggle](https://www.kaggle.com/c/titanic)

处理数据

    import pandas as pd
    import numpy as np
    df_train = pd.read_csv('./data/train.csv')
    df_train_test = pd.read_csv('./data/test.csv')
    # DataFrame 行添加 append
    df_train = df_train.append(df_train_test,ignore_index=True)
    df_train.info()

查看数据

df_train.shape
df_train.describe()
df_train.info()
image.png
  • 可以看出 Age, Cabin, Embarked, Fare 数据缺失,由于Survived 为目标值只存在于train集,及只有891行数据
  • 查询数据是否为空
      df_train.isnull()
      df_train.apply(lambda x:x.isnull(),axis=0)  #判断
      df_train.isnull().any()  #判断列是否有空值
      df_train['Age'].isnull().count()  #统计某列数据空值个数
    
  • 数据预处理
    1. 数值型用平均值替换
    2. 分类用最常见类别取代
    df_train['Age'].fillna(df_train['Age'].mean(),inplace=True)
    #船票价格(Fare)
    df_train['Fare'] = df_train['Fare'].fillna( df_train['Fare'].mean() )
    df_train['Cabin'].value_counts()  #统计Cabin类别
    df_train['Embarked'].value_counts()
    
image.png

有结果可以看出 Embarked类别有三类,最多为S类

  df_train['Embarked'].fillna('S',inplace=True)  #填充缺失值
  df_train['Cabin'].fillna('U',inplace=True)

特征提取

三种数据类型:
1.数值型
2.时间序列(无)
3.分类数据

df_train['Sex'].head()
# 将性别分类数据 转换为数值型 男1,女0
sex_maple={'male':1,'female':0}
# df_train['Sex'] = df_train['Sex'].map(sex_maple)
result = df_train['Sex'].map(sex_maple)
df_train.Sex = result.values
df_train['Sex']

# 直接类别登船港口(Embarked)进行one-hot编码,性别也可以用此方法
#存放提取后的特征  prefix 指定提取后编码的 前缀名称
embarkedDf = pd.DataFrame()
embarkedDf = pd.get_dummies(df_train['Embarked'], prefix='Embarked')
embarkedDf.head()

# 添加one-hot编码 到 原始数据集,并删掉原始列(即替换)
df_train = pd.concat([df_train,embarkedDf],axis=1)
df_train.drop(['Embarked'],axis=1,inplace=True)
df_train.head(3)

同理:

# 客舱等级 Pclass
pclassDf = pd.DataFrame()
pclassDf = pd.get_dummies(df_train['Pclass'], prefix='Pclass')
# pclassDf.head()
df_train = pd.concat([df_train,pclassDf],axis=1)
df_train.drop(['Pclass'],axis=1,inplace=True)
df_train.head(3)

# 乘客姓名 中间具有一定信息
def getTitle(name):  #自定义函数
    str1 = name.split(',')[1]
    str2 = str1.split('.')[0] #Mr
    str3 = str2.strip() 
    return str3
# 提取姓名中信息
titleDf = pd.DataFrame()
titleDf['Title'] = df_train['Name'].map(getTitle)
titleDf.head()
titleDf.groupby('Title').count()  #统计姓名中信息数量

定义以下几种头衔类别:

  • Officer政府官员
  • Royalty王室(皇室)
  • Mr已婚男士
  • Mrs已婚妇女
  • Miss年轻未婚女子
  • Master有技能的人/教师
#姓名中头衔字符串与定义头衔类别的映射关系
title_mapDict = {
                    "Capt":       "Officer",
                    "Col":        "Officer",
                    "Major":      "Officer",
                    "Jonkheer":   "Royalty",
                    "Don":        "Royalty",
                    "Sir" :       "Royalty",
                    "Dr":         "Officer",
                    "Rev":        "Officer",
                    "the Countess":"Royalty",
                    "Dona":       "Royalty",
                    "Mme":        "Mrs",
                    "Mlle":       "Miss",
                    "Ms":         "Mrs",
                    "Mr" :        "Mr",
                    "Mrs" :       "Mrs",
                    "Miss" :      "Miss",
                    "Master" :    "Master",
                    "Lady" :      "Royalty"
                    }

#map函数:对Series每个数据应用自定义的函数计算
titleDf['Title'] = titleDf['Title'].map(title_mapDict)

#使用get_dummies进行one-hot编码
titleDf = pd.get_dummies(titleDf['Title'])
titleDf.head()

# 添加one-hot编码 到 原始数据集,并删掉原始列(即替换)
df_train = pd.concat([df_train,titleDf],axis=1)
df_train.drop('Name',axis=1,inplace=True)
df_train.head()

# 客舱号(Cabin)设定同一字母客舱号在一起
cabinDf = pd.DataFrame()
df_train['Cabin'] = df_train['Cabin'].map(lambda x:x[0])
cabinDf = pd.get_dummies(df_train['Cabin'],prefix='Cabin')
cabinDf.head(3)

# 对客舱号(Cabin)进行one-hot 编码
df_train = pd.concat([df_train,cabinDf],axis=1)
df_train.drop('Cabin',axis=1,inplace=True)
df_train.head(3)

家庭数量影响

家庭人数=同代直系亲属数(Parch)+不同代直系亲属数(SibSp)+乘客自己
(因为乘客自己也是家庭成员的一个,所以这里加1)
家庭类别:
小家庭Family_Single:家庭人数=1
中等家庭Family_Small: 2<=家庭人数<=4
大家庭Family_Large: 家庭人数>=5

familyDf = pd.DataFrame()
familyDf['FamilySize'] = df_train['Parch']+df_train['SibSp']+1
familyDf['Family_Single'] = familyDf['FamilySize'].map(lambda x: 1 if x == 1 else 0)
familyDf['Family_Small'] = familyDf['FamilySize'].map( lambda x : 1 if 2 <= x <= 4 else 0)
familyDf['Family_Large'] = familyDf['FamilySize'].map(lambda x: 1 if x>=5 else 0)
familyDf.head(3)

# 添加familyDf 到 原始数据集,并删掉原始列(即替换)
df_train = pd.concat([df_train,familyDf],axis=1)
df_train.head(3)

特征选择

计算各个特征的相关系数

#相关性矩阵
corrDf = df_train.corr()
corrDf
'''
查看各个特征与生成情况(Survived)的相关系数,
ascending=False表示按降序排列
'''
corrDf['Survived'].sort_values(ascending =False)
image.png

根据各个特征与生成情况(Survived)的相关系数大小,我们选择了这几个特征作为模型的输入 头衔(前面所在的数据集titleDf)、客舱等级(pclassDf)、家庭大小(familyDf)、船票价格(Fare)、船舱号(cabinDf)、登船港口(embarkedDf)、性别(Sex)

特征选择

full_x = pd.concat( [titleDf,#头衔
                     pclassDf,#客舱等级
                     familyDf,#家庭大小
                     df_train['Fare'],#船票价格
                     cabinDf,#船舱号
                     embarkedDf,#登船港口
                     df_train['Sex']#性别
                    ] , axis=1 )
full_x.head()

构建模型

  • 将训练集拆分为 训练集+验证集
sourceRow = 891
#原始数据集:特征
source_x = full_x.loc[0:sourceRow-1,:]
# #原始数据集:标签(结果)
source_y = df_train.loc[0:sourceRow-1,'Survived']
#预测数据集:特征
pred_x = full_x.loc[sourceRow:,:]

#查看train集数据
print('train数据集个数:', source_x.shape[0])
print('验证数据集个数:', source_y.shape[0])
print('test数据集个数:', pred_x.shape[0])
  • 数据拆分
from sklearn.model_selection import train_test_split

#建立模型需要的训练集,及验证集
train_x,test_x,train_y,test_y = train_test_split(source_x,source_y,test_size=0.2)
print('原始数据集特征:',train_x.shape,
     '验证数据集特征:',test_x.shape
     )
print('原始数据集标签:',train_y.shape,
     '验证数据集标签:',test_y.shape
     )
  • 选择机器学习算法
# 1.导入算法
from sklearn.linear_model import LogisticRegression
# 2.创建模型,逻辑回归
model = LogisticRegression(solver='liblinear')
#随机森林Random Forests Model
#from sklearn.ensemble import RandomForestClassifier
#model = RandomForestClassifier(n_estimators=100)
#支持向量机Support Vector Machines
#from sklearn.svm import SVC, LinearSVC
#model = SVC()
#Gradient Boosting Classifier
#from sklearn.ensemble import GradientBoostingClassifier
#model = GradientBoostingClassifier()
#K-nearest neighbors
#from sklearn.neighbors import KNeighborsClassifier
#model = KNeighborsClassifier(n_neighbors = 3)
# Gaussian Naive Bayes
#from sklearn.naive_bayes import GaussianNB
#model = GaussianNB()
  • 训练模型
model.fit(train_x,train_y)
  • 模型评估
model.score(test_x,test_y)
  • 使用预测集数据
pred_y = model.predict(pred_x)
#生成的预测值是浮点数(0.0,1,0)
#如果需要整型(0,1)
#则要对数据类型进行转换
pred_y = pred_y.astype(int)
#乘客id
passenger_id = df_train.loc[sourceRow:,'PassengerId']
predDf = pd.DataFrame(
    {'PassengerId':passenger_id,
    'Survived':pred_y}
)
predDf.shape
predDf.head()
  • 保存结果
predDf.to_csv('./data/titanic_pred.csv',index=False)

文章参考于 https://www.jianshu.com/p/06c2ee7e5c68

相关文章

网友评论

      本文标题:实战1 kaggle泰坦尼克号生存率

      本文链接:https://www.haomeiwen.com/subject/udrwbhtx.html