Kaggle入门--泰坦尼克号存活率预测(完整流程)

1. 通过热力图的方式来查看缺失的数据

sns.heatmap(train.isnull(), yticklabels=False, cbar=False, cmap='viridis')

tip:对于有些数据集中可能不是显式的存在缺失值,而是把缺失值替换成了特殊的字符,这种情况的话可以先将特殊字符替换为np.nan,再用isnull()函数。

2. 查看离散变量和连续变量的属性

# 统计离散变量的属性:离散变量为字符串,属性为'object'
train.describe(include=['O'])
# 统计连续变量的属性
train.describe()

3. countplot查看存活的人与未存活人的比例

# 设置白色网格为主题
# 使用countplot 对'存活'的一个标签进行计数绘图,使用x表示横轴上的图,y表示纵轴 上的图
sns.set_style('whitegrid')
sns.countplot(x='Survived',data=train)

4. countplot和group查看存活的人与性别的关系

# 设置白色网格为主题
# 使用countplot 对'存活'和'性别'两个标签进行计数绘图
sns.set_style('whitegrid')
sns.countplot(x='Survived',hue='Sex',data=train)

train[['Sex', 'Survived']].groupby(['Sex'], as_index=False).mean().sort_values(by='Survived', ascending=False)

5. countplot和group查看存活的人与船舱级别的关系

sns.set_style('whitegrid')
sns.countplot(x='Survived', hue='Pclass', data=train)

train[['Pclass', 'Survived']].groupby(['Pclass'], as_index=False).mean().sort_values(by='Survived', ascending=False)

6. distplot查看年龄的分布

# 根据开始的空值判断中,可以得出age中有空值,所以需要进行drop

# 通过displot绘制直方图的观测值的单变量分布:纵坐标表示的是比率
# kde为高斯核函数,bins为直方图的宽
sns.distplot(train['Age'].dropna(), kde=False, bins=30)

7. countplot和group查看乘船人的家族关系以及和存活之间的关系

sns.countplot(x='SibSp', data=train)

train[['SibSp', 'Survived']].groupby(['SibSp'], as_index=False).mean().sort_values(by='Survived', ascending=False)

8. hist查看乘客的票价分布

# 当然这里也可以用seaborn的displot进行绘制,但是displot的纵坐标是比率,hist的纵坐标是实际个数count;
# figsize调整画布大小
train['Fare'].hist(color='green', bins=30, figsize=(8,4))

对比,hist和distplot直方图分布的区别
使用hist的直方图分布,纵坐标是count值;
使用displot的直方图分布,纵坐标是比率radio;

9. 箱型图查看年龄和船舱等级的分布

箱型图不仅可以来找出异常值,也可以用来说明样本分布的情况:

  1. 如果箱子比较扁, ,说明分布比较靠拢;
    如果箱子比较长,说明分布比较离散;
  2. 就是判断出箱子图中所处的范围在哪块;
plt.figure(figsize=(12,7))
sns.boxplot(x='Pclass', y='Age', data=train)

在这里插入图片描述
通过箱型图大致可以判断出:三等舱的乘客年龄分布都比较小,一等舱的乘客年龄分布都比较大。

10. 填补缺失值

填补缺失值有很多种方法,这里是根据之前的箱型图:三等舱的乘客年龄分布比较小,一等舱的乘客年龄分布比较大。于是来根据船舱的类别填入该类别年龄的平均值。

# 首先得出各个船舱年龄的平均值
[train[train['Pclass'] == i]['Age'].mean() for i in range(1,4)]

def infer_age(cols):
    Age = cols[0]
    Pclass = cols[1]
    
    if pd.isnull(Age):
        if Pclass == 1:
            return 37
        elif Pclass == 2:
            return 29
        else:
            return 24
    else:
        return Age
 # 使用apply方法应用函数
 train['Age'] = train[['Age', 'Pclass']].apply(infer_age, axis=0)

11.去除无关的数据列

# 票号和船舱号是无关的特征,将它们去除掉
# axis的0轴匹配的是index, 涉及上下运算;1轴匹配的是columns, 涉及左右运算
train.drop(['Ticket', 'Cabin'], axis=1, inplace=True)

12. 考虑人名的特征,只保留前面的姓氏

# 通过正则表达式留下.之前的形式
train['Title'] = train.Name.str.extract('([A-Za-z]+)\.', expand=False)

在这里插入图片描述

13. 检查下名称是否对应着性别

pd.crosstab(train['Title'], train['Sex'])

在这里插入图片描述

14.将不同类的title,根据个数不同进行聚合

for dataname in [train, test]:
    dataname['Title'] = dataname['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', \
                                            'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    dataname['Title'] = dataname['Title'].replace(['Mlle', 'Ms'], 'Miss')
    dataname['Title'] = dataname['Title'].replace('Mme', 'Mrs')

train[['Title', 'Survived']].groupby(['Title'], as_index=False).mean()

15. 通过map将名称的变量离散值连续化

title_mapping = {
    
    'Mr': 1, 'Miss': 2, 'Mrs': 3, 'Master': 4, 'Rare': 5}
train['Title'] = train['Title'].map(title_mapping)

16. 对缺失数据进行删除

# inplace表示在原地操作,不返回对象
train.dropna(inplace=True)

17. 将性别和上船地点也转变为离散变量

# drop_first = True的含义是使用k-1个哑变量来表示k个特征
sex = pd.get_dummies(train['Sex'], drop_first=True)
embark = pd.get_dummies(train['Embarked'], drop_first=True)
# 删除原来的离散变量,并将新的哑变量的dataframe与原来的连接
train.drop(['Sex','Embarked','Name', 'PassengerId'], axis=1, inplace=True)
train = pd.concat([train, sex, embark], axis=1)

18. 拆分数据集

拆分数据集进行训练主要是为了防止过拟合的情况。

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(train.drop('Survived', axis=1), train['Survived'], test_size=0.2, random_state=2019)

19. 模型训练

猜你喜欢

转载自blog.csdn.net/qq_29027865/article/details/103430472