实用:sklearn提取决策树规则代码(附python代码)

《老饼讲解机器学习》icon-default.png?t=N7T8https://www.bbbdata.com/text/35


目录

一.问题

二.主要思路

三.代码实例

1.数据提取

2.预测函数

3.准确性测试


一.问题

在决策树模型建好之后,要提取规则布署到生产。

二.主要思路

只提取数据,在生产环境写出通用预测代码。新的模型只需替换数据即可。

备注:一般不弄成一系列的if else,写死代码不便于更换模型。

三.代码实例

1.数据提取

使用如下get_tree函数,将树数据提取成字典:

from sklearn import tree
import numpy as np
def get_tree(sk_tree):
    #--------------拷贝sklearn树模型关键信息--------------------
    children_left       = sk_tree.tree_.children_left.copy()            # 左节点编号
    children_right      = sk_tree.tree_.children_right.copy()          # 右节点编号
    feature          = sk_tree.tree_.feature.copy()               # 分割的变量
    threshold         = sk_tree.tree_.threshold.copy()              # 分割阈值
    impurity          = sk_tree.tree_.impurity.copy()               # 不纯度(gini)
    n_node_samples      = sk_tree.tree_.n_node_samples.copy()           # 样本个数
    value            = sk_tree.tree_.value.copy()                 # 样本分布
    n_sample         = value[0].sum()                          # 总样本个数
    node_num         = len(children_left)                       # 节点个数
    depth = sk_tree.get_depth()
    
    # ------------补充节点父节点信息---------------------------
    parent = np.zeros(node_num).astype(int)
    parent[0] = -1
    branch_idx = np.where(children_left!=-1)[0]
    for i in branch_idx:
        parent[children_left[i]] = i   
        parent[children_right[i]]= i 
    #-------------存成字典-----------------------------------------    
    tree = {
        'children_left':children_left
        ,'children_right':children_right
        ,'feature':feature
        ,'threshold':threshold
        ,'impurity':impurity
        ,'n_node_samples':n_node_samples
        ,'value':value
        ,'depth':depth
        ,'n_sample':n_sample
        ,'node_num':node_num
        ,'parent':parent
        }
    return tree

将训练好的模型sk_tree传入以上函数,转化成字典,保存成文件。

2.预测函数

在生产时使用如下tree_predict 函数预测(其它语言类似以下逻辑)。

import numpy as np
def tree_predict(tree,x):
    node_idx = 0
    t = 0
    while(t<tree['depth']):
        if(x[tree['feature'][node_idx]]<=tree['threshold'][node_idx]):
            node_idx =   tree['children_left'][node_idx]
        else:
            node_idx =   tree['children_right'][node_idx]
        if(tree['children_left'][node_idx]==-1):
            value =tree['value'][node_idx][0]
            pred_class = np.argmax(value)
            pred_prob =  value/value.sum()
            return pred_class,pred_prob
        t =t+1

3.准确性测试

from sklearn.datasets import load_iris
from sklearn import tree
import numpy as np
from get_tree import get_tree
from tree_pred import tree_predict

#----------------数据准备----------------------------
iris = load_iris()                          # 加载数据
X = iris.data
y = iris.target
#---------------模型训练----------------------------------
clf = tree.DecisionTreeClassifier()               # sk-learn的决策树模型
clf = clf.fit(X, y)                        # 用数据训练树模型构建()
#--------------将树提取成简单的字典--------------------------------
tree = get_tree(clf)
#-------------------------
#将tree持久化到服务器,服务器中用tree_predict进行预测即可
#-------------------------

#------------测试函数的准确性-----------------------------
self_pred_y = np.zeros(len(y))
self_pred_prob = np.zeros((len(y),len(tree['value'][0][0])))
for i in range(X.shape[0]):
    pred_class,pred_prob = tree_predict(tree,X[i])
    self_pred_y[i] = pred_class
    self_pred_prob[i] = pred_prob
pred_y = clf.predict(X)
pred_prob = clf.predict_proba(X)
print("与sklearn预测结果差异个数(类别):",np.sum(pred_y != self_pred_y))
print("与sklearn预测结果差异个数(概率):",np.sum(pred_prob != self_pred_prob))

 测试结果:

与sklearn预测结果差异个数(类别): 0
与sklearn预测结果差异个数(概率): 0

相关文章

 《一个简单的决策树分类例子

sklearn决策树结果可视化

sklearn决策树参数详解

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 这是一个二进制编码的字符串,需要使用解码方法将其转化为中文。如果使用的是Python编程语言,可以使用decode()函数将其转化为可读的中文文本: b'\xe4\xbd\xbf\xe7\x94\xa8sklearn\xe7\x9a\x84\xe5\x86\xb3\xe7\xad\x96\xe6\xa0\x91\xe6\xa8\xa1\xe5\x9e\x8b\xe5\x88\xa4\xe6\x96\xad\xe6\x98\xaf\xe5\x90\xa6\xe6\x98\xaf\xe5\x9e\x83\xe5\x9c\xbe\xe9\x82\xae\xe4\xbb\xb6'.decode() 可以得到以下中文文本: 使用sklearn决策树模型判断是否是垃圾邮件。 ### 回答2: 随着互联网的普及,垃圾邮件的问题越来越严重。随着信息技术的进步,使用机器学习来识别垃圾邮件的任务变得相对容易。在这篇文章中,我们将讨论如何用sklearn决策树模型判断是否是垃圾邮件。 首先,我们需要搜集数据集。可以从网络上获取现有的垃圾邮件和非垃圾邮件样本数据集。在搜集完数据后,我们需要对数据进行预处理和分析,包括数据清理、数据整理和数据编码等。 接下来,利用python编程语言,使用sklearn库建立决策树分类器模型。首先,我们需要导入所需的库和数据集,并将数据集分为训练集和测试集。然后,我们需要对数据进行特征提取和特征选择,具体做法包括:对数据进行标准化处理,特征离散化和特征化简等等。最后,我们需要用训练集来训练模型,并用测试集来测试模型的准确性。 在模型训练完成后,我们需要对模型进行评估,包括计算模型的准确率、精确率和召回率等重要指标。如果模型的表现不好,则需要重新调整模型参数或者重新处理数据集,以提高模型的准确性和可靠性。 最后,我们可以使用模型来判断是否是垃圾邮件。当有新的邮件到达时,我们可以将邮件的相关特征送入模型中,模型将根据先前已经判断好的数据进行分类预测,并判断该邮件是否是垃圾邮件。如果是,则可以将邮件删除或者移动到垃圾箱中。如果不是,则可以将邮件保留在收件箱中。 总之,使用sklearn决策树模型判断是否是垃圾邮件,需要我们搜集数据集,进行数据预处理和分析,建立模型并进行训练评估,最后利用模型对新邮件进行分类预测。在实际应用过程中,还需适当调整模型参数和数据集,以提高模型的准确性和可靠性。 ### 回答3: 决策树是一种基于树形结构来进行决策的分类算法,它是一个基于特征选择的有监督学习算法。使用sklearn决策树模型判断是否是垃圾邮件的过程可以分为以下几个步骤: 1. 数据准备:收集代表邮件属性的样本数据集,并将其分为训练集和测试集。 2. 特征选择:根据统计学的标准,筛选出对邮件分类最具区分度的特征列表。例如:发件人、收件人、主题、内容、件信息等。 3. 模型训练:使用sklearn决策树模型,将筛选出的特征列表作为输入,并对训练数据集进行学习,从而生成一个分类模型。 4. 模型评估:在测试数据集上对分类模型进行验证,计算模型的准确性、精确度、召回率等指标。 5. 模型应用:将邮件的特征数据输入到分类模型中,根据模型输出的分类结果判断该邮件是否为垃圾邮件。 在决策树模型中,节点是样本分割的规则,每个节点代表一个特征。我们需要选择一个合适的特征进行分割,使得分割后的样本更容易被区分。每次从候选特征集合中选择一个最佳特征进行分裂,使得分割后的数据集更具纯度或信息增益更大。 在分类过程中,我们需要根据分类模型输出的信息,对邮件进行分类。如果分类结果是垃圾邮件,则可以进行删除或移动到垃圾邮件箱。如果分类结果是正常邮件,则可以进行分类存档或转发等操作。 总之,使用sklearn决策树模型判断是否是垃圾邮件,是一种快捷有效的分类方法,可以通过不断优化特征选择和模型调整等方法,进一步提高分类模型的准确性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值