AI量化模型预测挑战赛学习笔记

487 阅读23分钟

题目解析

赛事任务

给定数据集: 给定训练集(含验证集), 包括10只(不公开)股票、79个交易日的L1snapshot数据(前64个交易日为训练数据,用于训练;后15个交易日为测试数据,不能用于训练), 数据已进行规范化和隐藏处理,包括5档量/价,中间价,交易量等数据(具体可参考后续数据说明)。

预测任务: 利用过往及当前数据预测未来中间价的移动方向,在数据上进行模型训练与预测

输入数据:

行情频率:3秒一个数据点(也称为1个tick的snapshot);

每个数据点包括当前最新成交价/五档量价/过去3秒内的成交金额等数据;

训练集中每个数据点包含5个预测标签的标注; 允许利用过去不超过100tick(包含当前tick)的数据,预测未来N个tick后的中间价移动方向。

预测时间跨度:5、10、20、40、60个tick,5个预测任务;

即在t时刻,分别预测t+5tick,t+10tick,t+20tick,t+40tick,t+60tick以后: 最新中间价相较t时刻的中间价:下跌/不变/上涨。

本题的任务是构建一种AI量化模型,利用过往及当前数据预测未来中间价的移动方向。

数据字段:

字段含义
date日期
time时间戳
sym标的(仅序号)
close最新价/收盘价
amount_delta成交量变化
n_midprice中间价
n_bid1买一价
n_bsize1买一量
n_bid2买二价
n_bsize2买二量
n_bid3买三价
n_bsize3买三量
n_bid4买四价
n_bsize4买四量
n_bid5买五价
n_bsize5买五量
n_ask1卖一价
n_asize1卖一量
n_ask2卖二价
n_asize2卖二量
n_ask3卖三价
n_asize3卖三量
n_ask4卖四价
n_asize4卖四量
n_ask5卖五价
n_asize5卖五量
label55tick价格移动方向
label1010tick价格移动方向
label2020tick价格移动方向
label4040tick价格移动方向
label6060tick价格移动方向

解题思路

参考资料:AI夏令营(第二期) - AI量化模型预测挑战赛实践教程 - 飞书云文档 (feishu.cn)

首先本题的任务是构建一种AI量化模型,利用过往及当前数据预测未来中间价的移动方向。同时本题是时间序列回归预测问题,通过学习知道,处理这类问题一般使用机器学习的方法——CatBoost,LightGBM,XGBoost等树模型。

image-20230806092943808

下面是对买价和卖价的简单介绍:

  • 买价指的是买方愿意为一项股票/资产支付的最高价格。
  • 卖价指的是卖方愿意接受的一项股票/资产的最低价格。
  • 这两个价格之间的差异被称为点差;点差越小,该品种的流动性越高。
  • 中间价即买价与卖价的均值,数据中有直接给到,我们也可以自己计算。

知识点整理

一、时间序列数据简介

定义: 一个/组变量,在一系列时刻进行观测得到的一系列离散数字组合成的时间序列。

特征:

  • 长期趋势 (Trend) :时间序列在长期呈现的向上or向下的波动
  • 季节变动 (Seasonal Effect) :随着期间变化(月,季,年)而变化
  • 循环波动 (Cyclical Fluctuation) :沿着trend波动,不是单一方向的,而是涨落相同的交替波动。
  • 不规则波动 (Residual/error) :除去趋势,季节波动,周期波动之外的随机波动。只含有随机波动的序列是平稳序列

二、常用解决方法

1.CatBoost

CatBoost是一种基于对称决策树(oblivious trees)为基学习器实现的参数较少、支持类别型变量和高准确性的GBDT框架,主要解决的痛点是高效合理地处理类别型特征,这一点从它的名字中可以看出来,CatBoost是由Categorical和Boosting组成。此外,CatBoost还解决了梯度偏差(Gradient Bias)以及预测偏移(Prediction shift)的问题,从而减少过拟合的发生,进而提高算法的准确性和泛化能力。

与XGBoost、LightGBM相比,CatBoost的创新点有:

  • 模型精度: XGBoost和LightGBM相当,CatBoost往往略好一些,无需调参即可获取很好的结果。
  • 训练速度: LightGBM远快于XGBoost,CatBoost快于XGBoost但比LightGBM慢。
  • 预测速度: LightGBM与XGBoost相当,CatBoost远快于LightGBM与XGBoost,是它们的几十分之一。
  • 内存消耗: LightGBM远小于XGBoost,CatBoost小于XGBoost,但大于LightGBM。
  • 类别特征: XGBoost不支持类别特征,需要OneHot编码预处理。LightGBM支持类别特征,需转换成整数编码。CatBoost提供更强大的对类别特征的支持,直接支持字符串类型的类别特征,无需预处理。
  • 缺失值特征: XGBoost和LightGBM都可以自动处理特征缺失值,CatBoost不能自动处理缺失值(或者将缺失值视为最小值/最大值)。
  • GPU支持: LightGBM与CatBoost支持GPU训练,XGBoost也支持GPU训练。
  • 可视化: CatBoost还自带一套可视化工具,可以在Jupyter Notebook或者TensorBoard中实时看到指标变化。

1.1原理

1.1.1类别特征的Ordered Target Statistics 数值编码方法

对于类别特征,如果类别数目不多,可以使用onehot编码。

但如果类别数量成百上千,使用onehot编码会导致特征数量爆炸。

CatBoost设计了一种基于预测目标统计值的方法可以将类别特征转化为数值特征。

以风控领域的预测信贷用户是否会违约为例,假设有一个类别特征是根据身份证号码解析出来的用户所出生的城市。

例如:

全国有几百个城市,转化为onehot编码会造成特征维数爆炸。

一种非常make sense 的方式是我们用某个城市用户的平均逾期率来作为该城市的数值特征编码。简而言之,我们用如下方式将 city = "上海" 这一类别特征取值 代替为如下值。

city_numeric("上海") = sample_count(city="上海" and label=1(逾期)) / sample_count(city="上海")

这就是所谓的 Target Statistics 编码方法。

但是考虑到有一些小城市,比如黑龙江鹤岗市,可能在训练样本中数量很少甚至没有,这时候用训练样本中鹤岗市的用户平均逾期率来估计会比较不靠谱。例如鹤岗市只有1个样本,并且这个样本是逾期的,那么数值编码

city_numeric("鹤岗") = sample_count(city="鹤岗" and label=1(逾期)) / sample_count(city="鹤岗") = 
1.1.2基于贪心策略的特征交叉方法

使用Ordered Target Statistics 方法将类别特征转化成为数值特征以后,会影响到特征交叉,因为数值特征无法有效地进行交叉。

依然以风控领域的预测信贷用户是否会违约为例,假设 city="北京市" 且 job="保安" 的用户信用特别好,但不是北京市所有的用户都信用好,也不是所有的保安都信用特别好。只有北京市的保安这个群体才信用好。

如果我们将 city转换为数值编码,也将保安转换为数值编码之后,我们得到两个数,这两个数相乘是没有意义的,我们无法表示 北京市的保安这个群体。

为了有效地利用特征交叉,CatBoost 在将类别特征转换为数值编码的同时,会自动生成 交叉特征。

如果让全部的类别特征之间都进行交叉,两两交叉,三三交叉,四四交叉,这个复杂度是指数级的,特征维度一定会爆炸。

CatBoost使用一种贪心的策略来进行特征交叉。 生成tree的第一次分裂,CatBoost不使用任何交叉特征。在后面的分裂中,CatBoost会使用生成tree所用到的全部原始特征和交叉特征 跟 数据集中的全部 类别特征进行交叉。

在定义CatBoost模型时,我们可以用'max_ctr_complexity' 来控制允许的特征交叉的最大特征数量,如果设置为3,那么生成tree时所用到的交叉特征最多只会来自3个特征的交叉,也就是我们只能表示 city='北京市' 且 job='保安' 且 education='高中'这样的三阶交叉特征,而无法表示 city='北京市' 且 job='保安' 且 education='高中' 且 hobby='抽烟' 这样的四阶交叉特征。

1.1.3避免预测偏移的 Ordered Boosting 方法。

使用XGBoost或者LightGBM做模型时,我们可能经常会发现模型在训练集上拟合的很好,train_auc甚至达到了1.0, 但是在验证集上却差了很多, va_auc 可能只有0.7。这当然有可能是因为tree的数量太多了,或者是每棵tree的leaves太多了,总之模型太复杂了造成了过拟合。

但也有一些XGBoost和LightGBM自身算法的缺陷因素。我们知道LightGBM在训练下一棵tree的时候,需要计算前面这些tree构成的加法模型在所有样本上的一阶梯度和二阶梯度(Loss对模型预测结果的导数),然后用这些梯度来决定下一棵树的结构和叶子节点取值。

但是我们计算的这些一阶梯度和二阶梯度值是问题的。前面的这些tree都是在这些样本上训练的,现在我们又在这些样本上估计模型预测结果的一阶和二阶梯度。我们应该换一些新的样本才更合理。但是我们从哪里找这些新的样本呢?

CatBoost 的作者故伎重演。先将样本随机打乱,然后每个样本只使用排序在它前面的样本来训练模型。用这样的模型来估计这个样本预测结果的一阶和二阶梯度。然后用这些梯度构建一棵tree的结构,最终tree的每个叶子节点的取值,是使用全体样本进行计算的。

这就是Ordered Boosting的主要思想。可以有效地减少梯度估计的误差,缓解预测偏移。但是会增加较多的计算量,影响训练速度。

在定义CatBoost模型时,我们可以用'boosting_type'这个参数来设置是使用Ordered Boosting 还是 LightGBM那样的 Plain Boosting。如果不显式设置,CatBoost会根据样本和特征数量自己决定。

1.1.4使用对称二叉树作为基模型,有正则作用且预测极快

XGBoost和LightGBM采用的基模型是普通的二叉树,但是CatBoost采用的是对称的二叉树。

这种对树结构上的约束有一定的正则作用。更为重要的是,它可以让CatBoost模型的推断过程极快。

对于CatBoost的tree的预测过程来说,每个特征的分裂都是独立的,不分先后顺序,多个样本可

1.2CatBoost的优缺点

1.2.1 优点

  • 性能卓越:在性能方面可以匹敌任何先进的机器学习算法;
  • 鲁棒性/强健性:它减少了对很多超参数调优的需求,并降低了过度拟合的机会,这也使得模型变得更加具有通用性;
  • 易于使用:提供与scikit集成的Python接口,以及R和命令行界面;
  • 实用:可以处理类别型、数值型特征;
  • 可扩展: 支持自定义损失函数;

1.2.2 缺点

  • 对于类别型特征的处理需要大量的内存和时间;
  • 不同随机数的设定对于模型预测结果有一定的影响;

1.3CatBoost模型训练与验证

CatBoost是一种梯度增强决策树模型,它在训练过程中可以自动处理一些特征工程的任务,比如对分类特征进行自动编码、处理缺失值等。但是,还是可以通过一些传统的特征工程技巧来提高CatBoost模型的表现。以下是一些常用的CatBoost特征工程技巧:

  1. 数据清洗:对原始数据进行处理,去除重复值、缺失值和异常值。可以使用CatBoost提供的处理缺失值和异常值的方法。
  2. 类别特征编码:CatBoost可以自动处理类别特征,但是有时对类别特征进行自定义编码也可能提供更好的性能。例如,可以使用独热编码或标签编码来将类别特征转换为数值特征。
  3. 时间特征提取:如果数据中包含时间戳,你可以从中提取各种时间特征,比如年、月、日、小时等。CatBoost可以自动处理日期时间特征,但有时额外的时间特征也可能提供更多的信息。
  4. 特征选择:使用CatBoost自带的特征重要性排名来选择最重要的特征,减少模型的复杂性和训练时间。可以通过 model.get_feature_importance() 来获取特征重要性列表。
  5. 特征交互:由于CatBoost可以处理高阶交互效应,所以有时不需要手动创建交叉特征。但是,有时手动创建一些特定的交互特征可能有助于提高模型的性能。
  6. 特征缩放:CatBoost在训练过程中不需要特征缩放,因为它使用直方图算法进行拆分。所以在CatBoost中不需要对数值特征进行标准化或归一化。

使用CatBoost作为基线模型并采用五折交叉验证的方式进行数据切分验证是一种常用的机器学习实践。下面是一个示例代码框架,以帮助你理解模型训练与验证的流程:

from catboost import CatBoostRegressor
from sklearn.model_selection import KFold
import numpy as np
​
# 假设你已经有了特征矩阵 X 和目标变量 y# 定义模型参数
params = {
    'iterations': 100,  # 迭代次数
    'learning_rate': 0.1,
    'depth': 6,  # 树的深度
    'loss_function': 'RMSE',
    'eval_metric': 'RMSE',
    'random_seed': 42
}
​
# 初始化一个空数组来存储每个模型的预测结果
predictions = np.zeros(len(y))
​
# 使用五折交叉验证进行数据切分和模型训练
kf = KFold(n_splits=5, random_state=42, shuffle=True)
for train_index, val_index in kf.split(X):
    # 获取训练集和验证集
    X_train, X_val = X[train_index], X[val_index]
    y_train, y_val = y[train_index], y[val_index]
    
    # 定义和训练模型
    model = CatBoostRegressor(**params)
    model.fit(X_train, y_train, eval_set=(X_val, y_val), verbose=50)
    
    # 在验证集上进行预测
    val_predictions = model.predict(X_val)
    
    # 将当前模型的预测结果加到整体预测结果中
    predictions[val_index] = val_predictions
​
# 计算模型在整个训练集上的性能指标,例如均方根误差(RMSE)
overall_rmse = np.sqrt(np.mean((predictions - y) ** 2))
print("Overall RMSE:", overall_rmse)

这个示例代码中,我们使用了CatBoostRegressor来进行回归模型的训练和预测,你可以根据需要进行修改。在每个折叠的训练过程中,我们将训练集和验证集分别输入模型进行训练和预测,并将验证集的预测结果加到整体预测结果中。最后,可以计算整个训练集上的性能指标,例如均方根误差(RMSE)。

2.LightGBM

GBDT (Gradient Boosting Decision Tree) 是机器学习中一个长盛不衰的模型,其主要思想是利用弱分类器(决策树)迭代训练以得到最优模型,该模型具有训练效果好、不易过拟合等优点。GBDT不仅在工业界应用广泛,通常被用于多分类、点击率预测、搜索排序等任务;在各种数据挖掘竞赛中也是致命武器,据统计Kaggle上的比赛有一半以上的冠军方案都是基于GBDT。

而LightGBM(Light Gradient Boosting Machine)是一个实现GBDT算法的框架,支持高效率的并行训练,并且具有更快的训练速度、更低的内存消耗、更好的准确率、支持分布式可以快速处理海量数据等优点。

lightGBM在传统的GBDT算法上进行了如下优化:

  • 基于Histogram的决策树算法。
  • 单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
  • 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
  • 带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
  • 直接支持类别特征(Categorical Feature)
  • 支持高效并行
  • Cache命中率优化

2.1原理

2.1.1 基于Histogram的决策树算法

优化主要包含了直方图算法直方图作差加速两种:

  • 直方图算法

    • 基本思想:先把连续的浮点特征值离散化成 k个整数,同时构造一个宽度为 k 的直方图。在遍历数据的时候,根据离散化后的值作为索引在直方图中累积统计量,当遍历一次数据后,直方图累积了需要的统计量,然后根据直方图的离散值,遍历寻找最优的分割点。
    • 优点:内存占用更小,计算代价更小——相比于XGBoost算法
    • 缺点:特征被离散化后,找到的并不是很精确的分割点,所以会对结果产生影响。
  • 直方图作差加速

    • 基本思想:一个叶子的直方图可以由它的父亲节点的直方图与它兄弟的直方图做差得到,在速度上可以提升一倍。通常构造直方图时,需要遍历该叶子上的所有数据,但直方图做差仅需遍历直方图的k个桶。在实际构建树的过程中,LightGBM还可以先计算直方图小的叶子节点,然后利用直方图做差来获得直方图大的叶子节点,这样就可以用非常微小的代价得到它兄弟叶子的直方图。
2.1.2 带深度限制的Leaf-wise 算法

在Histogram算法之上,LightGBM进行进一步的优化。首先它抛弃了大多数GBDT工具使用的按层生长 (level-wise) 的决策树生长策略,而使用了带有深度限制的按叶子生长 (leaf-wise) 算法。

XGBoost 采用 Level-wise 的增长策略,该策略遍历一次数据可以同时分裂同一层的叶子,容易进行多线程优化,也好控制模型复杂度,不容易过拟合。但实际上Level-wise是一种低效的算法,因为它不加区分的对待同一层的叶子,实际上很多叶子的分裂增益较低,没必要进行搜索和分裂,因此带来了很多没必要的计算开销。

LightGBM采用Leaf-wise的增长策略,该策略每次从当前所有叶子中,找到分裂增益最大的一个叶子,然后分裂,如此循环。因此同Level-wise相比

  • Leaf-wise的优点是:在分裂次数相同的情况下,Leaf-wise可以降低更多的误差,得到更好的精度;
  • Leaf-wise的缺点是:可能会长出比较深的决策树,产生过拟合。

因此LightGBM会在Leaf-wise之上增加了一个最大深度的限制,在保证高效率的同时防止过拟合。

2.1.3 边梯度采样算法

Gradient-based One-Side Sampling被翻译为单边梯度采样(GOSS)。GOSS算法从减少样本的角度出发,排除大部分小梯度的样本,仅用剩下的样本计算信息增益,它是一种在减少数据量和保证精度上平衡的算法。

GOSS是一个样本的采样算法,目的是丢弃一些对计算信息增益没有帮助的样本留下有帮助的。根据计算信息增益的定义,梯度大的样本对信息增益有更大的影响。因此,GOSS在进行数据采样的时候只保留了梯度较大的数据,但是如果直接将所有梯度较小的数据都丢弃掉势必会影响数据的总体分布。

2.4 互斥特征捆绑算法

高维度的数据往往是稀疏的,这种稀疏性启发我们设计一种无损的方法来减少特征的维度。

通常被捆绑的特征都是互斥的(即特征不会同时为非零值,像one-hot),这样两个特征捆绑起来才不会丢失信息。如果两个特征并不是完全互斥(部分情况下两个特征都是非零值),可以用一个指标对特征不互斥程度进行衡量,称之为冲突比率,当这个值较小时,我们可以选择把不完全互斥的两个特征捆绑,而不影响最后的精度。

互斥特征捆绑算法(Exclusive Feature Bundling, EFB)指出如果将一些特征进行融合绑定,则可以降低特征数量。

三、特征优化

特征工程是机器学习和数据挖掘中一个重要的步骤,它涉及到从原始数据中提取有用的特征,以便用于模型训练和预测。特征工程的目标是提高模型的性能和准确性。

以下是一些常见的特征工程技术:

  1. 数据清洗:对原始数据进行处理,去除重复值、缺失值和异常值。
  2. 特征编码:将分类变量转换为数值型变量,例如使用独热编码、标签编码等方法。
  3. 特征缩放:对数值型变量进行缩放,以确保不同特征之间具有相似的尺度。常见的方法有标准化和归一化。
  4. 特征选择:根据特征的重要性选择最相关的特征,可以通过统计方法、模型相关性和特征重要性等方式进行特征选择。
  5. 特征构造:通过对原始特征进行加减乘除、指数化、多项式扩展等操作,构造出新的特征。
  6. 时间特征提取:从时间戳数据中提取出年、月、日、小时等各种时间特征,以便模型理解和利用时间相关性。
  7. 文本特征提取:对文本数据进行分词、词频统计、TF-IDF权重计算等操作,将文本数据转换为数值型特征。
  8. 特征组合:将多个特征进行组合,构造出更高层次、更有表达力的特征。

特征工程的选择取决于数据的类型和问题的需求。在实际应用中,通过不断尝试和验证不同的特征工程技术,可以找到最适合问题的特征表示,从而提高模型的性能和效果。

下面是在学习Datawhale讲义中提到的特征优化部分:

这里主要构建了当前时间特征、历史平移特征、差分特征、和窗口统计特征;每种特征都是有理可据的,具体说明如下:

(1)当前时间特征: 围绕买卖价格和买卖量进行构建,暂时只构建买一卖一和买二卖二相关特征,进行优化时可以加上其余买卖信息;

(2)历史平移特征: 通过历史平移获取上个阶段的信息;

(3)差分特征: 可以帮助获取相邻阶段的增长差异,描述数据的涨减变化情况。在此基础上还可以构建相邻数据比值变化、二阶差分等;

(4)窗口统计特征: 窗口统计可以构建不同的窗口大小,然后基于窗口范围进统计均值、最大值、最小值、中位数、方差的信息,可以反映最近阶段数据的变化情况。

四、基本知识补充

在学习baseline的时遇到的之前没接触到的知识点:

Python进度条

tqdm模块是python进度条库, 主要分为两种运行模式

  1. 基于迭代对象运行: tqdm(iterator)
import time
from tqdm import tqdm, trange#trange(i)是tqdm(range(i))的一种简单写法
for i in trange(100):
    time.sleep(0.05)
​
for i in tqdm(range(100), desc='Processing'):
    time.sleep(0.05)
​
dic = ['a', 'b', 'c', 'd', 'e']
pbar = tqdm(dic)
for i in pbar:
    pbar.set_description('Processing '+i)
    time.sleep(0.2)
100%|██████████| 100/100 [00:06<00:00, 16.04it/s]
Processing: 100%|██████████| 100/100 [00:06<00:00, 16.05it/s]
Processing e: 100%|██████████| 5/5 [00:01<00:00,  4.69it/s]
  1. 手动更新
import time
from tqdm import tqdm
​
with tqdm(total=200) as pbar:
    pbar.set_description('Processing:')
    # total表示总的项目, 循环的次数20*10(每次更新数目) = 200(total)
    for i in range(20):
        # 进行动作, 这里是过0.1s
        time.sleep(0.1)
        # 进行进度更新, 这里设置10个
        pbar.update(10)
Processing:: 100%|██████████| 200/200 [00:02<00:00, 91.94it/s]
参数说明

tqdm代码:

class tqdm(object):
  """
  Decorate an iterable object, returning an iterator which acts exactly
  like the original iterable, but prints a dynamically updating
  progressbar every time a value is requested.
  """
​
  def __init__(self, iterable=None, desc=None, total=None, leave=False,
               file=sys.stderr, ncols=None, mininterval=0.1,
               maxinterval=10.0, miniters=None, ascii=None,
               disable=False, unit='it', unit_scale=False,
               dynamic_ncols=False, smoothing=0.3, nested=False,
               bar_format=None, initial=0, gui=False):
  • iterable: 可迭代的对象, 在手动更新时不需要进行设置
  • desc: 字符串, 左边进度条描述文字
  • total: 总的项目数
  • leave: bool值, 迭代完成后是否保留进度条
  • file: 输出指向位置, 默认是终端, 一般不需要设置
  • ncols: 调整进度条宽度, 默认是根据环境自动调节长度, 如果设置为0, 就没有进度条, 只有输出的信息
  • unit: 描述处理项目的文字, 默认是'it', 例如: 100 it/s, 处理照片的话设置为'img' ,则为 100 img/s
  • unit_scale: 自动根据国际标准进行项目处理速度单位的换算, 例如 100000 it/s >> 100k it/s

argparse模块

argparse 是 Python 内置的一个用于命令项选项与参数解析的模块,通过在程序中定义好我们需要的参数,argparse 将会从 sys.argv 中解析出这些参数,并自动生成帮助和使用信息。

  1. 命令行参数分为位置参数和选项参数
  • 位置参数——就是程序根据该参数出现的位置来确定的 如:[root@openstack_1 /]# ls root/ #其中root/是位置参数
  • 选项参数——是应用程序已经提前定义好的参数,不是随意指定的 如:[root@openstack_1 /]# ls -l # -l 就是ls命令里的一个选项参数
  1. 使用步骤: (1)import argparse 首先导入模块 (2)parser = argparse.ArgumentParser() 创建一个解析对象 (3)parser.add_argument() 向该对象中添加你要关注的命令行参数和选项 (4)parser.parse_args() 进行解析

文件读取

在文件读取的时候,Baseline使用了

os.listdir() 方法:

  • 用于返回指定的文件夹包含的文件或文件夹的名字的列表。
  • 它不包括 ... 即使它在文件夹中。
  • 只支持在 Unix, Windows 下使用。

回归常用评估指标

  • 均方误差(Mean Squared Error,MSE):平均平方误差,衡量预测值与真实值之间的差异。
  • 均方根误差(Root Mean Squared Error,RMSE):均方误差的平方根,也可以用来衡量预测值与真实值之间的差异。
  • 平均绝对误差(Mean Absolute Error,MAE):平均绝对误差,衡量预测值与真实值之间的差异。
  • 平均相对误差(Mean Relative Error,MRE):平均相对误差,衡量预测值与真实值之间的相对差异。
  • 均方根相对误差(Root Mean Squared Relative Error,RMSRE):均方根相对误差,衡量预测值与真实值之间的相对差异。
  • 在分类问题中,常用的评估指标有以下几种:
  • 准确率(Accuracy):正确分类的样本数占总样本数的比例,衡量分类器的总体性能。
  • 精确率(Precision):预测为正例的样本中,实际为正例的比例,衡量分类器在预测正例时的性能。
  • 召回率(Recall):实际为正例的样本中,被分类器预测为正例的比例,衡量分类器在捕捉正例时的性能。
  • F1值(F1-score):精确率和召回率的加权调和平均值,综合衡量分类器的性能。
  • ROC曲线(Receiver Operating Characteristic Curve):以假正例率为横轴,真正例率为纵轴绘制的曲线,用于评估分类器的性能。
  • AUC值(Area Under the Curve):ROC曲线下方的面积,衡量分类器的性能。