当前位置: 代码迷 >> 综合 >> 数据挖掘案例: 泰坦尼克号
  详细解决方案

数据挖掘案例: 泰坦尼克号

热度:55   发布时间:2023-12-20 21:51:01.0

目录:

    • *. 数据挖掘流程
    • 一. 数据读取与统计分析
    • 二. 特征分析 & 缺失值填充
      • 2.1 性别与获救
      • 2.2 船舱等级与获救
      • 2.3 年龄与获救
      • 2.4 姓名(称谓) 与获救
      • 2.5 填充缺失值
      • 2.6 登船地点与获救
      • 2.7 兄弟姐妹的数量
      • 2.8 父母和孩子的数量
      • 2.9 船票的价格
    • 三. 特征相关性
      • 3.1 相关性热度图
      • 3.2 热度图下三角
    • 四. 构建特征
      • 4.1 年龄特征
      • 4.2 家庭总人口
      • 4.3 船票价格
      • 4.4 类型转换与特征清洗
    • 五. 机器学习建模
      • 5.1 切分训练集与测试集
      • 5.2 逻辑回归 LogisticRegression
      • 5.3 支持向量机 SVM
      • 5.4 决策树 DecisionTree
      • 5.5 随机森林 RandomForest
      • 5.6 K近邻 KNeighbors
      • 5.7 高斯贝叶斯 Naive Bayes
      • 5.8 梯度提升树 GradientBoosting
    • 六. 交叉验证
    • 七. 混淆矩阵
    • 八. 超参数调整 GridSearchCV
    • 九. 集成模块
      • 9.1 投票分类器
      • 9.2 引导聚类算法 Bagging
      • 9.3 自适应增强 AdaBoost
      • 9.4 梯度提升 GradientBoosting
    • 十. 特征重要性

*. 数据挖掘流程

(一)数据读取:

  • 读取数据,并进行展示
  • 统计数据各项指标
  • 明确数据规模与要完成任务

(二)特征理解分析

  • 单特征分析,逐个变量分析其对结果的影响
  • 多变量统计分析,综合考虑多种情况影响
  • 统计绘图得出结论

(三)数据清洗与预处理

  • 对缺失值进行填充
  • 特征标准化/归一化
  • 筛选有价值的特征
  • 分析特征之间的相关性

(四)建立模型

  • 特征数据与标签准备
  • 数据集切分
  • 多种建模算法对比
  • 集成策略等方案改进

一. 数据读取与统计分析

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#plt.style.use('fivethirtyeight')
sns.set_style('darkgrid')
%matplotlib inline
import warnings
warnings.filterwarnings('ignore')data = pd.read_csv(r'F:\51学习\study\数据挖掘案例\泰坦尼克号\train.csv')
print(data.shape)
data.head()

在这里插入图片描述

# data.info()
# data.dtypes
# data.describe()
# import pandas_profiling
# pandas_profiling.ProfileReport(data)
data.isnull().sum()

在这里插入图片描述

  • 统计获救情况
plt.figure(figsize = (14, 6))
plt.subplot(1, 2, 1)
data['Survived'].value_counts().plot.pie(explode = [0, 0.08], autopct = '%.2f%%', shadow = True)
plt.title('Survived')
plt.ylabel('')
plt.subplot(1, 2, 2)
sns.countplot('Survived', data = data)
plt.title('Survived')

在这里插入图片描述

二. 特征分析 & 缺失值填充

2.1 性别与获救

data.groupby(['Sex','Survived'])['Survived'].count()

在这里插入图片描述

fig, ax = plt.subplots(1, 2, figsize = (14, 6))
data[['Sex', 'Survived']].groupby(['Sex']).mean().plot.bar(ax = ax[0])
ax[0].set_title('Survived vs Sex')
sns.countplot('Sex', hue = 'Survived', data = data, ax = ax[1])
ax[1].set_title('Sex: Survived vs Dead')

在这里插入图片描述

2.2 船舱等级与获救

pd.crosstab(data.Pclass, data.Survived, margins = True).style.background_gradient(cmap = 'autumn')

在这里插入图片描述

fig, ax = plt.subplots(1, 2, figsize = (14, 6))
data['Pclass'].value_counts().plot.bar(ax = ax[0])
ax[0].set(title = 'Number Of Passengers By Pclass', ylabel = 'Count')sns.countplot('Pclass', hue = 'Survived', data = data, ax = ax[1])
ax[1].set_title('Pclass: Survived vs Dead')

在这里插入图片描述

  • 船舱等级和性别对结果的影响
pd.crosstab([data.Pclass, data.Sex], data.Survived, margins = True).style.background_gradient(cmap = 'autumn')pd.pivot_table(data, index = 'Pclass', columns = 'Sex', values = 'Survived')

在这里插入图片描述
在这里插入图片描述

sns.factorplot('Pclass', 'Survived', hue = 'Sex', data = data)#sns.pointplot('Pclass', 'Survived', hue = 'Sex', data = data)

在这里插入图片描述

2.3 年龄与获救

print('Oldest Passenger was of:',data['Age'].max(),'Years')
print('Youngest Passenger was of:',data['Age'].min(),'Years')
print('Average Age on the ship:',data['Age'].mean(),'Years')plt.figure(figsize = (14, 6))plt.subplot(1, 2, 1)
sns.violinplot('Pclass', 'Age', hue = 'Survived', data = data, split = True)
plt.title('Pclass and Age vs Survived')
plt.yticks(range(0, 110, 10));plt.subplot(1, 2, 2)
sns.violinplot('Sex', 'Age', hue = 'Survived', data = data, split = True)
plt.title('Sex and Age vs Survived')
plt.yticks(range(0, 110, 10));

Oldest Passenger was of: 80.0 Years
Youngest Passenger was of: 0.42 Years
Average Age on the ship: 29.69911764705882 Years
在这里插入图片描述

2.4 姓名(称谓) 与获救

data['Initial'] = 0
data['Initial'] = data.Name.str.extract('([A-Za-z]+)\.')
pd.crosstab(data.Initial, data.Sex).T.style.background_gradient(cmap = 'autumn')

在这里插入图片描述

data['Initial'].replace(['Mlle','Mme','Ms','Dr','Major','Lady','Countess','Jonkheer','Col','Rev','Capt','Sir','Don'],['Miss','Miss','Miss','Mr','Mr','Mrs','Mrs','Other','Other','Other','Mr','Mr','Mr'], inplace = True)
pd.crosstab(data.Initial, data.Sex).style.background_gradient(cmap = 'summer')data.groupby('Initial')['Age'].mean()

在这里插入图片描述
在这里插入图片描述

2.5 填充缺失值

# 使用每组的均值来进行填充
data.loc[(data.Age.isnull()) & (data.Initial == 'Mr'), 'Age'] = 33
data.loc[(data.Age.isnull()) & (data.Initial == 'Mrs'),'Age']=36
data.loc[(data.Age.isnull()) & (data.Initial == 'Master'),'Age']=5
data.loc[(data.Age.isnull()) & (data.Initial == 'Miss'),'Age']=22
data.loc[(data.Age