机器学习 决策树篇——解决连续变量的分类问题

  • 摘要
    • 信息熵、条件熵、熵增益、熵增益率的计算
    • GiNi系数、GiNi系数增益的计算
    • python代码
    • 连续变量决策树分类案例

摘要

本文通过python实现了连续变量的信息熵条件熵熵增益熵增益率GiNi系数GiNi系数增益的计算、实现了连续变量的决策树分类模型,同样也适用于离散变量的分类模型,并将代码进行了封装,方便读者调用。

信息熵、条件熵、熵增益、熵增益率的计算

.cal_entropy():计算熵的函数
.cal_conditional_entropy():计算条件熵的函数
.cal_entropy_gain():计算熵增益(互信息)的函数
.cal_entropy_gain_ratio():计算熵增益率的函数
用法:可直接调用CyrusDecisionTree类方法或先将类实例化后再调用。(见后续代码)

GiNi系数、GiNi系数增益的计算

.cal_gini():计算GiNi系数的函数
.cal_gini_gain():计算GiNi系数增益的函数
用法:可直接调用CyrusDecisionTree类方法或先将类实例化后再调

python代码

criterion 为可选参数
若传入“C4.5”则为基于信息增益率的决策树模型
若传入“gini”则为基于GiNi系数增益的决策树模型

import numpy as np
import pandas as pd
class CyrusDecisionTree(object):X = NoneY = Nonedef __init__(self,criterion = "C4.5"):self.criterion = criterionself.tree_net = None# 1、计算信息熵的函数@classmethoddef cal_entropy(class_obj,y):y = np.array(y).reshape(-1)counts = np.array(pd.Series(y).value_counts())return -((counts/y.shape[0])*np.log2(counts/y.shape[0])).sum()# 2、计算条件熵的函数@classmethoddef cal_conditional_entropy(class_obj,x,y):"""计算在条件x下y的信息熵"""x = np.array(pd.Series(x).sort_values()).reshape(-1)y = np.array(y).reshape(-1)[list(pd.Series(x).argsort())]split = []entropy = []for i in range(x.shape[0]-1):split.append(0.5*(x[i]+x[i+1]))entropy.append((i+1)/x.shape[0]*class_obj.cal_entropy(y[:i+1])+(1-(i+1)/x.shape[0])*class_obj.cal_entropy(y[i+1:]))return (np.array(entropy),np.array(split))# 3、计算信息增益的函数@classmethoddef cal_entropy_gain(class_obj,x,y):"""计算在条件x下y的信息增益"""entropy,split = class_obj.cal_conditional_entropy(x,y)entropy_gain = class_obj.cal_entropy(y) - entropyreturn entropy_gain.max(),split[entropy_gain.argmax()]# 4、计算熵增益率的函数@classmethoddef cal_entropy_gain_ratio(class_obj,x,y):"""计算在条件x下y的信息增益率"""entropy_gain,split = class_obj.cal_entropy_gain(x,y)entropy_condition = class_obj.cal_entropy(y) - entropy_gainreturn entropy_gain/entropy_condition,split# 5、Gini系数计算函数@classmethoddef cal_gini(class_obj,y):y = np.array(y).reshape(-1)counts = np.array(pd.Series(y).value_counts())return 1-(((counts/y.shape[0])**2).sum())# 6、Gini系数增益计算@classmethoddef cal_gini_gain(class_obj,x,y):"""计算在条件x下y的Gini系数增益"""x = np.array(pd.Series(x).sort_values()).reshape(-1)y = np.array(y).reshape(-1)[list(pd.Series(x).argsort())]split = []gini = []for i in range(x.shape[0]-1):split.append(0.5*(x[i]+x[i+1]))gini.append((i+1)/x.shape[0]*class_obj.cal_gini(y[:i+1])+(1-(i+1)/x.shape[0])*class_obj.cal_gini(y[i+1:]))gini_gain = class_obj.cal_gini(y) - np.array(gini)split = np.array(split)return gini_gain.max(),split[gini_gain.argmax()]# tree构建递归函数def tree(self,x,y,net):if pd.Series(y).value_counts().shape[0] == 1:net.append(y[0])else:x_entropy = []x_split = []for i in range(x.shape[1]):if self.criterion == "C4.5":entropy,split= self.cal_entropy_gain_ratio(x[:,i],y)else:entropy,split= self.cal_gini_gain(x[:,i],y)x_entropy.append(entropy)x_split.append(split)rank = np.array(x_entropy).argmax()split = x_split[rank]net.append(rank)net.append(split)net.append([])net.append([])x_1 = []x_2 = []for i in range(x.shape[0]):if x[i,rank] > split:x_1.append(i)else:x_2.append(i)x1 = x[x_1,:]y1 = y[x_1]x2 = x[x_2,:]y2 = y[x_2]return self.tree(x1,y1,net[2]),self.tree(x2,y2,net[3]) def predict_tree(self,x,net):x = np.array(x).reshape(-1)if len(net) == 1:return netelse:if x[net[0]] >= net[1]:return self.predict_tree(x,net[2])else:return self.predict_tree(x,net[3])# 模型训练函数def fit(self,x,y):self.X = np.array(x)self.Y = np.array(y).reshape(-1)self.tree_net = []self.tree(self.X,self.Y,self.tree_net)# 模型预测函数def predict(self,x):x = np.array(x)pre_y = []for i in range(x.shape[0]):pre_y.append(self.predict_tree(x[i,:],self.tree_net))return np.array(pre_y)

连续变量决策树分类案例

y = np.random.randint(0,10,30).reshape(-1)
x = np.random.random([30,5])
print(x)
print(y)
[[0.52533105 0.73209647 0.58700477 0.36033001 0.91586941][0.94308921 0.13044845 0.34348716 0.68958107 0.85397988][0.7242329  0.53027196 0.13577077 0.26769844 0.67871508][0.43056763 0.57511585 0.12568578 0.31678452 0.0067388 ][0.38103315 0.71300916 0.83360782 0.40604844 0.0352286 ][0.39538199 0.79040881 0.63293679 0.67048469 0.0743981 ][0.60237319 0.48057981 0.30906018 0.23632994 0.65723904][0.64566226 0.95529741 0.34702771 0.45110142 0.0355881 ][0.16776585 0.69377092 0.98103948 0.21491139 0.3792334 ][0.48527149 0.16346686 0.71499249 0.24499424 0.43896129][0.50378007 0.11929577 0.53185892 0.04572121 0.2287798 ][0.75859512 0.53336214 0.64378837 0.82518598 0.96073149][0.67140078 0.50990813 0.99593748 0.57135234 0.2955292 ][0.60429891 0.30828858 0.4740352  0.97094536 0.73335159][0.73112143 0.450134   0.66282747 0.93411235 0.27251284][0.45273626 0.70515434 0.79901511 0.46209148 0.75002544][0.75767042 0.16873059 0.81269049 0.16076081 0.6065813 ][0.97628975 0.14158034 0.10692558 0.56774873 0.97330805][0.49577763 0.52372332 0.34862    0.58616061 0.94039918][0.08672443 0.40289412 0.07220557 0.16319812 0.39363945][0.00317775 0.13165272 0.2509101  0.28256357 0.72483668][0.7287063  0.35129312 0.44207534 0.23099126 0.08441964][0.69944897 0.06905071 0.2411949  0.57971762 0.14470603][0.67122102 0.17006905 0.68307124 0.89004399 0.76470935][0.58254671 0.66576537 0.12318    0.84908671 0.84378037][0.42940781 0.83785544 0.96820387 0.95913632 0.78881616][0.62771109 0.25085264 0.91938847 0.27654677 0.95426724][0.02575006 0.62735923 0.85298517 0.36904279 0.25085951][0.05350246 0.66845444 0.74378456 0.81039401 0.40810988][0.11843527 0.91711057 0.01975534 0.34762297 0.05685195]]
[3 3 9 9 2 3 2 5 1 2 4 2 0 0 9 9 7 2 2 9 9 0 5 4 0 3 1 6 6 6]
model = CyrusDecisionTree(criterion="gini")
model.fit(x,y)
y_pre = model.predict(x)
print(y)
print(y_pre)
[3 3 9 9 2 3 2 5 1 2 4 2 0 0 9 9 7 2 2 9 9 0 5 4 0 3 1 6 6 6]
[3 3 9 9 2 3 2 5 1 2 4 2 0 0 9 9 7 2 2 9 9 0 5 4 0 3 1 6 6 6]

by CyrusMay 2020 06 09

幸福不是多 而是遗忘
能遗忘生命的 烦恼忧伤
——————五月天(Enrich your life)——————

机器学习 决策树篇——解决连续变量的分类问题相关推荐

  1. 机器学习 决策树篇——解决离散变量的分类问题

    机器学习 决策树篇--解决离散变量的分类问题 摘要 熵增益和熵增益率计算 熵增益和熵增益率运行结果 离散变量的决策树模型 决策树模型运行结果 摘要 本文通过python实现了熵增益和熵增益率的计算.实 ...

  2. 机器学习——决策树(decision tree)

    相关文章链接: 机器学习--人工神经网络(NN) 机器学习--卷积神经网络(CNN) 机器学习--循环神经网络(RNN) 机器学习--长短期记忆(LSTM) 机器学习--决策树(decision tr ...

  3. 机器学习应用篇(五)——决策树分类实例

    机器学习应用篇(五)--决策树分类实例 文章目录 机器学习应用篇(五)--决策树分类实例 一.数据集 二.实现过程 1 数据特征分析 2 利用决策树模型在二分类上进行训练和预测 3 利用决策树模型在多 ...

  4. 机器学习(四):CART分类树(基础篇)

    机器学习(四):CART分类树(基础篇) 相关的决策树文章: 机器学习(四)ID3决策树 机器学习(四)C4.5决策树 机器学习(四)CART回归树 机器学习(四)决策树绘图 机器学习(四)剪枝技术 ...

  5. 机器学习应用篇(七)——基于LightGBM的分类预测

    机器学习应用篇(七)--基于LightGBM的分类预测 文章目录 机器学习应用篇(七)--基于LightGBM的分类预测 一.Introduction 1 LightGBM的优点 2 LightGBM ...

  6. 机器学习03:使用logistic回归方法解决猫狗分类问题

    机器学习03:使用logistic回归方法解决猫狗分类问题 文章目录 机器学习03:使用logistic回归方法解决猫狗分类问题 前言 1. Logistic回归原理 1.1 从线性回归说起 1.2 ...

  7. 关于《机器学习决策树导出图片、PDF支持中文》解决办法

    很久没有更新博客了,一直以为自己默默无闻,埋头苦干.实际上是一种懒惰! 2020年的春天,是一段难忘的记忆!在这段特殊的时光里,让我静心思考,潜心研究.每每遇到技术困惑,总能在CSDN找到解决办法,由 ...

  8. 干货:如何利用机器学习实现有噪声标签样本分类模型?

    在工业生产活动中,有一类常见机器学习问题,就是如何基于有噪声样本标签训练模型,以进行故障检测和分类. 先解释下什么是有噪声样本标签,它指的是训练模型用的样本标签并非完全准确,部分样本的标签有标错的情况 ...

  9. Sklearn官方文档中文整理6——交叉分解,朴素贝叶斯和决策树篇

    Sklearn官方文档中文整理6--交叉分解,朴素贝叶斯和决策树篇 1. 监督学习 1.8. 交叉分解[cross_decomposition.PLSRegression,cross_decompos ...

最新文章

  1. Mysql安装 定期弹出黑框作用及关闭
  2. IDEA—使用插件反编译jar包
  3. 单片机 驱动 标签打印机tsc_指令打印与驱动打印随笔
  4. 洛谷3916 图的遍历
  5. 去除tableView表头悬浮
  6. 吐槽下CSDN编辑器
  7. MySQL Data目录查找并迁移到data文件夹中
  8. cm10主题android l,索爱MK16i刷机包[Nightly 2013.03.18 CM10] Cyanogen团队定制
  9. 我对国内两大购书站点的感受(dearbook和china-pub)
  10. 软件著作权申请需要哪些材料?
  11. R语言_缺失值NA的处理
  12. 华为手机android是什么意思,华为手机里的文件夹表示什么意思?
  13. PDF文件怎么加密?这两种加密方法很靠谱
  14. Ubuntu怎么知道去哪找安装软件?
  15. Spark 基础知识
  16. Spring系列:mysqlsqlserver对比
  17. B. Nezzar and Lucky Number
  18. Malware Classification Based on GraphNeural Network Using Control Flow Graph
  19. Redis 多服务器集群搭建
  20. 平板电脑里安装python_10 个平板电脑上的 Python 编辑器

热门文章

  1. powermock静态类_使用Powermock对静态内部类单例模式模拟
  2. IPV6的链路本地地址总结
  3. 打扮家能否将齐家网变成过去时?
  4. Linux环境下的Qt5编程(闹钟)
  5. 1575-我想满手鲜血(思路+LIS)
  6. macbook安装矢量图编辑Illustrator 2022(AI2022)
  7. 详解模板引擎工作机制
  8. 树莓派系统用TF卡选购需谨慎
  9. 《分析服务从入门到精通读书笔记》第一章、数据分析层次结构(2)
  10. OK-CC天天呼叫中心系统,外呼中心安装后如何使用