机器学习--sklearn之决策树(分类+回归)
发布日期:2021-05-06 23:42:46 浏览次数:26 分类:精选文章

本文共 2935 字,大约阅读时间需要 9 分钟。

决策树的详细解释

1. 什么是决策树?

决策树是一种机器学习算法,用于对分类和回归问题进行预测。它通过层次化的分割,将数据划分为不同的子集,最终形成树状结构。每个节点代表一个特征或属性,分支则代表特征的取值,叶子节点则是最终的分类结果或预测值。

2. 决策树的基本结构

决策树可以看作一个不断分叉的树,其中:

  • 根节点:起始节点,没有任何条件判断。
  • 内部节点:代表一个特征或属性,具有若干分支。
  • 叶子节点:没有进一步的分割,直接给出分类结果。

3. 确定节点的标准

选择根节点和后续节点的关键在于信息增益和信息增益率。

  • 熵(Entropy):衡量数据的混乱度,用于计算信息增益。熵越高,数据越不纯。
  • 信息增益率(Gain):综合考虑熵和当前节点的纯度,衡量分裂特征带来的信息增益。
  • Gini系数:衡量特征的分裂效果,用于CART算法,既用于分类也用于回归。

4. 构建决策树的步骤

  • 选择根节点:计算每个特征的信息增益率,选择增益率最高的特征作为根节点。
  • 递归分割:从根节点开始,递归地选择下一个最优特征进行分割,直到无法再分割为止。
  • 叶子节点的分类:叶子节点直接给出最终的分类结果。
  • 5. 决策树的优化方法

    • 预剪枝:限制树的深度或节点的样本数量,防止过拟合。
    • 后剪枝:通过调整评价函数,控制叶子节点的数量,防止过拟合。

    6. Python实现决策树

    在Python中,可以使用scikit-learn中的DecisionTreeClassifierDecisionTreeRegressor来实现决策树模型。

    • 导入库
      from sklearn import tree
      from sklearn.datasets import load_wine
      from sklearn.model_selection import train_test_split
      import pandas as pd
      import graphviz
    • 读取数据
      wine = load_wine()
      print(wine.data.shape)
      print(wine.target)
      pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1)
    • 划分训练集和测试集
      Xtrain, Xtest, Ytrain, Ytest = train_test_split(wine.data, wine.target, test_size=0.3)
      print(Xtrain.shape)
      print(Xtest.shape)
      print(Ytrain.shape)
      print(Ytest.shape)
    • 建立模型
      clf = tree.DecisionTreeClassifier(criterion="entropy", random_state=30, splitter="random", max_depth=3, min_samples_leaf=10, min_samples_split=10)
      clf.fit(Xtrain, Ytrain)
      score = clf.score(Xtest, Ytest)
      print(score)
    • 可视化决策树
      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)
    • 特征重要性
      [*zip(feature_name, clf.feature_importances_)]
    • 剪枝验证
      test = []
      for i in range(10):
      clf = tree.DecisionTreeClassifier(max_depth=i+1, criterion="entropy", random_state=30, splitter="random")
      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()

    7. CART回归树实现

    对于回归问题,可以使用DecisionTreeRegressor

    • 导入库
      from sklearn.tree import DecisionTreeRegressor
      from sklearn import linear_model
    • 读取数据可视化结果
      ex0 = pd.read_table('ex0.txt',header=None)
      ex0.describe()
      plt.scatter(ex0.iloc[:,1].values, ex0.iloc[:,-1].values)
      x = (ex0.iloc[:, 1].values).reshape(-1,1)
      y = (ex0.iloc[:,-1].values).reshape(-1,1)
      X_test = np.arange(0, 1, 0.01)[:1000, np.newaxis]
      print(X_test.shape)
      y_1 = model1.predict(X_test)
      y_2 = model2.predict(X_test)
      y_3 = model3.predict(X_test)
      plt.figure()
      plt.scatter(x, y, s=20, edgecolor="black",c="darkorange", label="data")
      plt.plot(X_test, y_1, color="cornflowerblue",label="max_depth=1", linewidth=2)
      plt.plot(X_test, y_2, color="yellowgreen", label="max_depth=3", linewidth=2)
      plt.plot(X_test, y_3, color='red', label='liner regression', linewidth=2)
      plt.xlabel("data")
      plt.ylabel("target")
      plt.title("Decision Tree Regression")
      plt.legend()
      plt.show()

    通过以上步骤,可以实现决策树的训练、可视化和优化,适用于分类和回归任务。

    上一篇:机器学习--sklearn之朴素贝叶斯分类
    下一篇:凸函数优化之对偶理论

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年04月11日 21时57分52秒

    关于作者

        喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
    -- 愿君每日到此一游!

    推荐文章