数据挖掘十大经典算法之——C4.5 算法

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sunyaowu315/article/details/88838469

数据挖掘十大经典算法系列,点击链接直接跳转

一 简介

决策树 :采用自顶向下的递归方式,把一组无序的数据整理成类似于流程图的树结构。每个枝节点表示一个属性,每个分枝代表属性的一种选择,每个叶节点存放选择之后对应的结果(类标号)。一旦建立好了决策树,对于一个未给定类标号的样本元组,其跟踪一条由根节点到叶节点的路径,就可以得到一条对应的合取规则。(好理解吗,不好理解就上图!)
在这里插入图片描述

决策树的优势在于不需要任何领域知识或参数设置,适合于探测性的知识发现,故而常用于解决机器学习和数据挖掘中的统计分类问题,简单讲,它的目标就是将具有p维特征的n个样本分到c个类别中去。

常见的决策树算法有ID3、C4.5、CART。ID3使用信息熵的概念来做特征选择,然后通过学习数据来建立决策树。C4.5算法是对ID3算法的一个扩展,使用信息增益率来选择属性。

二 思想

三 流程

四 特点

1. 优点
  • 1、直观易懂
  • 2、分类效率较高
  • 3、可以处理非离散数据
  • 4、可以处理不完整数据
  • 5、通过剪枝调整树模型
2. 缺点
  • 1、不适合处理大量数据。在构造树的过程中,需要对数据集进行多次顺序扫描和排序,因而导致算法的低效。
  • 2、对分类敏感

五 应用

凭借其独特的特点及突出的优势,C4.5算法已经在金融、医疗等行业得到了成功的应用,在其他多领域也被广泛接受、研究应用。
在这里插入图片描述

六 案例

如下为python sklearn自带的一份鸢尾花数据,我们用C4.5算法,盘它。

# -*- coding: utf-8 -*-

from matplotlib import pyplot as plt
import numpy as np
from sklearn import tree
from sklearn.datasets import load_iris

print('\n\n\n\n\n\n\n\n\n\n')

# show data info
data = load_iris() # 加载 IRIS 数据集
print('keys: \n', data.keys()) # ['data', 'target', 'target_names', 'DESCR', 'feature_names']
feature_names = data.get('feature_names')
print('feature names: \n', data.get('feature_names')) # 查看属性名称
print('target names: \n', data.get('target_names')) # 查看 label 名称
x = data.get('data') # 获取样本矩阵
y = data.get('target') # 获取与样本对应的 label 向量
print(x.shape, y.shape) # 查看样本数据
print(data.get('DESCR'))

# visualize the data
f = []
f.append(y==0) # 类别为第一类的样本的逻辑索引
f.append(y==1) # 类别为第二类的样本的逻辑索引
f.append(y==2) # 类别为第三类的样本的逻辑索引
color = ['red','blue','green']
fig, axes = plt.subplots(4,4) # 绘制四个属性两辆之间的散点图
for i, ax in enumerate(axes.flat):
    row  = i // 4
    col = i % 4
    if row == col:
        ax.text(.1,.5, feature_names[row])
        ax.set_xticks([])
        ax.set_yticks([])
        continue
    for  k in range(3):
        ax.scatter(x[f[k],row], x[f[k],col], c=color[k], s=3)    
fig.subplots_adjust(hspace=0.3, wspace=0.3) # 设置间距
plt.show()

# 随机划分训练集和测试集
num = x.shape[0] # 样本总数
ratio = 7/3 # 划分比例,训练集数目:测试集数目
num_test = int(num/(1+ratio)) # 测试集样本数目
num_train = num -  num_test # 训练集样本数目
index = np.arange(num) # 产生样本标号
np.random.shuffle(index) # 洗牌
x_test = x[index[:num_test],:] # 取出洗牌后前 num_test 作为测试集
y_test = y[index[:num_test]]
x_train = x[index[num_test:],:] # 剩余作为训练集
y_train = y[index[num_test:]]

# 构建决策树
clf = tree.DecisionTreeClassifier() # 建立决策树对象
clf.fit(x_train, y_train) # 决策树拟合

# 预测
y_test_pre = clf.predict(x_test) # 利用拟合的决策树进行预测
print('the predict values are', y_test_pre) # 显示结果

  # 计算分类准确率
acc = sum(y_test_pre==y_test)/num_test
print('the accuracy is', acc) # 显示预测准确率

猜你喜欢

转载自blog.csdn.net/sunyaowu315/article/details/88838469