26 kaggle titanic生存预测总结

1 导入数据并查看数据

1.1 数据集的拼接

数据导入后通过append拼接训练集和测试集,便于特征提取时同时处理训练集和测试集

full = train.append(test,sort=False,ignore_index=True)
  • 设置参数sort=False保证拼接后数据列为原始顺序,如果不设置则列按照字母排序。
  • 设置 ingore_index=True 表示重生成index,避免index重复
full2 = pd.concat([train,test],sort=False,ignore_index=True)

得到相同的结果。

1.2 查看数据集基本信息
full.describe()
image.png

获取数据集中的数值类别的统计信息,包括数量、平均值、标准差、最小值,升序25%的值,百分之50的值,百分之75的值和最大值。

full.info()
image.png

统计数据数量,数据类别,所占存储空间。通过该统计信息能够发现哪列由缺失值。便于下一步进行数据清洗。

2 数据清洗

数据清洗三种方法:

  • 如果是数值类型,用平均值取代
  • 如果是分类数据,用最常见的类别取代
  • 使用模型预测缺失值
# 用平均值取代年龄的缺失值
full['Age'] = full['Age'].fillna(full['Age'].mean())

列数据通过列名‘Age’直接取值,fillna方法用于缺失值的填充,.mean()方法取得平均值。

 # 字符串缺失值的处理,Embarked缺两条,Cabin缺1014条
full['Embarked'].value_counts() 

value_counts()方法统计类别频次,下一步将用出现最多的类别代替缺失值

full['Embarked'] = full['Embarked'].fillna('S')
# 缺失值比较多,Canbin缺失值填充为U,表示未知(Uknow)
full['Cabin'] = full['Cabin'].fillna('U')

如果缺失值太多,则用一个新的类别代替缺失值。

3 特征提取

数据类型分析:
(1)数值类型
(2)时间序列
(3)分类数据
a)有直接类别的
b)字符串类型

3.1 有直接类别且只有两类的分类数据
# 将性别值映射为数值,男(male)为1,女(female)为0
sex_mapDict = {'male':1,'female':0}
full['Sex']=full['Sex'].map(sex_mapDict)   # 通过map方法,接收字典参数进行映射
full.head()

有直接类别的数据类型,通过字典利用map方法直接映射

3.2 有直接类别且多余两类的数据
# 将 Embarked 映射为one-hot形式
embarkedDf = pd.DataFrame()
# 使用get_dummies进行one-hot编码,产生虚拟变量(dummy variables),列名前缀为Embarked
embarkedDf = pd.get_dummies(full['Embarked'], prefix='Embarked')
embarkedDf.head()
image.png

pd.get_dummies()方法传入单列字符串数据,生成多列one-hot数据类型

full = pd.concat([full,embarkedDf], axis=1)
full.drop('Embarked', axis=1,inplace=True)
full.head()

生成的多列one-hot数据,与原数据进行拼接,然后删除原始列。

3.3 根据行业知识对原始字符串进行处理,映射,然后转化为one-hot

3.3.1 获取字符串的某一部分

# 从姓名中获取头衔
# Braund,Mr.Pwen Harris 逗号前面时'名',逗号后面时'头衔.姓'
def getTitle(name):
    str1 = name.split(',')[1] # Mr. Owen Harris
    str2 = str1.split('.')[0]  # Mr
    # strip方法移除字符串头尾指定的字符
    str3 = str2.strip()
    return str3
titleDf = pd.DataFrame()
titleDf['Title'] = full['Name'].map(getTitle)
titleDf.iloc[30:40]

利用map和lambda函数获取一列数据的首字母

cabinDf = pd.DataFrame()
full['Cabin'] = full['Cabin'].map(lambda c:c[0])

3.3.2 定义映射关系

# 定义头衔映射关系?
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)

3.3.3 使用pd.get_dummies进行one-hot编码

titleDf = pd.get_dummies(titleDf['Title'])
full = pd.concat([full,titleDf], axis=1)
full.drop('Name',axis=1,inplace=True)

3.3.4 构造特征

# 家庭信息特征提取
familyDf = pd.DataFrame()
familyDf['FamilySize'] = full['Parch'] + full['SibSp'] + 1
# 人数=1 小家庭,2<=人数<=4 中等家庭,人数 > 5 大家庭
familyDf['Family_Single'] = familyDf['FamilySize'].map(lambda s:1 if s==1 else 0)
familyDf['Family_small'] = familyDf['FamilySize'].map(lambda s:1 if 2<=s<=4 else 0)
familyDf['Family_Large'] = familyDf['FamilySize'].map(lambda s:1 if s>=5 else 0)
familyDf.head()

4 特征选择

# 计算各个特征的相关系数
corrDf = full.corr()
corrDf

full.corr()计算各个特征的相关系数

# 查看各个特征与生存情况(Survived)的相关系数
corrDf['Survived'].sort_values(ascending=False)

通过sort_values进行排序

选择特征,使用pd.concat()方法进行合并

# 根据各个特征与生存情况的相关系数大小,选择几个特征作为模型的输入
# 头衔(titleDf),客仓等级(篇classDf),家庭大小(familyDf),船票价格(Fare),船舱号(cabinDf),登船港口(embaredDF),性别(Sex)
full_X = pd.concat([titleDf,
                   PlclassDf,
                   familyDf,
                   full['Fare'],#船票价格
                   cabinDf, # 船舱号
                   embarkedDf, # 登船港口
                   full['Sex'], # 性别  
                   ],axis=1)

full_X.head()

5 构建模型

5.1 从特征数据中选取训练集数据
  • 训练集特征
# 原始数据集有891行
sourceRow = 891
# 原始数据:特征
source_X = full_X.loc[0:sourceRow-1,:]
  • 训练集标签
# 原始数据:标签
source_y = full.loc[0:sourceRow-1,'Survived']
source_y
  • 预测集特征
# 预测数据集:特征
pred_X = full_X.loc[sourceRow:,:]
  • 进一步把训练集分为训练集和测试集
from sklearn.model_selection import train_test_split
train_X, test_X, train_y, test_y = train_test_split(source_X, source_y,train_size=0.8)
5.2 选择机器学习算法计算的到结果
# 第一步: 选择一个机器学习算法,用于模型的训练
from sklearn.linear_model import LogisticRegression
# 第二步:创建模型:逻辑回归
model = LogisticRegression()
# 第三步: 训练模型
model.fit(train_X, train_y)
# 第四步:分类问题,score得到的是模型的正确率
model.score(test_X, test_y)
# 第五步:在预测集上计算得到的结果
pred_Y = model.predict(pred_X)
# 第六步:结果导出
pred_Y = pred_Y.astype(int)
passenger_id = full.loc[sourceRow:,'PassengerId']
predDf = pd.DataFrame({'PassengerId':passenger_id,
                      'Survived':pred_Y})
predDf.to_csv('titanic_pred.csv', index=False)

你可能感兴趣的:(26 kaggle titanic生存预测总结)