• 决策树(python)


    目录

    一、分类决策树

    1.决策树的划分依据

    2.剪枝(对付"过拟合"的主要⼿段)

    3.案例(泰坦尼克号乘客⽣存预测) 

    4.利弊

     二、回归决策树


    决策树思想的来源⾮常朴素,程序设计中的条件分⽀结构就是if-else结构。

    一、分类决策树

    1.决策树的划分依据

    信息增益

    信息增益率

    基尼值和基尼指数

    2.剪枝(对付"过拟合"的主要⼿段)

            在决策树学习中,为了尽可能正确分类训练样本,结点划分过程将不断重复,有时会造成决策树分⽀过多,这时就可能 因训练样本学得"太好"了,以致于把训练集⾃身的⼀些特点当作所有数据都具有的⼀般性质⽽导致过拟合。因此,可通 过主动去掉⼀些分⽀来降低过拟合的⻛险。

    可以通过限制内部节点再划分所需最⼩样本数和决策树最⼤深度来达到剪枝的目的

    3.案例(泰坦尼克号乘客⽣存预测) 

    1. import pandas as pd
    2. import numpy as np
    3. from sklearn.feature_extraction import DictVectorizer
    4. from sklearn.model_selection import train_test_split
    5. from sklearn.tree import DecisionTreeClassifier, export_graphviz
    6. #1.获取数据
    7. data = pd.read_csv("F:/数学建模/机器学习/数据/data.csv")
    8. # print(data)
    9. # print(data.describe())
    10. #2.数据基本处理
    11. #2.1确定的特征值和目标值
    12. data_x=data[["Pclass","Age","Sex"]]
    13. data_y=data["Survived"]
    14. # print(data_x)
    15. # print(data_y)
    16. # 2.2确实值得处理
    17. data_x['Age'].fillna(data_x['Age'].mean(), inplace=True) #取平均值处理
    18. # 2.3 数据集划分
    19. x_train,x_test,y_train,y_test=train_test_split(data_x,data_y,random_state=22)
    20. # 3.特征⼯程(字典特征抽取)特征中出现类别符号,需要进⾏one-hot编码处理(DictVectorizer)
    21. transfer=DictVectorizer(sparse=False)
    22. print(x_train.to_dict(orient="records"))
    23. x_train = transfer.fit_transform(x_train.to_dict(orient="records")) #转化为字典类型x_train.to_dict(orient="records")
    24. x_test = transfer.fit_transform(x_test.to_dict(orient="records"))
    25. # 4.决策树模型训练和模型评估
    26. estimator=DecisionTreeClassifier()
    27. estimator.fit(x_train, y_train)
    28. # 4.2评估
    29. print(estimator.score(x_test, y_test))
    30. print(estimator.predict(x_test))
    31. export_graphviz(estimator, out_file="D:/迅雷下载/demo/machineLearnCode/decisionTreeTest/tree.dot", feature_names=['Age', 'Pclass', '⼥性', '男性'])

     决策树的图:

    打开cmd到first.dot目录下,运行:
    dot -Tpng first.dot -o first.png
    可以得到画好的图形。
    解释:dot表示使用的是dot布局,其他布局相应的修改即可,-T表示格式,即画成png格式,-o表示重命名为first.png。

     samples属性统计出它应用于多少个训练样本实例

    value属性告诉你这个节点对于每一个类别的样例有多少个

    4.利弊

    优点:简单的理解和解释,树⽊可视化。 

    缺点 决策树学习者可以创建不能很好地推⼴数据的过于复杂的树,容易发⽣过拟合。 

    改进: 减枝cart算法

                随机森林(集成学习的⼀种) 

     二、回归决策树

    案例

     

    1. from cProfile import label
    2. import numpy as np
    3. import matplotlib.pyplot as plt
    4. from sklearn.tree import DecisionTreeRegressor
    5. from sklearn.linear_model import LinearRegression
    6. from sympy import plot
    7. # ⽣成数据
    8. x=np.array(list(range(1,11))).reshape(-1,1) #列表转换为矩阵
    9. # print(x)
    10. y = np.array([5.56, 5.70, 5.91, 6.40, 6.80, 7.05, 8.90, 8.70, 9.00, 9.05])
    11. # 训练模型
    12. m1=DecisionTreeRegressor(max_depth=1)
    13. m2=DecisionTreeRegressor(max_depth=3)
    14. m3=LinearRegression()
    15. m1.fit(x,y)
    16. m2.fit(x,y)
    17. m3.fit(x,y)
    18. # 模型预测
    19. x_test=np.arange(0,10,0.01).reshape(-1,1)
    20. # print(x_test)
    21. y1=m1.predict(x_test)
    22. y2=m2.predict(x_test)
    23. y3=m3.predict(x_test)
    24. #显示
    25. # matplotlib.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
    26. # # 为了坐标轴负号正常显示。matplotlib默认不支持中文,设置中文字体后,负号会显示异常。需要手动将坐标轴负号设为False才能正常显示负号。
    27. # matplotlib.rcParams['axes.unicode_minus'] = False
    28. plt.rcParams['font.sans-serif'] = ['SimHei'] # 显示中文
    29. plt.rcParams['axes.unicode_minus'] = False
    30. plt.figure(figsize=(10,6),dpi=100)
    31. plt.scatter(x,y,label="数据")
    32. plt.plot(x_test,y1,label="max_depth=1")
    33. plt.plot(x_test,y2,label="max_depth=3")
    34. plt.plot(x_test,y3,label="LinearRegression")
    35. plt.xlabel("数据")
    36. plt.ylabel("预测值")
    37. plt.legend()
    38. plt.show()

     

  • 相关阅读:
    springcloud新闻发布系统源码
    MySQL高手炼成记:29+超实用监控与优化技巧,你的数据库够快吗?
    SpringBoot日志使用、记录日志文件
    go小知识2
    Prometheus 监测 RocketMQ 最佳实践
    SGI STL 二级空间配置源码刨析
    Allegro怎样标识尺寸?
    java动态代理
    PaddleMIX学习笔记(1)
    自动驾驶——为什么需要仿真?
  • 原文地址:https://blog.csdn.net/herry57/article/details/125431770