# -*- coding: utf-8 -*-
"""
Created on Fri Jul 19 14:47:14 2019
@author: Caiyunbin
"""
import pandas as pd
import numpy as np
from sklearn import tree
from sklearn.tree import DecisionTreeClassifier
import graphviz
#定义一个数据集或者说导入一个数据集
def create_data():
row_data = {'no surfacing':[1,1,1,0,0],
'flippers':[1,1,0,1,1],
'fish':['yes','yes','no','no','no']}
dataset = pd.DataFrame(row_data)
return dataset
#定义香浓熵的算法
def calent(dataset):
n = dataset.shape[0] #注意shape的中括号
nclass = dataset.iloc[:,-1].value_counts()
p = nclass/n
ent = (-p*np.log2(p)).sum()
return ent
#定义最佳分割的列方法
def best_split(dataset):
baseent = calent(dataset)
bestgain = 0
axis = -1
for i in range(dataset.shape[1]-1):
levels = dataset.iloc[:,i].value_counts().index
ents = 0
for j in levels:
childset = dataset[dataset.iloc[:,i]==j]
ent = calent(childset)
ents += (childset.shape[0]/dataset.shape[0])*ent
infogain = baseent - ents
if (infogain>bestgain):
bestgain = infogain
axis = i
return axis
#定义一个划分数据集的方法
def mysplit(dataset,axis,value):
col = dataset.columns[axis]
redataset = dataset.loc[dataset[col]==value,:].drop(col,axis=1)
return redataset
#使用递归的方法构建一棵树
def createtree(dataset):
colum_all_feature = list(dataset.columns)
classlist = dataset.iloc[:,-1].value_counts() #会按照从高到低的顺序进行排列
if classlist[0] == dataset.shape[0] or dataset.shape[1]==1:
return classlist.index[0]
axis = best_split(dataset)
bestfeature = colum_all_feature[axis]
mytree = {bestfeature:{}}
del colum_all_feature[axis]
valuelist = set(dataset.iloc[:,axis])
for value in valuelist:
mytree[bestfeature][value] = createtree(mysplit(dataset,axis,value))
return mytree
#关于决策树的存储,格式为numpy库npy文件
def save_tree(mytree):
np.save('mytree.npy',mytree)
#将数在测试集上进行测试
def classy(inputtree,labels,testvec): #判断其中的一条向量
firststr = next(iter(inputtree))
seconddict = inputtree[firststr]
featindex = labels.index(firststr)
for key in seconddict.keys():
if testvec[featindex]==key:
if type(seconddict[key])==dict:
classlabel = classy(seconddict[key],labels,testvec)
else:
classlabel = seconddict[key]
return classlabel
#查看该模型的性能
def acc_classify(train,test):
inputtree = createtree(train)
labels = list(train.columns)
result = []
for i in range(test.shape[0]):
testvec = test.iloc[i,:-1]
classlabel = classy(inputtree,labels,testvec)
result.append(classlabel)
test['predict']=result
acc = (test.iloc[:,-1]==test.iloc[:-2]).mean()
print('模型的准确率为',acc)
#对决策树进行画图
xtrain = dataset.iloc[:,:-1]
Ytrain = dataset.iloc[:,-1]
labels = Ytrain.unique().tolist
Ytrain = Ytrain.apply(lambda x:labels.index(x))
clf = DecisionTreeClassifier()
clf = clf.fit(xtrain,Ytrain)
tree.export_graphviz(clf)
dot_data = tree.export_graphviz(clf,out_file = None,
feature_names =['no surfacing','flippers'],
class_names=['fish','not fish'],
filled = True,rounded = True,
special_characters = True,
graphviz.source(dot_data))
def main():
dat = create_data()
mytree = createtree(dat)
print(mytree)
if __name__ == '__main__':
main()
mytree=createtree(dataset)
inputtree = mytree
没有合适的资源?快使用搜索试试~ 我知道了~
使用Python的普通方法或者使用pandas库写决策树.zip
共2个文件
py:2个
需积分: 5 0 下载量 47 浏览量
2024-04-25
19:09:56
上传
评论
收藏 3KB ZIP 举报
温馨提示
决策树(Decision Tree)是一种在已知各种情况发生概率的基础上,通过构成决策树来求取净现值的期望值大于等于零的概率,评价项目风险,判断其可行性的决策分析方法。由于这种决策分支画成图形很像一棵树的枝干,因此得名决策树。在机器学习中,决策树是一个预测模型,代表的是对象属性与对象值之间的一种映射关系。 决策树的应用场景非常广泛,包括但不限于以下几个方面: 金融风险评估:决策树可以用于预测客户借款违约概率,帮助银行更好地管理风险。通过客户的历史数据构建决策树,可以根据客户的财务状况、征信记录、职业等信息来预测违约概率。 医疗诊断:医生可以通过病人的症状、体征、病史等信息构建决策树,根据不同的症状和体征来推断病情和诊断结果,从而帮助医生快速、准确地判断病情。 营销策略制定:企业可以通过客户的喜好、购买记录、行为偏好等信息构建决策树,根据不同的特征来推断客户需求和市场走势,从而制定更有效的营销策略。 网络安全:决策树可以用于网络安全领域,帮助企业防范网络攻击、识别网络威胁。通过网络流量、文件属性、用户行为等信息构建决策树,可以判断是否有异常行为和攻击威胁。
资源推荐
资源详情
资源评论
收起资源包目录
使用Python的普通方法或者使用pandas库写决策树.zip (2个子文件)
content
jueceshu1.py 3KB
jueceshu2.py 4KB
共 2 条
- 1
资源评论
生瓜蛋子
- 粉丝: 3798
- 资源: 4401
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功