基于LightGBM(LGB)的股票预测

本文介绍了LightGBM,微软亚洲研究院的开源算法,对比XGBoost,它在效率和内存消耗上更具优势。通过直方图算法和深度限制叶子生长策略,探讨了其在实际数据集中的应用,包括数据预处理、特征选择和模型评估。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

LGB预测

LightGBM(Light GradientBoosting Ma-
chine)是微软亚洲研究所DMTK 团队的一个开源的算法,是一种基于决策树和 GradientBoosting的改进 模 型,可以用于常见的分类、回归等问题。LightGBM 和 XGBoost算法被分别称为机器学习中的“倚天剑”和“屠龙刀”,都是非常优秀的算法。
LightGBM 有着很多的优点:使用基于直方图的算法,有着更快的训练速度和更高的效率;更少的内存占用;支持并行计算,并且由于在训练时间上的缩减而拥有处理大数据的能力。
LightGBM 有两个重要的创新点是使用直方图算法和带深度限制的 Leaf-wise的叶子生长策略:
(1)直方图算法。LightGBM 的一大创新点是基于直方图算法提出的。在计算的时候,模型会将浮点型的数值转化成离散数值,从而生成了一个直方图。将离散数值作为索引在图中累计统计量,这样的结果就是能极大地降低内存占用来进行遍历找出最佳分割点。
(2)带深度限制的 Leaf-wise的叶子生长策略。大部分的决策树使用 Level-wise策略。但是 Level-wise是一种低效算法,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销

数据集介绍

在这里插入图片描述

代码

#导入所需要的主要的包
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import lightgbm as lgb
from sklearn.model_selection import train_test_split
pd.set_option('display.max_rows',None)
pd.set_option('display.max_columns',None)

data=pd.read_csv('LBMA-GOLD.csv',error_bad_lines=False)
data.describe(include='all')

#去除重复值
data.drop_duplicates(inplace=True)
data=data[data.loc[:,'USD (PM)'].isnull()==False]


def LGB(x_train, y_train, x_test, y_test):
    lgb_train = lgb.Dataset(x_train, y_train)

    lgb_eval = lgb.Dataset(x_test, y_test, reference=lgb_train)  # 验证集

    params = {'learning_rate': 0.1,
              'boosting_type': 'gbdt',
              'objective': 'regression_l1',
              'metric': 'mape',
              'min_child_samples': 46,
              'min_child_weight': 0.01,
              'feature_fraction': 1,
              'bagging_fraction': 1,
              'bagging_freq': 2,
              'num_leaves': 32,
              'max_depth': 8,
              'n_jobs': -1,
              'seed': 2019,
              'verbose': -1,
              }
    results = {}
    gbm = lgb.train(params, lgb_train, num_boost_round=5000,
                    valid_sets=(lgb_eval, lgb_train), valid_names=('validate', 'train'),
                    early_stopping_rounds=2000, evals_result=results)

    y_pre = gbm.predict(x_test)

    #     lgb.plot_importance(gbm,importance_type="split")
    #     plt.show()

    return y_pre


from sklearn.metrics import mean_absolute_error, r2_score, mean_squared_error


def Evaluate(y_test, y_pre):
    MAPE = np.mean(np.abs((y_pre - y_test) / y_test))
    MAE = mean_absolute_error(y_test, y_pre)
    R2 = r2_score(y_test, y_pre)
    MSE = mean_squared_error(y_test, y_pre)
    RMSE = np.sqrt(mean_squared_error(y_test, y_pre))
    M = [MAPE, MAE, R2, MSE, RMSE]
    return M

#重新调整索引
data=data.reset_index(drop=True)

#归一化处理
X=data.iloc[:,1]
xmax=max(X)
xmin=min(X)
X=(X-xmin)/(xmax-xmin)
data.iloc[:,1]=X
print(data)

# 创建自变量、因变量
M = []
for i in range(8, 9):
    datai = data.copy()
    datai['label'] = data['USD (PM)'].shift(-i)
    label = datai['USD (PM)']
    attitude = []
    for z in range(len(datai)):
        atti = []
        if z + i < len(datai):
            for j in range(i):
                atti.append(datai.iloc[z + j, :]['USD (PM)'])
            attitude.append(atti)
    # 创建训练集和测试集
        x_train,x_test,y_train,y_test=train_test_split(np.array(attitude),np.array(label[:len(label)-i]),test_size=0.2)
        y_pre=LGB(x_train,y_train,x_test,y_test)
        M.append(Evaluate(y_test,y_pre))
        num=np.linspace(1,len(y_pre),len(y_pre))
        plt.scatter(num,y_pre,label= 'p')
        plt.scatter(num,y_test,label= 't')
        plt.legend()
        plt.show()

    filename = "lgoldPre.txt"
    fw = open("D:\\" + filename, encoding='utf8', mode='a+')
    for i in range(9):
        pri = data.iloc[i, 1] * (xmax - xmin) + xmin
        fw.write(str(data.iloc[i, 0]) + '\t' + str(pri) + '\t' + str(pri) + '\t'+str(label[i])+'\n')

    for z in range(1, len(attitude)):
        print('---------------------------------------', z, '--------------------------------------------')
        x_train = np.array(attitude[:z])
        x_test = np.array([attitude[z]])
        y_train = np.array(label[:z])
        y_test = np.array([label[z]])
        y_pre = LGB(x_train, y_train, x_test, y_test)
        y_pre = y_pre[0] * (xmax - xmin) + xmin
        y_test = y_test[0] * (xmax - xmin) + xmin
        fw.write(str(data.iloc[8 + z, 0]) + '\t' + str(y_test) + '\t' + str(y_pre) +'\t'+str(label[8+z])+ '\n')


# for i in range(len(M)):
#     print('-----------------------',i+3,'-----------------------')
#     print('MAPE: ',M[i][0])
#     print('MAE: ',M[i][1])
#     print('R2: ',M[i][2])
#     print('MSE: ',M[i][3])
#     print('RMSE: ',M[i][4])

fw.close()

### 如何基于 LightGBM 实现机器学习模型 #### 背景概述 LightGBM 是一种高效的梯度提升框架,其设计目标是为了提高计算效率和降低资源消耗的同时保持较高的预测精度[^1]。该工具被广泛应用于多个领域,包括但不限于商业智能分析、自然语言处理以及医疗诊断等领域[^2]。 #### 安装依赖项 在 Python 中使用 LightGBM 需要先安装对应的库文件。可以通过 pip 工具完成安装操作: ```bash pip install lightgbm ``` #### 数据准备阶段 为了构建一个完整的流程示例,假设我们有一个简单的二分类问题的数据集 `data.csv`,其中最后一列为标签列(即目标变量),其余为特征列。 加载数据并划分训练集与测试集的过程如下所示: ```python import pandas as pd from sklearn.model_selection import train_test_split # 加载数据 df = pd.read_csv('data.csv') X = df.iloc[:, :-1] y = df.iloc[:, -1] # 划分训练集和验证集 X_train, X_val, y_train, y_val = train_test_split(X, y, test_size=0.2, random_state=42) ``` #### 构建 LightGBM 模型 定义参数字典,并创建 Dataset 对象作为输入给定到后续的训练函数中去。 ```python import lightgbm as lgb # 创建LGBM所需的Dataset对象 train_data = lgb.Dataset(X_train, label=y_train) val_data = lgb.Dataset(X_val, label=y_val) # 设置参数 params = { 'objective': 'binary', # 由于这是一个二元分类任务 'metric': ['auc'], # AUC指标评估标准 'boosting_type': 'gbdt', 'learning_rate': 0.1, 'num_leaves': 31 # 控制树复杂程度的一个重要超参 } print("Starting training...") model = lgb.train(params, train_data, valid_sets=[val_data], num_boost_round=100, early_stopping_rounds=10) ``` 上述代码片段展示了如何配置基本的学习参数并通过调用 `lgb.train()` 方法启动实际训练过程。 #### 进行预测 一旦完成了模型训练之后就可以利用已有的实例来进行新样本上的推断工作了。 ```python predictions = model.predict(X_val) threshold = 0.5 predicted_classes = (predictions >= threshold).astype(int) ``` 这里简单地选取概率阈值为 0.5 来决定最终类别归属情况[^3]。 #### 性能优化建议 考虑到 LightGBM 的特性及其优势所在,在面对更大规模或者更高维度稀疏矩阵形式下的应用场景时尤为适用。具体可以从以下几个方面入手进一步挖掘潜力: - **调整最大叶子节点数 (`max_depth`) 和最小分裂增益 (`min_gain_to_split`)**; - **启用 GPU 支持** 如果硬件条件允许的话,则可极大缩短运算耗时; - **探索更多高级功能**,像 CatBoost 不同之处在于它可以直接接受原始字符串类型的属性而无需额外编码转换等步骤[^4]。 --- ###
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值