python 决策树

数据预处理

导入pandas模块

import pandas as pd

读入数据,使用pandas中的函数pd.read_csv

#路径中含中文时加入‘engine='python'’
df=pd.read_csv(r'C:\Users\***\Desktop\Titanic.csv',engine='python')
df.head()

结果:
在这里插入图片描述‘PassengerId’,‘Name’,‘Ticket’,'Cabin’是我们不需要的数据,利用drop函数删除该变量,并检查剩余变量是否有缺失值

#axis可设置0,1参数
#使用0值表示沿着每一列或行标签\索引值向下执行方法
#使用1值表示沿着每一行或者列标签横向执行对应的方法
#inplace可设置为Flase和True,True为在原对象编辑
df.drop(['PassengerId','Name','Ticket','Cabin'], axis = 1, inplace = True)
df.isnull().sum(axis=0)

结果
Age有177个缺失,Embarked有2个缺失
接下来要对补上缺失值,各个性别的年龄用各个性别的年龄的均值进行填充
Embarked使用该变量的众数进行填充

#对Age进行填充
#.loc取出sex为i的行,并利用利用fillna函数对其进行填充;使用loc[sex==i]可直接进行判断
#fillna为两个数据框,使用concat函数连接
fillna_df = []
for i in df.Sex.unique():
    update = df.loc[df.Sex==i,].fillna(value = {'Age':df.Age[df.Sex == i].mean()},inplace=False)
    fillna_df.append(update)
df = pd.concat(fillna_df)
#对Embarked进行填充
df.fillna(value={'Embarked':df.Embarked.mode()[0]},inplace=True)

对pclass,age,embarked进行哑变量处理

#由于Pclass是数值型变量,需要先将其转换成类别型
df.Pclass = df.Pclass.astype('category')
#哑变量处理
dummy = pd.get_dummies(df[['Sex','Embarked','Pclass']])
#按列合并
df = pd.concat([df,dummy],axis = 1)
#删除原来的Sex,Pclass,Embarked
df.drop(['Sex','Embarked','Pclass'],inplace=True,axis=1)
df.head()

结果
在这里插入图片描述

构建决策树模型

#导入第三方库
from sklearn import model_selection
#df.columns为列标题,df.columns[1:]为第2个至末尾所有标题
#取出所有自变量
predictors = df.columns[1:]
#将数据集拆分为训练集合测试集,且测试集的比例为25%
X_train,X_test,y_train,y_test = model_selection.train_test_split(df[predictors],df.Survived,test_size=0.25,random_state=1234)

使用GridSearchCV(网格搜索法)对各参数进行快速组合.
需要确定的参数有:最大深度,中间节点能够继续分支的最小样本量,叶节点的最小样本量

# 导入第三方模块
from sklearn.model_selection import GridSearchCV
from sklearn import tree
# 预设各参数的不同选项值
max_depth = [2,3,4,5,6]
min_samples_split = [2,4,6,8]
min_samples_leaf = [2,4,8,10,12]
# 将各参数值以字典形式组织起来
parameters = {'max_depth':max_depth, 'min_samples_split':min_samples_split, 'min_samples_leaf':min_samples_leaf}
# 网格搜索法,测试不同的参数值
grid_dtcateg = GridSearchCV(estimator = tree.DecisionTreeClassifier(), param_grid = parameters, cv=10)
# 模型拟合
grid_dtcateg.fit(X_train, y_train)
# 返回最佳组合的参数值
grid_dtcateg.best_params_

结果
在这里插入图片描述
利用参数构建决策树

# 导入第三方模块
from sklearn import metrics
# 构建分类决策树
CART_Class = tree.DecisionTreeClassifier(max_depth=3, min_samples_leaf = 4, min_samples_split=2)
# 模型拟合
decision_tree = CART_Class.fit(X_train, y_train)
# 模型在测试集上的预测
pred = CART_Class.predict(X_test)
# 模型的准确率
print('模型在测试集的预测准确率:\n',metrics.accuracy_score(y_test, pred))

结果
在这里插入图片描述
绘制ROC曲线

# 导入第三方包
import matplotlib.pyplot as plt
y_score = CART_Class.predict_proba(X_test)[:,1]
fpr,tpr,threshold = metrics.roc_curve(y_test, y_score)
# 计算AUC的值
roc_auc = metrics.auc(fpr,tpr)

# 绘制面积图
plt.stackplot(fpr, tpr, color='steelblue', alpha = 0.5, edgecolor = 'black')
# 添加边际线
plt.plot(fpr, tpr, color='black', lw = 1)
# 添加对角线
plt.plot([0,1],[0,1], color = 'red', linestyle = '--')
# 添加文本信息
plt.text(0.5,0.3,'ROC curve (area = %0.2f)' % roc_auc)
# 添加x轴与y轴标签
plt.xlabel('1-Specificity')
plt.ylabel('Sensitivity')
# 显示图形
plt.show()  

在这里插入图片描述
绘制决策树
需要下载Graphvia(https://graphviz.gitlab.io/_pages/Download/Download_windows.html)
将解压文件的bin设置到环境变量中,重新启动python

from sklearn.tree import export_graphviz
from IPython.display import Image
import pydotplus
from sklearn.externals.six import StringIO
# 绘制决策树
dot_data = StringIO()
export_graphviz(
    decision_tree,
    out_file=dot_data,  
    feature_names=predictors,
    class_names=['Unsurvived','Survived'],  
    # filled=True,
    rounded=True,  
    special_characters=True
)
# 决策树展现
graph = pydotplus.graph_from_dot_data(dot_data.getvalue())
Image(graph.create_png()) 

结果
在这里插入图片描述
本文参考:《从零开始学python数据分析与挖掘》刘顺祥著

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值