机器学习之鸢尾花-决策树

2022-03-11 15:05:57 浏览数 (1)

Decision Trees (DTs) 是一种用来 classification 和 regression 的无参监督学习方法。其目的是创建一种模型从数据特征中学习简单的决策规则来预测一个目标变量的值。

决策树的优势:

便于理解和解释。树的结构可以可视化出来。

训练需要的数据少。其他机器学习模型通常需要数据规范化,比如构建虚拟变量和移除缺失值,不过请注意,这种模型不支持缺失值。

由于训练决策树的数据点的数量导致了决策树的使用开销呈指数分布(训练树模型的时间复杂度是参与训练数据点的对数值)。

能够处理数值型数据和分类数据。其他的技术通常只能用来专门分析某一种变量类型的数据集。详情请参阅算法。

能够处理多路输出的问题。

使用白盒模型。如果某种给定的情况在该模型中是可以观察的,那么就可以轻易的通过布尔逻辑来解释这种情况。相比之下,在黑盒模型中的结果就是很难说明清 楚地。

可以通过数值统计测试来验证该模型。这对事解释验证该模型的可靠性成为可能。

即使该模型假设的结果与真实模型所提供的数据有些违反,其表现依旧良好。

决策树的缺点包括:

决策树模型容易产生一个过于复杂的模型,这样的模型对数据的泛化性能会很差。这就是所谓的过拟合.一些策略像剪枝、设置叶节点所需的最小样本数或设置数的最大深度是避免出现 该问题最为有效地方法。

决策树可能是不稳定的,因为数据中的微小变化可能会导致完全不同的树生成。这个问题可以通过决策树的集成来得到缓解

在多方面性能最优和简单化概念的要求下,学习一棵最优决策树通常是一个NP难问题。因此,实际的决策树学习算法是基于启发式算法,例如在每个节点进 行局部最优决策的贪心算法。这样的算法不能保证返回全局最优决策树。这个问题可以通过集成学习来训练多棵决策树来缓解,这多棵决策树一般通过对特征和样本有放回的随机采样来生成。

有些概念很难被决策树学习到,因为决策树很难清楚的表述这些概念。例如XOR,奇偶或者复用器的问题。

如果某些类在问题中占主导地位会使得创建的决策树有偏差。因此,我们建议在拟合前先对数据集进行平衡。

如下:

代码语言:javascript复制
from sklearn import tree
def test_tree(X_train, X_test, y_train, y_test,X,y):
    clf=tree.DecisionTreeClassifier(max_depth=3)
    clf.fit(X_train,y_train)
    score= accuracy_score(clf.predict(X_test), y_test)
    print('DecisionTreeClassifier score = {}'.format(score))
    # DecisionTreeClassifier score = 0.9777777777777777
    import pydotplus
    dot_data = tree.export_graphviz(clf, out_file=None,
                                            feature_names=iris.feature_names,
                                            class_names=iris.target_names,
                                            filled=True, rounded=True,
                                            special_characters=True)

    graph = pydotplus.graph_from_dot_data(dot_data)
    graph.write_pdf("iris.pdf")
代码语言:javascript复制
    # class sklearn.tree.DecisionTreeClassifier(criterion='gini', splitter='best', max_depth=None, min_samples_split=2,
    # min_samples_leaf=1, min_weight_fraction_leaf=0.0, max_features=None, random_state=None,
    # max_leaf_nodes=None, min_impurity_decrease=0.0,
    # min_impurity_split=None, class_weight=None, presort='deprecated', ccp_alpha=0.0)[source]
    tuned_parameters = [{'criterion':['gini','entropy'],
                         'splitter':["best", "random"],
                         'max_depth':[2,3,4,5]}]
    td = tree.DecisionTreeClassifier()
    model = GridSearchCV(td, param_grid=tuned_parameters, n_jobs=-1, verbose=2, scoring='accuracy')
    model.fit(X_train, y_train)
    print('网格搜索-度量记录:', model.cv_results_)  # 包含每次训练的相关信息
    print('网格搜索-最佳度量值:', model.best_score_)  # 获取最佳度量值
    # 网格搜索-最佳度量值: 0.9619047619047618
    print('网格搜索-最佳参数:', model.best_params_)  # 获取最佳度量值时的代定参数的值。是一个字典
    # 网格搜索-最佳参数: {'criterion': 'entropy', 'max_depth': 3, 'splitter': 'random'}
    print('网格搜索-最佳模型:', model.best_estimator_)  # 获取最佳度量时的分类器模型

    h = 0.02
    X = X[:, :2]

    x_min, x_max = X[:, 0].min() - .5, X[:, 0].max()   .5
    y_min, y_max = X[:, 1].min() - .5, X[:, 1].max()   .5
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))

    cmap_bold = ListedColormap(['#AAAAFF', '#AAFFAA', '#FFAAAA'])  # 给不同区域赋以颜色
    cmap_light = ListedColormap(['#FF0000', '#00FF00', '#0000FF'])  # 给不同属性的点赋以颜色
    clf=tree.DecisionTreeClassifier(criterion= 'entropy', max_depth= 3,splitter= 'random')
    clf.fit(X[:,:2], y)
    # score = clf.score(X_test, y_test)
    # print('模型名称:{},得分={}'.format('tree', score))
    # 模型名称:tree,得分=0.7333333333333333
    Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)

    ax = plt.subplot()
    ax.contourf(xx, yy, Z, cmap=cmap_bold, alpha=.6)
    # plt.pcolormesh(xx, yy, Z, cmap=cmap_bold, alpha=.6)
    # Plot the training points
    # ax.scatter(X_train[:, 0], X_train[:, 1], c=y_train, cmap=cmap_light, edgecolors='k')
    # Plot the testing points
    # ax.scatter(X_test[:, 0], X_test[:, 1], c=y_test, cmap=cmap_light, edgecolors='k', alpha=0.6)
    ax.scatter(X[:, 0], X[:, 1], c=y, cmap=cmap_light, edgecolors='k')
    ax.set_xlim(xx.min(), xx.max())
    ax.set_ylim(yy.min(), yy.max())
    ax.set_xticks(())
    ax.set_yticks(())
    ax.set_title('tree')
    # ax.text(xx.max() - .3, yy.min()   .3, ('%.2f' % score).lstrip('0'), size=15, horizontalalignment='right')
    plt.show()
if __name__=='__main__':
    X_train,X_test,y_train,y_test,X,y=load_data(iris)
    # ---------------------K近邻算法-----------------------
    # ------------------朴素贝叶斯-----------------------
    # ---------------------决策树-----------------------
    test_tree(X_train, X_test, y_train, y_test, X, y)
    # ---------------------K Means聚类-----------------------

    # ------------------高斯混合模型聚类-----------------------

    # -------------------SVM支撑向量机-----------------------

0 人点赞