决策树模型

决策树是应用得最为常见的 一种数据挖掘算法

   对决策树的认知:     1.数据集作为根节点。

                                     2. 计算每个属性的信息增益,筛选出分类属性。

                                     3. 重复上一步骤

              存在的疑问: 1. 数据源要求。  

                                     2.节点筛选方式

                                     3. 剪枝的概念和步骤

                                     4.如何控制决策树的层数和节点数

Answer1: 数据源的自变量里面包含连续性变量的时候,不用人为分类。在算法中会有相应处理方法。

                ps:  若决策树的因变量为连续性变量,该树成为回归树,若决策树的因变量为分类型变量,该树成为分类树。

Answer2:此过程为决策树的核心过程。主要分要两个步骤。

               1.计算信息熵 : 例如数据集D,包含age , sex ,location 等属 

性。 根据age属性,可以将D分拆成n 类,那么我们可以基

                                          于此数据计算出age 属性的信息熵。同样可以计算出sex,location等属性的信息熵。     

               2.筛选出信息熵最大的属性作为候选划分属性。

             ps: ID3,C4.5,CART等算法的差异,在于筛选信息熵\信息熵增益率\基尼系数 。

Answer3: 预剪枝和后剪枝

           预剪枝的意思在通过属性将结点拆分之前,计算划分前后的泛化性能得分。意思通过验证集的正确性判断是否需要在该节点进行分拆。

           后剪枝的意思先生成一棵决策树,然后从叶子的节点的上一层检验是否需要拆分,检验方法同上,依据验证集的正确率。

Answer4: 控制决策树的层数和节点数

           我是通过调用sklearn包的DecisionTreeClassifier()函数,实现决策树模型的。在参数中设置max_depth,min_samples_split,max_leaf_nodes等参数,可实现控制决策树的层数和叶子节点数量。

具体代码如下,减枝部分未完善,代码可生成决策树的pdf文件

# -*- coding: utf-8 -*-
"""
Created on Wed Feb 27 14:37:17 2019

@author: 17098
"""

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.metrics import accuracy_score
from sklearn.metrics import roc_auc_score




# pandas 读入excel文件 
data = pd.read_csv('xxx.csv',encoding='utf-8')

# 数清洗




# 区分测试集和训练集
X = data.iloc[:,1:6]
y = data.iloc[:,6]
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0, train_size=0.8)
columns = X_train.columns[1:6]


# # 数据标准化
# from sklearn.preprocessing import StandardScaler
# ss_X = StandardScaler()
# ss_y = StandardScaler()
# X_train = ss_X.fit_transform(X_train)
# X_test = ss_X.transform(X_test)

# 构建决策树模型
from sklearn.tree import DecisionTreeClassifier
model_tree = DecisionTreeClassifier(criterion='gini',splitter='best',max_depth=6,
                                    min_samples_split=2)
model_tree.fit(X_train, y_train)



#评级准确性
y_prob = model_tree.predict_proba(X_test)[:,1]
y_pred = np.where(y_prob > 0.5, 1, 0)
model_tree.score(X_test, y_pred)




#可视化
data_ = pd.read_csv('C:\\Users\\cavin\\Desktop\\data_support_tree.csv',encoding='utf-8')
data_['is_ylk']=data_['is_ylk'].replace([0,1],['ordin_person','ylk_person']) #替换is_ylk的值,将数字转为字符串
data_feature_name = data_.columns[1:6]
data_target_name = np.unique(data_["is_ylk"])
import graphviz
import pydotplus
from sklearn import tree
from IPython.display import Image
import os
os.environ["PATH"] += os.pathsep + 'D:/python/graphviz_installl/bin'
dot_tree=tree.export_graphviz(model_tree,out_file=None,feature_names=data_feature_name,class_names=data_target_name,filled=True, rounded=True,special_characters=True)


graph = pydotplus.graph_from_dot_data(dot_tree)
img = Image(graph.create_png())
graph.write_png("out.png")

# with open("tree.dot",'w') as f:
#     f = tree.export_graphviz(clf, out_file=f)
    # dot_graph = f.read()
#
# graphviz.Source(dot_graph)

#
# graph = graphviz.Source(dot_tree) # doctest: +SKIP
# #在同级目录下生成tree.pdf文件
# graph.render("tree") # doctest: +SKIP
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值