基于决策树的泰坦尼克号幸存者预测

import pandas as pd
import numpy as np
from sklearn.tree import DecisionTreeClassifier
import matplotlib.pyplot as plt
from sklearn.model_selection import GridSearchCV
from sklearn.model_selection import train_test_split
from sklearn.model_selection import cross_val_score
data = pd.read_csv(r"F:\JupyterWorkPlace\caicai_Sklearn\决策树\data.csv")

一、数据探索

 data

在这里插入图片描述

data.head()

在这里插入图片描述

data.info()

在这里插入图片描述

二、特征筛选

data.drop(['Cabin','Name','Ticket'],inplace=True,axis=1)    # 无关数据删除处理

2.1、缺失值处理

  • 缺失值填充可以用均值、中位数、随机森林等方法
  • dropna(axis=0) 删除有缺失值的所有行 默认为 axis=0 可以缺省
data["Age"] = data["Age"].fillna(data["Age"].mean()) # 缺失值用均值填充处理    data["Age"] 取出查看缺失值
data = data.dropna()    # 删除Embarked的缺失行
data.info()

在这里插入图片描述

2.2、对性别等对象数据做编码 转换成Sklearn可以处理的数据形式

  • data[“Embarked”].unique() 取出Embarked并用unique()来查看有多少分类
  • 取出的分类存放在一个数组 用tolist()将其转化为一个列表
labels = data["Embarked"].unique().tolist()    
labels         # ['S', 'C', 'Q']

print(labels.index("S"))   # 返回标签对应的索引
labels[0]   
# 0
# 'S'
  • OneHot编码
  • apply()函数应用
  • lambda函数
data["Embarked"] = data["Embarked"].apply(lambda x:labels.index(x))  
data.head()

在这里插入图片描述

  • 另一种编码方式
  • data[“Sex”] = (data[“Sex”] == “male”) # 将性别这一列转化为True False 形式
  • data[“Sex”]
  • astype()做类型转换
data["Sex"] = (data["Sex"] == "male").astype("int")  # 按照True False 将其转化为编码 0 1
data.head()

在这里插入图片描述

2.3、将标签单独取出来

x = data.iloc[:,data.columns != "Survived"]   # 取出除标签外的数据
y = data.iloc[:,data.columns == "Survived"]

三、划分训练集、测试集

Xtrain,Xtest,Ytrain,Ytest = train_test_split(x,y,test_size=0.3)   # 随机划分数据集后数据的索引会变乱
print(Xtrain.index,'\n',Xtrain.shape)
Xtrain

在这里插入图片描述

3.1、修改数据集的索引

Xtrain.index = range(Xtrain.shape[0])     # 修改数据集的索引 从0开始到621
Xtest.index = range(Xtest.shape[0]) 
Ytrain.index = range(Ytrain.shape[0]) 
Ytest.index = range(Xtest.shape[0]) 
# # 用循环来做索引修改
# for i in [Xtrain,Xtest,Ytrain,Ytest]:
#     i.index = range(i.shape[0])

四、模型训练

clf = DecisionTreeClassifier(random_state=10)
clf = clf.fit(Xtrain,Ytrain)
score = clf.score(Xtest,Ytest)

score   # 0.7340823970037453

4.1、使用交叉验证

clf = DecisionTreeClassifier(random_state=10)
score = cross_val_score(clf,x,y,cv=10).mean()

score  # 0.7514683350357507

4.2、使用不同树的深度训练

tr = []
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=10
                                ,max_depth=i+1
                                )
    clf = clf.fit(Xtrain,Ytrain)
    score_tr = clf.score(Xtrain,Ytrain)
    score_te = cross_val_score(clf,x,y,cv=10).mean()
    tr.append(score_tr)
    te.append(score_te)
print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))      # 让横坐标显示1-10的标尺
plt.legend()
plt.show()

在这里插入图片描述

  • 上图中当树深为3时最好 没有过拟合、准确度相对较好
tr = []
te = []
for i in range(10):
    clf = DecisionTreeClassifier(random_state=10
                                ,max_depth=i+1
                                ,criterion="entropy"   # criterion默认使用的Gini系数 entropy为拟合程度不够的时候用
                                )
    clf = clf.fit(Xtrain,Ytrain)
    score_tr = clf.score(Xtrain,Ytrain)
    score_te = cross_val_score(clf,x,y,cv=10).mean()
    tr.append(score_tr)
    te.append(score_te)
print(max(te))
plt.plot(range(1,11),tr,color="red",label="train")
plt.plot(range(1,11),te,color="blue",label="test")
plt.xticks(range(1,11))      # 让横坐标显示1-10的标尺
plt.legend()
plt.show()

在这里插入图片描述

4.3、网格搜索

  • 能够帮助我们同时调整多个参数的技术,枚举技术

  • 计算量大 尽量确定范围后搜索

  • 一般做两个参数、两个参数做网格搜索 减少计算量

  • 网格搜索只能对所有的参数都做选择 就算不带一部分会更正确,网格搜索也不会放弃这个参数

  • parameters 一串参数和这些参数对应的希望网格搜索的参数的取值范围为

  • np.linspace(0,0.5,20) 生成有顺序排列的随机的0-0.5的20个数

  • Gini系数取值为0-0.5 entropy 信息熵的取值为0-1

parameters = {"criterion":("gini","entropy")
             ,"splitter":("best","random")     # 与random一样 控制随机性的参数
             ,"max_depth":[*range(1,10)]
             ,"min_samples_leaf":[*range(1,50,5)]
             ,"min_impurity_decrease":[*np.linspace(0,0.5,20)]}  # 限制信息增益的大小 小于设定值的不发生

clf = DecisionTreeClassifier(random_state=10)
GS = GridSearchCV(clf,parameters,cv=10)    # 网格训练
GS = GS.fit(Xtrain,Ytrain)
网格搜索两个重要的接口
GS.best_params_  # 从我们输入的参数和参数列表中,返回最佳组合

在这里插入图片描述

GS.best_score_   # 网格搜索后最佳方案的得分
                 # 0.8248335893497183
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值