sklearn 使用 id3 算法训练决策树

     2023-03-12     183

关键词:

【中文标题】sklearn 使用 id3 算法训练决策树【英文标题】:Training a decision tree using id3 algorithm by sklearn 【发布时间】:2018-07-07 04:15:24 【问题描述】:

我正在尝试使用 id3 算法训练决策树。 目的是获取所选特征的索引,估计出现率,并建立一个总混淆矩阵。

算法应将数据集拆分为训练集和测试集,并使用 4 折交叉验证。

我是这个主题的新手,我已经阅读了关于 sklearn 的教程和关于学习过程的理论,但我仍然很困惑。

我尝试过的操作:

from sklearn.model_selection import cross_val_predict,KFold,cross_val_score, 
train_test_split, learning_curve
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import confusion_matrix


X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=1)
clf = DecisionTreeClassifier(criterion='entropy', random_state=0)
clf.fit(X_train,y_train)
results = cross_val_score(estimator=clf, X=X_train, y=y_train, cv=4)
print("Accuracy: %0.2f (+/- %0.2f)" % (results.mean(), results.std()))
y_pred = cross_val_predict(estimator=clf, X=x, y=y, cv=4)
conf_mat = confusion_matrix(y,y_pred)
print(conf_mat)
dot_data = tree.export_graphviz(clf, out_file='tree.dot') 

我有一些问题:

    如何获取训练中使用的特征索引列表?我必须穿过 clf 中的树吗?找不到任何 api 方法来检索它们。

    我必须使用“fit”、“cross_val_score”和“cross_val_predict”吗?似乎他们所有人都进行了某种学习过程,但我无法仅从其中一个人那里获得 clf 拟合、准确性和混淆矩阵。

    我是否必须使用测试集进行估计或数据集折叠的分区?

【问题讨论】:

【参考方案1】:

    要检索训练过程中使用的特征列表,您可以通过以下方式从 x 中获取列:

    feature_list = x.columns

    如您所知,并非每个特征都可用于预测。你可以看到,在训练模型之后,使用

    clf.feature_importances_

    feature_list 中特征的索引与 feature_importances 列表中的相同。

    如果您使用交叉验证,则无法立即检索分数。 cross_val_score 达成了交易,但获得分数的更好方法是使用 cross_validate。它的工作方式与 cross_val_score 相同,但您可以检索更多分数值,只需使用 make_score 创建所需的每个分数并传递它,这里是一个示例:

    from sklearn.model_selection import train_test_split,  cross_validate
    from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, f1_score, precision_score, make_scorer, recall_score 
    import pandas as pd, numpy as np       
    
    x_train, x_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
    dtc = DecisionTreeClassifier()
    dtc_fit = dtc.fit(x_train, y_train)
    
    def tn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 0]
    def fp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 1]
    def fn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 0]
    def tp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 1]
    
    scoring = 
        'tp' : make_scorer(tp), 
        'tn' : make_scorer(tn), 
        'fp' : make_scorer(fp), 
        'fn' : make_scorer(fn), 
        'accuracy' : make_scorer(accuracy_score),
        'precision': make_scorer(precision_score),
        'f1_score' : make_scorer(f1_score),
        'recall'   : make_scorer(recall_score)
    
    
    sc = cross_validate(dtc_fit, x_train, y_train, cv=5, scoring=scoring)
    
    print("Accuracy: %0.2f (+/- %0.2f)" % (sc['test_accuracy'].mean(), sc['test_accuracy'].std() * 2))
    print("Precision: %0.2f (+/- %0.2f)" % (sc['test_precision'].mean(), sc['test_precision'].std() * 2))
    print("f1_score: %0.2f (+/- %0.2f)" % (sc['test_f1_score'].mean(), sc['test_f1_score'].std() * 2))
    print("Recall: %0.2f (+/- %0.2f)" % (sc['test_recall'].mean(), sc['test_recall'].std() * 2), "\n")
    
    stp = math.ceil(sc['test_tp'].mean())
    stn = math.ceil(sc['test_tn'].mean())
    sfp = math.ceil(sc['test_fp'].mean())
    sfn = math.ceil(sc['test_fn'].mean())
    
    confusion_matrix = pd.DataFrame(
        [[stn, sfp], [sfn, stp]],
        columns=['Predicted 0', 'Predicted 1'],
        index=['True 0', 'True 1']
    )
    print(conf_m)
    

    当您使用 cross_val 函数时,函数本身会为测试和训练创建折叠。如果您想管理训练折叠和测试折叠,您可以使用 K_Fold 类自己完成。 如果您需要保持班级平衡,总是需要通过 DecisionTreeClassifier 获得良好的评分,则必须使用 StratifiedKFold。如果要随机打乱折叠中包含的值,可以使用 StratifiedShuffleSplit。举个例子:

    from sklearn.tree import DecisionTreeClassifier
    from sklearn.model_selection import StratifiedShuffleSplit
    from sklearn.metrics import classification_report, confusion_matrix, accuracy_score, f1_score, precision_score, make_scorer, recall_score
    import pandas as pd, numpy as np
    
    precision = []; recall = []; f1score = []; accuracy = []
    
    sss = StratifiedShuffleSplit(n_splits=10, test_size=0.2)    
    dtc = DecisionTreeClassifier()
    
    for train_index, test_index in sss.split(X, y):
        X_train, X_test = X.iloc[train_index], X.iloc[test_index]
        y_train, y_test = y.iloc[train_index], y.iloc[test_index]
    
        dtc.fit(X_train, y_train)
        pred = dtc.predict(X_test)
    
        precision.append(precision_score(y_test, pred))
        recall.append(recall_score(y_test, pred))
        f1score.append(f1_score(y_test, pred))
        accuracy.append(accuracy_score(y_test, pred))   
    
    print("Accuracy: %0.2f (+/- %0.2f)" % (np.mean(accuracy),np.std(accuracy) * 2))
    print("Precision: %0.2f (+/- %0.2f)" % (np.mean(precision),np.std(precision) * 2))
    print("f1_score: %0.2f (+/- %0.2f)" % (np.mean(f1score),np.std(f1score) * 2))
    print("Recall: %0.2f (+/- %0.2f)" % (np.mean(recall),np.std(recall) * 2))
    

我希望我已经回答了你需要的一切!

【讨论】:

非常感谢! 1.我的意思是在结果中获得选择的特征,所以我假设我可以使用 feature_importances_ 吗? 2.如果我使用“accurancy”参数进行评分,它如何改变算法?我是否必须提供一个评分函数来使用那里的熵来实现 gainInfo 以使其成为“id3”? 3. cross_validate 是否保持类平衡? 1.你是对的。只看feature_importances_,您可以选择预测中最重要的特征,以降低预测模型的复杂性(此步骤也称为特征选择) 2. 当您评估模型时,您不会'不仅要使用准确率,还要使用准确率、召回率和其他分数。这个分数可以改变你的特征选择过程 3. cross_validate 支持类平衡。使用我发布的解决方案,您也可以检索自己的混淆矩阵。很快,我已经向您展示了 cross_validate 在这一点上的工作原理 你是用pandas做pd的吗?我收到一个错误“AttributeError:模块'pandas'没有属性'DataFrame'” 帮了大忙,谢谢,还有一个问题——你说准确率、召回率和其他分数与学习过程有关,那为什么要在拟合之后才选择它们呢?它们是否仍然与 id3 相关? 是的,我使用 pandas 作为 pd,抱歉我忘了包含它。无论如何,在验证步骤之后测量精度、召回率和其他分数。这些在每个预测模型中都是相关的,例如 ID3。某些模型,例如 DecitionTree,会受到过度拟合 (en.wikipedia.org/wiki/Overfitting) 的影响。精度为 0.99 的模型可能过拟合。只看分数就可以看到这些东西

人工智能机器学习之用python使用id3算法实例及使用sklearn的决策树算法对葡萄酒数据集进行分类

查看详情

id3算法实现的决策树生成

代码地址https://coding.net/u/mich/p/easytry/git/tree/master/src/com/ml目录结构decision目录下主要为决策树的相关接口及entity,id3目录下为实现类以及相关测试测试测试训练数据 训练结果 解释一下,如下图  测试数据测试结果&n... 查看详情

机器学习:决策树——sklearn决策树调参

参数解析参数DecisionTreeClassifierDecisionTreeRegressor特征选择标准criterion可以使用"gini"或者"entropy",前者代表基尼系数,后者代表信息增益。一般说使用默认的基尼系数"gini"就可以了,即CART算法。除非你更喜欢类似ID3,C4.5的最优特征... 查看详情

决策树--id3算法小结

...是越是小型的决策树越优于大的决策树。算法归纳:1、使用所有没有使用的属性并计算与之相关的样本熵值;2、选取其中熵值最小的属性3、生成包含该属性的节点4、使用新的分支表继续前面步骤 ID3算法以信息论为基础,... 查看详情

python中的sklearn中决策树使用的是哪一种算法

...先要弄懂决策树三大流行算法ID3、C4.5和CART的原理,以及sklearn框架下DecisionTreeClassifier的帮助文档。3个算法的主要区别在于度量信息方法、选择节点特征还有分支数量的不同。ID3,采用熵(entropy)来度量信息不确定度,选择“信... 查看详情

我们可以选择在 sklearn 中使用啥决策树算法吗?

】我们可以选择在sklearn中使用啥决策树算法吗?【英文标题】:CanwechoosewhatDecisionTreealgorithmtouseinsklearn?我们可以选择在sklearn中使用什么决策树算法吗?【发布时间】:2016-03-1718:02:09【问题描述】:我的问题是我们可以选择在skle... 查看详情

决策树——id3算法

前言我们在使用数据挖掘的时候,完成数据的“清洗”等一系列繁琐的步骤,就可以对数据进一步地进行“挖掘”——对数据进行分类的建立、预测、聚类分析等等的操作。在分类和预测的过程中,有一系列的算法得... 查看详情

5-3决策树id3决策树的生成算法(代码片段)

ID3算法在决策树各个结点上应该信息增益准则选择特征,递归地构建决策树输入训练数据集D特征集A阈值ϵ\\epsilonϵ输出决策树T过程若D中所有实例属于同一类CkC_kCk​,则T为单结点树,并将类,则T为单结点树,... 查看详情

人工智能机器学习之使用python生成id3决策树

❤❤❤ID3算法✅✅决策树的思想:给定一个集合,其中的每个样本由若干属性表示,决策树通过贪心的策略不断挑选最优的属性。常见的决策树算法有ID3,C4.5,CART算法等。 查看详情

sklearn:无法用大数据框训练决策树

】sklearn:无法用大数据框训练决策树【英文标题】:sk-learn:cannottraindecisiontreewithbigdataframes【发布时间】:2015-06-2710:15:08【问题描述】:我正在使用Python和sk-learn进行我的第一个项目。在项目中,我必须根据可用数据进行预测。... 查看详情

决策树算法cart和c4.5决策树有啥区别?各用于啥领域?

...进行处理,利用归纳算法生成可读的规则和决策树,然后使用决策对新数据进行分析。本质上决策树是通过一系列规则对数据进行分类的过程。3、决策树算法构造决策树来发现数据中蕴涵的分类规则.如何构造精度高、规模小... 查看详情

大数据项目8(sklearn决策树)

决策树一、了解什么是决策树二、决策树模型三、决策树-信息增益四、信息增益比五、ID3算法六、决策树的剪枝一、了解什么是决策树分类分类树:分类标签值(天气?是否垃圾网页?)定性决策树:定... 查看详情

机器学习-决策树(代码片段)

...以代码实现为主以及一些代码的说明。这次代码还是使用sklearn的的数据吧,以iris花为列子。#第三天决策树fromsklearnimporttreefromsklearn.datasetsimportload_irisfromsklearn.metricsimportclassification_report,confusion_matrixfromsklearn.model_selectionimporttrain_t... 查看详情

再探决策树算法之利用sklearn进行决策树实战

sklearn模块提供了决策树的解决方案,不用自己去造轮子了(不会造,感觉略复杂):下面是笔记:Sklearn.tree参数介绍及使用建议参数介绍及使用建议官网:http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.htmlclasss... 查看详情

决策树算法常见问题(面试相关)

...支持支持支持剪枝不支持支持支持3.决策树算法的优缺点sklearn决策树优点:是一种白盒模型,易于理解和解释,支持可视化;。几乎不需要预处理;计算成本低。使用树(即预测数据)的成本与用于训... 查看详情

python使用id3算法实现决策树

依然是学习《统计学习方法》一书所做的简单实验,写代码的过程参考了大量其他的博客,本人在此深表感谢。代码实现的依然是书上的例子:importnumpyasnpimportmathimportoperatordefCreateDataSet():dataset=[[1,0,0,0,'no'],[1... 查看详情

id3决策树分析

  1简述1.1   id3是一种基于决策树的分类算法,由J.RossQuinlan在1986年开发。id3根据信息增益,运用自顶向下的贪心策略建立决策树。信息增益用于度量某个属性对样本集合分类的好坏程度。由于采用了信息增益,id3算... 查看详情

实验四决策树算法及应用(代码片段)

...现熵、经验条件熵、信息增益等方法。实现ID3算法。熟悉sklearn库中的决策树算法;针对i 查看详情