Kaggle竞赛:Titianic——XGBoost(8.5)

目录

参考资料

知识点——%matplotlib inline

1、导入包

2、读数据+初步查看

3、数据预处理

知识点——数据分箱

4、画图——相关系数

5、XGBoost建模

6、预测

7、导出

XGBoost代码全文


参考资料

知识点——%matplotlib inline

  • 普通的画图我们导入import matplotlib.pyplot as plt,但如果想要把图画出来,必须要用plt.show()把她显示出来

  • %matplotlib inline就是内嵌画图,不用加plt.show()也可以显示图形

  • 注意:只用在jupyter notebook上,一般编译器不加

1、导入包

import pandas as pd
import numpy as np
import re
import sklearn
# 机器学习和数据处理的库,内含多重机器学习模型
import xgboost as xgb
import seaborn as sns
# 封装了很多画图模板
import matplotlib.pyplot as plt
# %matplotlib inline
​
import plotly.offline as py
# 离线绘图,可以生产html网页格式图像文件并自动打开
py.init_notebook_mode(connected=True)
# 内核运行时显示图片;具体用处尚不清楚
import plotly.graph_objs as go
# 导入图形对象
import plotly.tools as tls
# 图形工具
​
import warnings
warnings.filterwarnings('ignore')
# 忽略报错警告(可以正常运行即可)

2、读数据+初步查看

# Load in the train and test datasets
train = pd.read_csv('E:/【桌面】/titanic/train.csv')
test = pd.read_csv('E:/【桌面】/titanic/test.csv')
​
# Store our passenger ID for easy access
PassengerId = test['PassengerId']
​
# print(train.head(3))

3、数据预处理

(1)字符串列转化为有序量化变量

  • 目的:便于计算放入模型,提取出字符串中的信息

train['Ticket_type'] = train['Ticket'].apply(lambda x: x[0:3])
# 取该列每个元素的前三位;x表示该列的每个元素,[0:3]表示前三位
# print(train['Ticket_type'])
train['Ticket_type'] = train['Ticket_type'].astype('category')
# 变成分类变量
# print(train['Ticket_type'])
train['Ticket_type'] = train['Ticket_type'].cat.codes
# 每一类有具体的字符转化为1、2、3、4,这样得到level
# print(train['Ticket_type'])
​
test['Ticket_type'] = test['Ticket'].apply(lambda x: x[0:3])
test['Ticket_type'] = test['Ticket_type'].astype('category')
test['Ticket_type'] = test['Ticket_type'].cat.codes
# 测试集同理
​
# print(train.head(3))

(2)上下合并数据

  • 目的:便于一起操作和修改

full_data = [train, test]
# 上下合并

(3)添加:名字长度和字数统计列

  • 目的:获取新的信息;名字本身无法直接获得信息,需要旁敲侧击

train['Name_length'] = train['Name'].apply(len)
# 增添新的一列,为对应的name列的名字长度
test['Name_length'] = test['Name'].apply(len)
train['Words_Count'] = train['Name'].apply(lambda x: len(x.split()))
# 增添新的一列,对应名字的单词数量——分词;
test['Words_Count'] = test['Name'].apply(lambda x: len(x.split()))

(4)添加:有船舱列

  • 目的:根据船舱号,统计多少人有船舱多少人无

train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
# 有船舱号的为1,否则为0——具体方法,对这一列的数据每个元素判断是否为float元素,是则为空,否则为有舱号
test['Has_Cabin'] = test["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
​

(5)添加:家庭成员数量

  • 目的:表亲+近亲+自己,统计孤身一人和非孤身一人的信息

for dataset in full_data:
    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
# 家庭规模:表亲+近亲+自己

(6)添加:是否为孤身一人

  • 目的:根据家庭规模获得的数据

for dataset in full_data:
    dataset['IsAlone'] = 0
    # 先赋值为0
    dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1
    # 行为FamilySize为1的行;列为IsAlone列;
    # 如果家里除了自己还有别人,则为0;否则被改为1,说明是单身

(7)缺失值填充——出发港口

  • 由于缺失值较少,则填补到较多值当中

# 删除出发港口的缺失值
for dataset in full_data:
    dataset['Embarked'] = dataset['Embarked'].fillna('S')
    # 用S填补该列的缺失值,因为S本身占据大多数;且缺失值占比较少

(8)票价缺失值填充&数据分箱

  • 中位数填充

  • 分箱子

# 删除票价列的缺失值;票价列分箱
for dataset in full_data:
    dataset['Fare'] = dataset['Fare'].fillna(train['Fare'].median())
    # 用train的fare列的中位数填充所有数据集的fare
train['CategoricalFare'] = pd.qcut(train['Fare'], 4)
# 数据分箱,分成4个箱子

知识点——数据分箱

  • 目的

    连续变量离散化:1~100分成4箱

  • 为什么要分箱?

  1. 离散变量便于特征的增加和减少,便于模型快速迭代

  2. 稀疏向量内积乘法更快,计算结果便于存储,容易扩展

  3. 离散化后的特征对异常数据有很强的鲁棒性,例如,连续异常值5000可能对模型影响很大,但如果分箱后,模型影响很小

  4. 为模型引入非线性,提升模型表达能力,加大拟合

  5. 模型更加稳定,不会因为各别数据增加而影响模型精度

  6. 简化模型,防止模型过拟合

(9)年龄列缺失值填充&分箱

  • 连续变量的随机生成加限制条件,让它在均值+-标准差之间

for dataset in full_data:
    age_avg = dataset['Age'].mean()
    age_std = dataset['Age'].std()
    # 标准差
    age_null_count = dataset['Age'].isnull().sum()
    # 统计为空的数量
    age_null_random_list = np.random.randint(age_avg - age_std, age_avg + age_std, size=age_null_count)
    # 在标准差和均值的范围内,生成符合缺失值数量的数据
    # np.random.randint()生成一个随机整型数,范围从低(包括)到高(不包括),即[low, high)
    dataset['Age'][np.isnan(dataset['Age'])] = age_null_random_list
    # np.isnan() 判断每一行是否为缺失值;如果是则Yes,否则NO;对于Yes的列,填补上数据
    dataset['Age'] = dataset['Age'].astype(int)
    # 转化为整型;
train['CategoricalAge'] = pd.cut(train['Age'], 5)
# 分成5箱

(10)提取姓名+替换

# Define function to extract titles from passenger names
# 从乘客姓名中提取
def get_title(name):
    title_search = re.search(' ([A-Za-z]+)\.', name)
    # 正则表达式,匹配“.”之前的性别title——Mr或者Mrs或其它等等等
    # If the title exists, extract and return it.
    if title_search:
        return title_search.group(1)
    return ""
​
​
# Create a new feature Title, containing the titles of passenger names
for dataset in full_data:
    dataset['Title'] = dataset['Name'].apply(get_title)
# print(dataset['Title'])
​
# Group all non-common titles into one single grouping "Rare"
for dataset in full_data:
    dataset['Title'] = dataset['Title'].replace(
        ['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    # replace把非常见的title换为统一的——“Rare”
    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    # 左边换成右边
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')

(11)字符数据映射为离散数据

for dataset in full_data:
    # Mapping Sex
    dataset['Sex'] = dataset['Sex'].map({'female': 0, 'male': 1}).astype(int)
    # 把字符串映射为对应的值:female变成0,male变成1
    # print(dataset['Sex'])
​
    # Mapping titles
    title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}
    dataset['Title'] = dataset['Title'].map(title_mapping)
    dataset['Title'] = dataset['Title'].fillna(0)
​
    # Mapping Embarked
    dataset['Embarked'] = dataset['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)
​
    # Mapping Fare
    dataset.loc[dataset['Fare'] <= 7.91, 'Fare'] = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare'] = 2
    dataset.loc[dataset['Fare'] > 31, 'Fare'] = 3
    dataset['Fare'] = dataset['Fare'].astype(int)
​
    # Mapping Age
    dataset.loc[dataset['Age'] <= 16, 'Age'] = 0
    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1
    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2
    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3
    dataset.loc[dataset['Age'] > 64, 'Age'] = 4;

(12)特征选择

# 特征选择
drop_elements = ['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp']
train = train.drop(drop_elements, axis = 1)
# 按列删掉不需要的列名
train = train.drop(['CategoricalAge', 'CategoricalFare'], axis = 1)
test  = test.drop(drop_elements, axis = 1)
​
# print(train.head(3))

4、画图——相关系数

  • 从结果上来看,变量之间的相关性基本都很低。这对于模型学习是有利的,因为数据之间没有冗余,每个数据都携带着独特的信息和数据

colormap = plt.cm.RdBu
# 设置颜色
plt.figure(figsize=(14, 12))
# 设置图像的大小尺寸
plt.title('Pearson Correlation of Features', y=1.05, size=15)
# 设置图像的名字 y为高度
sns.heatmap(train.astype(float).corr(), linewidths=0.1, vmax=1.0,
            square=True, cmap=colormap, linecolor='white', annot=True)
# linewidth、linecolor分割线的粗细和颜色
# square=True 每个方块都是正方形
# cmap颜色映射,这里让它用事先设置的
# annot=True 设置字体浮现在上面
# plt.show()

5、XGBoost建模

y_train = train['Survived'].ravel()
# .ravel()把一列数据变成列表里的元素集合
train = train.drop(['Survived'], axis=1)
x_train = train.values
# .values 以数组的形式返回dataframe的所有值
x_test = test.values
​
​
gbm = xgb.XGBClassifier(
    # learning_rate = 0.02,
 n_estimators= 2000,
    # boost几轮
 max_depth= 4,
    # 树的最大深度,注意,如果过高会导致过拟合
 min_child_weight= 2,
    # 作为一个儿子的最小权重
 #gamma=1,
 gamma=0.9,
    # 在树的叶节点上进行进一步分区所需的最小损失减少。越大,算法就越保守。
 subsample=0.8,
 colsample_bytree=0.8,
 objective= 'binary:logistic',
 nthread= -1,
 scale_pos_weight=1).fit(x_train, y_train)

6、预测

# 预测
xgb_predictions = gbm.predict(x_test)

7、导出

# 导出
StackingSubmission = pd.DataFrame({ 'PassengerId': PassengerId,
                            'Survived': xgb_predictions })
​
StackingSubmission.to_csv("submission_XGB.csv", index=False)

XGBoost代码全文

import pandas as pd
import numpy as np
import re
import sklearn
# 机器学习和数据处理的库
import xgboost as xgb
import seaborn as sns
# 封装了很多画图模板
import matplotlib.pyplot as plt
# %matplotlib inline
​
import plotly.offline as py
# 离线绘图,可以生产html网页格式图像文件并自动打开
py.init_notebook_mode(connected=True)
# 内核运行时显示图片;具体用处尚不清楚
import plotly.graph_objs as go
# 导入图形对象
import plotly.tools as tls
# 图形工具
​
import warnings
warnings.filterwarnings('ignore')
# 忽略报错警告(可以正常运行即可)
​
# Going to use these 5 base models for the stacking
from sklearn.ensemble import (RandomForestClassifier, AdaBoostClassifier,
                              GradientBoostingClassifier, ExtraTreesClassifier)
from sklearn.svm import SVC
​
​
# 2.读入数据+查看数据前3行
# Load in the train and test datasets
train = pd.read_csv('E:/【桌面】/titanic/train.csv')
test = pd.read_csv('E:/【桌面】/titanic/test.csv')
​
# Store our passenger ID for easy access
PassengerId = test['PassengerId']
​
# print(train.head(3))
​
# 3.字符串列变成有序量化的值
# print(train['Ticket'])
train['Ticket_type'] = train['Ticket'].apply(lambda x: x[0:3])
# 取该列每个元素的前三位;x表示该列的每个元素,[0:3]表示前三位
# print(train['Ticket_type'])
train['Ticket_type'] = train['Ticket_type'].astype('category')
# 变成分类变量
# print(train['Ticket_type'])
train['Ticket_type'] = train['Ticket_type'].cat.codes
# 每一类有具体的字符转化为1、2、3、4,这样得到level
# print(train['Ticket_type'])
​
test['Ticket_type'] = test['Ticket'].apply(lambda x: x[0:3])
test['Ticket_type'] = test['Ticket_type'].astype('category')
test['Ticket_type'] = test['Ticket_type'].cat.codes
# 测试集同理
​
# print(train.head(3))
​
​
# 4. 数据处理——增添新列
full_data = [train, test]
# 上下合并
​
# Some extra features, not necessarily important
# Gives the length of the name
train['Name_length'] = train['Name'].apply(len)
# 增添新的一列,为对应的name列的名字长度
test['Name_length'] = test['Name'].apply(len)
train['Words_Count'] = train['Name'].apply(lambda x: len(x.split()))
# 增添新的一列,对应名字的单词数量——分词;
test['Words_Count'] = test['Name'].apply(lambda x: len(x.split()))
​
# Feature that tells whether a passenger had a cabin on the Titanic
train['Has_Cabin'] = train["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
# 有船舱号的为1,否则为0——具体方法,对这一列的数据每个元素判断是否为float元素,是则为空,否则为有舱号
test['Has_Cabin'] = test["Cabin"].apply(lambda x: 0 if type(x) == float else 1)
​
# Feature engineering steps taken from Sina
# Create new feature FamilySize as a combination of SibSp and Parch
for dataset in full_data:
    dataset['FamilySize'] = dataset['SibSp'] + dataset['Parch'] + 1
# 家庭规模:表亲+近亲+自己
​
# Create new feature IsAlone from FamilySize
for dataset in full_data:
    dataset['IsAlone'] = 0
    # 先赋值为0
    dataset.loc[dataset['FamilySize'] == 1, 'IsAlone'] = 1
    # 行为FamilySize为1的行;列为IsAlone列;
    # 如果家里除了自己还有别人,则为0;否则被改为1,说明是单身
​
# Remove all NULLS in the Embarked column
# 删除出发港口的缺失值
for dataset in full_data:
    dataset['Embarked'] = dataset['Embarked'].fillna('S')
    # 用S填补该列的缺失值,因为S本身占据大多数;且缺失值占比较少
​
# Remove all NULLS in the Fare column and create a new feature CategoricalFare
# 删除票价列的缺失值;票价列分箱
for dataset in full_data:
    dataset['Fare'] = dataset['Fare'].fillna(train['Fare'].median())
    # 用train的fare列的中位数填充所有数据集的fare
train['CategoricalFare'] = pd.qcut(train['Fare'], 4)
# 数据分箱,分成4个箱子
​
# 年龄列分箱
# Create a New feature CategoricalAge
for dataset in full_data:
    age_avg = dataset['Age'].mean()
    age_std = dataset['Age'].std()
    # 标准差
    age_null_count = dataset['Age'].isnull().sum()
    # 统计为空的数量
    age_null_random_list = np.random.randint(age_avg - age_std, age_avg + age_std, size=age_null_count)
    # 在标准差和均值的范围内,生成符合缺失值数量的数据
    # np.random.randint()生成一个随机整型数,范围从低(包括)到高(不包括),即[low, high)
    dataset['Age'][np.isnan(dataset['Age'])] = age_null_random_list
    # np.isnan() 判断每一行是否为缺失值;如果是则Yes,否则NO;对于Yes的列,填补上数据
    dataset['Age'] = dataset['Age'].astype(int)
    # 转化为整型;
train['CategoricalAge'] = pd.cut(train['Age'], 5)
# 分成5箱
​
​
# Define function to extract titles from passenger names
# 从乘客姓名中提取
def get_title(name):
    title_search = re.search(' ([A-Za-z]+)\.', name)
    # 正则表达式,匹配“.”之前的性别title——Mr或者Mrs或其它等等等
    # If the title exists, extract and return it.
    if title_search:
        return title_search.group(1)
    return ""
​
​
# Create a new feature Title, containing the titles of passenger names
for dataset in full_data:
    dataset['Title'] = dataset['Name'].apply(get_title)
# print(dataset['Title'])
​
# Group all non-common titles into one single grouping "Rare"
for dataset in full_data:
    dataset['Title'] = dataset['Title'].replace(
        ['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare')
    # replace把非常见的title换为统一的——“Rare”
    dataset['Title'] = dataset['Title'].replace('Mlle', 'Miss')
    # 左边换成右边
    dataset['Title'] = dataset['Title'].replace('Ms', 'Miss')
    dataset['Title'] = dataset['Title'].replace('Mme', 'Mrs')
​
# for dataset in full_data:
#     print(dataset['Sex'])
for dataset in full_data:
    # Mapping Sex
    dataset['Sex'] = dataset['Sex'].map({'female': 0, 'male': 1}).astype(int)
    # 把字符串映射为对应的值:female变成0,male变成1
    # print(dataset['Sex'])
​
    # Mapping titles
    title_mapping = {"Mr": 1, "Miss": 2, "Mrs": 3, "Master": 4, "Rare": 5}
    dataset['Title'] = dataset['Title'].map(title_mapping)
    dataset['Title'] = dataset['Title'].fillna(0)
​
    # Mapping Embarked
    dataset['Embarked'] = dataset['Embarked'].map({'S': 0, 'C': 1, 'Q': 2}).astype(int)
​
    # Mapping Fare
    dataset.loc[dataset['Fare'] <= 7.91, 'Fare'] = 0
    dataset.loc[(dataset['Fare'] > 7.91) & (dataset['Fare'] <= 14.454), 'Fare'] = 1
    dataset.loc[(dataset['Fare'] > 14.454) & (dataset['Fare'] <= 31), 'Fare'] = 2
    dataset.loc[dataset['Fare'] > 31, 'Fare'] = 3
    dataset['Fare'] = dataset['Fare'].astype(int)
​
    # Mapping Age
    dataset.loc[dataset['Age'] <= 16, 'Age'] = 0
    dataset.loc[(dataset['Age'] > 16) & (dataset['Age'] <= 32), 'Age'] = 1
    dataset.loc[(dataset['Age'] > 32) & (dataset['Age'] <= 48), 'Age'] = 2
    dataset.loc[(dataset['Age'] > 48) & (dataset['Age'] <= 64), 'Age'] = 3
    dataset.loc[dataset['Age'] > 64, 'Age'] = 4;
​
# 特征选择
drop_elements = ['PassengerId', 'Name', 'Ticket', 'Cabin', 'SibSp']
train = train.drop(drop_elements, axis = 1)
# 按列删掉不需要的列名
train = train.drop(['CategoricalAge', 'CategoricalFare'], axis = 1)
test  = test.drop(drop_elements, axis = 1)
​
# print(train.head(3))
​
# 绘图
# (1)皮尔逊相关图
colormap = plt.cm.RdBu
# 设置颜色
plt.figure(figsize=(14, 12))
# 设置图像的大小尺寸
plt.title('Pearson Correlation of Features', y=1.05, size=15)
# 设置图像的名字 y为高度
sns.heatmap(train.astype(float).corr(), linewidths=0.1, vmax=1.0,
            square=True, cmap=colormap, linecolor='white', annot=True)
# linewidth、linecolor分割线的粗细和颜色
# square=True 每个方块都是正方形
# cmap颜色映射,这里让它用事先设置的
# annot=True 设置字体浮现在上面
# plt.show()
# 从结果上来看,变量之间的相关性基本都很低
# 这对于模型学习是有利的,因为数据之间没有冗余,每个数据都携带着独特的信息和数据
​
​
# 建模——XGBoost
y_train = train['Survived'].ravel()
# .ravel()把一列数据变成列表里的元素集合
train = train.drop(['Survived'], axis=1)
x_train = train.values
# .values 以数组的形式返回dataframe的所有值
x_test = test.values
​
​
gbm = xgb.XGBClassifier(
    # learning_rate = 0.02,
 n_estimators= 2000,
    # boost几轮
 max_depth= 4,
    # 树的最大深度,注意,如果过高会导致过拟合
 min_child_weight= 2,
    # 作为一个儿子的最小权重
 #gamma=1,
 gamma=0.9,
    # 在树的叶节点上进行进一步分区所需的最小损失减少。越大,算法就越保守。
 subsample=0.8,
 colsample_bytree=0.8,
 objective= 'binary:logistic',
 nthread= -1,
 scale_pos_weight=1).fit(x_train, y_train)
​
# 预测
xgb_predictions = gbm.predict(x_test)
​
​
# 导出
StackingSubmission = pd.DataFrame({ 'PassengerId': PassengerId,
                            'Survived': xgb_predictions })
​
StackingSubmission.to_csv("submission_XGB.csv", index=False)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值