欢迎访问369期货网 369会员登录 注册

当前位置: 主页 > 期货量化

量化交易实战18 - 因子与决策树和随机森林(一)决策树和随机森林的概念

时间:2025-10-14 15:27|来源:369期货网|作者:369期货网|点击:
前面西西和朋友们一起探讨了机器学习中的线性模型,聪明的朋友就发现了--当样本特征与目标没有显著的线性关系的时候,线性模型就显得很不行,当然,聪明的量化先驱者们探索出了许多非线性模型,其中最常用的算法就是决策树

所以我们接下来就要了解一下决策树和随机森林的理论,已经知道的朋友们可以跳过直接看下一章,也欢迎指正。
温馨提示:仅供理解,思路可以用于实盘,但是不可直接用于实盘。



非线性模型的数据
输入代码如下:
    # 导入决策树回归器和其他必要库from sklearn.tree import DecisionTreeRegressorfrom sklearn.datasets import make_regression        # 注意下划线import matplotlib.pyplot as pltimport numpy as npimport pandas as pd# 生成一个回归任务数据集,样本数量 100X, y = make_regression(    n_samples=100,   # 样本数    n_features=1,    # 只有一个特征    noise=60,        # 噪声参数    random_state=18  # 设定随机状态,便于复现)# 用散点图可视化样本plt.scatter(    X, y,    s=80,               # 点大小    c=y,                # 颜色映射    edgecolor='grey',    alpha=0.6)plt.colorbar(label='y')  # 添加颜色条,便于观察 y 值分布plt.grid()plt.title('Generated Regression Dataset')plt.xlabel('X')plt.ylabel('y')plt.show()

    运行结果:

    图片

    【结果分析】从图中可以看到,当我们把样本的噪声参数增加到60时,样本不再呈现为一条线的分布状况,而是更加“零散”地散布在二维空间中。在这种情况下,使用线性模型进行拟合显然有些不合理。


    决策树的用法和原理


    既然线性模型不能使用,我们尝试用决策树来试一试,代码如下:
      import numpy as npimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.datasets import make_regression# 1. 生成数据X, y = make_regression(n_samples=100, n_features=1,                       noise=60, random_state=18)# 2. 创建决策树回归器(不限制 max_depth)reg = DecisionTreeRegressor(max_depth=None, random_state=18)reg.fit(X, y)# 3. 生成用于绘图的连续横坐标X_new = np.linspace(-2.5, 3.5, 300).reshape(-1, 1)y_new = reg.predict(X_new)# 4. 绘图plt.figure(figsize=(7, 5))plt.scatter(X, y, s=80, c=y, edgecolor='grey', alpha=0.4, label='Samples')plt.plot(X_new, y_new, lw=2, color='darkorange', label='Decision Tree (no depth limit)')plt.title('DecisionTreeRegressor (max_depth=None)')plt.xlabel('X')plt.ylabel('y')plt.grid(True)plt.legend()plt.show()
      结果展示:
      图片
      【结果分析】从图中可以看出,决策树和线性模型的形状完全不同——决策树的模型不是一条直线,而是一条曲线,这条曲线在尽力的覆盖所有的样本,以此来提高模型的准确性,也可以说决策树的复杂度比线性模型提高了不少。
      到这里,有的朋友发现了,哎,这个东西是不是跟KNN算法有点像?这个和KNN算法有什么区别呢?
      图片
      从图中可以看出,决策树的工作过程是一个树状的结构—这也是决策树名字的由来,在整个树状结构的顶部,模型先对样本进行判断;如果样本特征符合即左枝,不符合即右枝;到第二层继续判断,一直重复这个过程,直到拟合完全样本,而KNN算法只有分类和回归。
      随机森林的用法和原理
      随机森林简单来说,就是覆盖了多个决策树的平均值作为随机森林的预测结果,这样就可以避免一定程度上的过拟合
        代码展示:import numpy as npimport matplotlib.pyplot as pltfrom sklearn.tree import DecisionTreeRegressorfrom sklearn.ensemble import RandomForestRegressorfrom sklearn.datasets import make_regression# 1. 生成数据X, y = make_regression(n_samples=100, n_features=1,                       noise=60, random_state=18)# 2. 单棵决策树(无深度限制)tree = DecisionTreeRegressor(max_depth=None, random_state=18)tree.fit(X, y)# 3. 随机森林(100 棵树)forest = RandomForestRegressor(n_estimators=100, random_state=18)forest.fit(X, y)# 4. 用于绘图的连续横坐标X_plot = np.linspace(-2.5, 3.5, 300).reshape(-1, 1)y_tree = tree.predict(X_plot)y_forest = forest.predict(X_plot)# 5. 画图plt.figure(figsize=(7, 5))plt.scatter(X, y, s=80, c=y,            edgecolor='grey', alpha=0.4, label='Samples')plt.plot(X_plot, y_tree, lw=1.5, ls='-',  c='grey',         label='Single Tree (no depth limit)')plt.plot(X_plot, y_forest, lw=1.5, ls='--', c='darkgreen',         label='Random Forest (n=100)')plt.title('Decision Tree vs Random Forest')plt.xlabel('X')plt.ylabel('y')plt.grid(True)plt.legend()plt.show()
        运行结果:
        图片

        【结果分析】在图中,实线部分是决策树模型,虚线部分是随机森林模型。认真观察载们不难发现,随机森林模型“波动”的幅度没有决策树模型大。这说明,随机森林模型相比决策树模型更简单,相对不容易受到噪声的干扰,也就更不容易出现过拟合的现象。

        再次提示:仅供理解,思路可以用于实盘,但是不可直接用于实盘。

        理解了概念,后续就会用决策树去挑选因子,尝试一下。
        关注我,了解更多量化知识。♥
        量化实战 · 目录上一篇量化交易实战17 - 当因子遇见线性模型(三)财务因子+线性模型策略能不能挣到钱?回测一下看看吧!!!下一篇量化交易实战19 - 因子与决策树和随机森林(二)用决策树去评估因子的重要性阅读 232



        编辑推荐

        Copyright © 2024-2025 成都宁时科技有限公司 版权所有

        蜀ICP备2022023994号