用决策树分析泰坦尼克号生存

一)前言
上一篇文章将了决策树分类的原理以及参数的分析,这篇就用用决策树分析泰坦尼克号生存情况。
上一篇地址:
https://blog.csdn.net/MR_Trustin/article/details/96886157

二)代码以及分析
数据来源于kaggle,地址是https://www.kaggle.com/c/titanic

#导入相关模块
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
import sklearn.metrics as sm
data = pd.read_csv('titanic/train.csv',index_col=0) #指定第一列为索引
# 观察数据结构
data.head()

在这里插入图片描述

# 通过观察,丢弃无用的数据'Name', 'Ticket', 'Cabin'
data = data.drop(['Name', 'Ticket', 'Cabin'],axis=1)
data.head()

在这里插入图片描述

 # 处理性别数据,male转成1,female转成0
data['Sex'] = (data['Sex'] == 'male').astype('int')
# 处理登船港口数据
labels = data['Embarked'].unique().tolist() 
#Python 列表 index() 方法用于从列表中找出某个对象第一个匹配项的索引位置
data['Embarked'] = data['Embarked'].apply(lambda x: labels.index(x)) 
#'Embarked'字段里存在空值,通过转换,把空值也变成了int类型
#缺省值统计
data.isnull().sum()

out:

Survived      0
Pclass        0
Sex           0
Age         177
SibSp         0
Parch         0
Fare          0
Embarked      0
dtype: int64
#我们发现Age中有177个缺省值,数量较多,不能删除,先尝试用0填充
data = data.fillna(0)
#划分训练集和验证集
y = data['Survived'].values
x = data.drop(['Survived'], axis=1).values
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.8)

print('train dataset: {}; test dataset: {}'.format(x_train.shape, x_test.shape))

out:

train dataset: (712, 7); test dataset: (179, 7)
#建模
import sklearn.model_selection as ms
params = [{'criterion': ['entropy','gini'],  'min_impurity_split': np.linspace(0, 1, 50)},
              {'max_depth': range(2, 10)},
              {'min_samples_split': range(2, 30, 2)}]

model = DecisionTreeClassifier(class_weight='balanced')
model = ms.GridSearchCV(model, params, cv=5)
model.fit(x_train, y_train)

out:
在这里插入图片描述

# 输出网格搜索的最优参数组合以及最佳得分
print("best params:",model.best_params_)
print("best score: ",model.best_score_)

out:

best params: {'max_depth': 5}
best score:  0.8019662921348315
#用模型预测测试集,并输出分类报告
pred_train_y = model.predict(x_test)
print(sm.classification_report(y_test, pred_train_y))

out:

                 precision    recall  f1-score   support

           0       0.77      0.92      0.84       106
           1       0.85      0.60      0.70        73

   micro avg       0.79      0.79      0.79       179
   macro avg       0.81      0.76      0.77       179
weighted avg       0.80      0.79      0.79       179

前面在处理Age缺省值的时候,我用的是用0填充;
现在,我换一种方法,用中位数来填充,看下结果

#就改变这一行代码,其他不变
data['Age']=data['Age'].fillna(data['Age'].median())

我们看下结果:

print("best params:",model.best_params_)
print("best score: ",model.best_score_)

out:

best params: {'criterion': 'gini', 'min_impurity_split': 0.2857142857142857}
best score:  0.8075842696629213
pred_train_y = model.predict(x_test)
print(sm.classification_report(y_test, pred_train_y))
                precision    recall  f1-score   support

           0       0.85      0.90      0.88       113
           1       0.81      0.73      0.77        66

   micro avg       0.84      0.84      0.84       179
   macro avg       0.83      0.81      0.82       179
weighted avg       0.84      0.84      0.84       179

总结:
用中位数填充空值后,model.best_score_ 稍微高了点,f1_score高出许多。
所以,用中位数填充空值,可以让模型更为精确。

决策树的分类问题就到了,下一篇写用决策树进行回归。

  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值