DecisionTreeClassifier重要参数、属性、接口(实现一棵树,随机性参数)

    技术2022-07-11  96

     

    DecisionTreeClassifier重要参数

    1.criterion

    要将表格转化成一颗树,决策树需要找出最佳节点和最佳的分枝方法,对分类树来说,衡量这个“最佳”指标“叫做不纯度

    criterion这个参数正是用来决定不纯度的计算方法。sklearn提供了两种选择: 1)输入”entropy“,使用信息熵 2)输入”gini“,使用基尼系数 决策树的基本流程: 直到没有更多的特征可用,或整体的不纯度已经最优,决策树就会停止生长。   建立一颗树   #######实现一棵树,随机性参数,导入需要用到的模块库 from sklearn import tree from sklearn.datasets import load_wine # 自带的各种数据 from sklearn.model_selection import train_test_split # 2.观察数据的形式 wine = load_wine() # 数据实例化 # 特征列 wine.data wine.data.shape # 查看结构 # 标签列 wine.target import pandas as pd pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1) # 将两部分变成一个表 # 3.分训练集和测试集 Xtrain,Xtest,Ytrain,Ytest = train_test_split(wine.data,wine.target,test_size = 0.3) # 百分之三十做测试集,百分之七十做训练集 # 4.建立模型 clf = tree.DecisionTreeClassifier(criterion = 'entropy') # 实例化参数 clf = clf.fit(Xtrain,Ytrain) # 用训练集数据做训练模型 score = clf.score(Xtest,Ytest) # 导入测试集,返回预测准确度accuracy score # 查看预测准确度 ############5.画一颗树 import graphviz feature_name = ['酒精','苹果酸','灰','灰的碱性','镁','总酚','类黄酮','非黄烷类酚类','花青素','颜色强度','色调','od280/od315稀释葡萄酒','脯氨酸'] # 定义决策树要画的树 dot_data = tree.export_graphviz(clf,feature_names = feature_name,class_names = ['琴酒','雪莉','贝尔摩德'],filled = True,rounded = True) graph = graphviz.Source(dot_data) graph # 6.探索决策树 # 特征重要性 clf.feature_importances_ [*zip(feature_name,clf.feature_importances_)] # 将定义的特征名与特征值连起来观察

    第5步已经生成一棵决策树

    2、random_state & splitter

    # random_state & splitter clf = tree.DecisionTreeClassifier(criterion="entropy" ,random_state=30 # 用来设置分枝中的随机模式的参数 # ,splitter="random" # 用控制决策树中的随机选项,如果加上之后准确率反而降低,可以注掉 ) clf = clf.fit(Xtrain, Ytrain) score = clf.score(Xtest, Ytest) score

    可以得到准确度,然后画出一棵树

    import graphviz dot_data = tree.export_graphviz(clf ,feature_names= feature_name ,class_names=["琴酒","雪莉","贝尔摩德"] ,filled=True ,rounded=True ) graph = graphviz.Source(dot_data) graph

    此时画出的时,随机性更高,根据对random_state参数的设置,也可以解决每次画出的树都不是同一棵树的问题了。

    3、剪枝参数

    在不加限制的情况下,一棵决策树会生长到衡量不纯度的指标最优,或者没有更多的特征可用为止。这样的决策树 往往会过拟合,这就是说, 它会在训练集上表现很好,在测试集上却表现糟糕。 我们收集的样本数据不可能和整体 的状况完全一致,因此当一棵决策树对训练数据有了过于优秀的解释性,它找出的规则必然包含了训练样本中的噪 声,并使它对未知数据的拟合程度不足。 #我们的树对训练集的拟合程度如何? score_train = clf.score(Xtrain, Ytrain) score_train max_depth 限制树的最大深度,超过设定深度的树枝全部剪掉 min_samples_leaf &min_samples_split min_samples_leaf 限定,一个节点在分枝后的每个子节点都必须包含至少 min_samples_leaf 个训练样本,否则分 枝就不会发生,或者,分枝会朝着满足每个子节点都包含 min_samples_leaf 个样本的方向去发生 min_samples_split 限定,一个节点必须要包含至少 min_samples_split 个训练样本,这个节点才允许被分枝,否则 分枝就不会发生。 max_features & min_impurity_decrease 一般 max_depth 使用,用作树的 精修 如何确定最优的剪枝参数? # 观察一个最优的剪枝参数 import matplotlib.pyplot as plt test = [] for i in range(10):     clf = tree.DecisionTreeClassifier(criterion="entropy"                                   ,random_state=30 # 输入任意一个整数,都会让树稳定下来                                   ,splitter="random"                                   ,max_depth=3 #                                  ,min_samples_leaf=10 # 用来显示分支之后的叶子节点的最少个数,如果加上之后精度降低,则注掉                                   ,min_samples_split=10 # 一个节点至少含有的节点个数,才允许被分支,如果加上之后精度降低,则注掉                                  )     clf = clf.fit(Xtrain,Ytrain)     score = clf.score(Xtest,Ytest)     test.append(score) plt.plot(range(1,11),test,color='red',label ='max_depth') plt.legend() plt.show() ## 既达到测试集的拟合程度最高,又达到了节省计算空间 4、目标权重参数 class_weight & min_weight_fraction_leaf 完成样本标签平衡的参数。 使用 class_weight 参数对样本标签进行一定的均衡,给 少量的标签更多的权重,让模型更偏向少数类,向捕获少数类的方向建模。该参数默认 None ,此模式表示自动给与数据集中的所有标签相同的权重。 有了权重之后,样本量就不再是单纯地记录数目,而是受输入的权重影响了,因此这时候剪枝,就需要搭配 min_ weight_fraction_leaf 这个基于权重的剪枝参数来使用。     重要接口: 决策树最常用的接口包括 fit、score、apply、predict #  apply 用来返回每个测试样本所在的叶子节点的索引 clf.apply(Xtest) # predict 用来返回每个测试样本的分类/回归结果 clf.predict(Xtest) 所有接口中要求输入 X_train X_test 的部分,输入的特征矩阵必须至少是一个二维矩阵。 sklearn 不接受任何一维矩阵作为特征矩阵被输入。 如果你的数据的确只有一个特征,那必须用 reshape(-1,1) 来给 矩阵增维;如果你的数据只有一个特征和一个样本,使用reshape(1,-1) 来给你的数据增维。   属性: 属性是在模型训练之后,能够调用查看的模型的各种性质。对决策树来说,最重要的是 feature_importances_ ,能 够查看各个特征对模型的重要性。 (根据菜菜的机器学习整理)
    Processed: 0.022, SQL: 9