Pyts入门之时间序列的分类---TimeSeriesBOF算法(六)

简介

时间序列分类算法的最后一篇,本算法全名叫做Time Series Bag-of-Features算法,相当于上一节TimeSeriesForest算法的改进版或者说复杂版,具体改进在以下两点:
1.特征提取的方式从单层提取变为双层提取。
2.用Stacking的方式改善了分类器的性能。

所以个人更喜欢叫它时间序列随机森林的堆叠模型。
算法的具体过程为:
1.跟上节一样,先在主序列上随机抽取子序列。
2.将子序列进一步分割为子间隔。
3.在子间隔上抽取平均值,标准差,斜率三个特征(上节是在子序列上)。
4.在子序列上抽取平均值,标准差,起点,和终点四个特征。
5.将以上七个特征和子序列的标签(从哪个主序列抽出来就沿用哪个主序列的标签)输入随机森林模型一。
6.导出随机森林模型一的袋外分数进行分箱和取平均数。
7.将第六步得到的特征再输入随机森林模型二进行拟合,得到最终的分类模型。

在这里插入图片描述
所以说这实际是一个Stacking的过程,我们将第一个模型的决策函数值输入了第二个模型作为特征值使用。

闲言碎语

个人的一些抱怨,不想看的直接跳过吧。之前在公司整了一个用来做视频预处理的深度学习模型,今天上班的时候听到同事之间交流说总经理让他用C++开发一个移动端的视频预处理的东西,言下之意就是不跟我说就直接把我这个东西替换掉?这个同事甚至不懂opencv,而且这个任务用深度学习做的准确率可比传统方法高多了,速度也不差,真的把AI当成什么了?一点都不尊重人的,反正这公司里也就我一个搞AI的,可能那些人觉得这些东西很简单随便找点开源的东西就能替代吧呵呵。我早上听到这消息,写博客写到现在手都气抖了,真的想辞职啊。后面和总经理吵了一架,现在非常后悔,我一生气就非常上头

API

class pyts.classification.TSBF(n_estimators=500, 
min_subsequence_size=0.5, min_interval_size=0.1, 
n_subsequences='auto', bins=10, 
criterion='entropy', max_depth=None, 
min_samples_split=2, min_samples_leaf=1, 
min_weight_fraction_leaf=0.0, max_features='auto', 
max_leaf_nodes=None, min_impurity_decrease=0.0, 
bootstrap=True, oob_score=False, n_jobs=None, 
random_state=None, verbose=0, class_weight=None, 
ccp_alpha=0.0, max_samples=None)
参数 列表
n_estimators int,森林里树的数目,太多容易过拟合,太少容易信息不足
min_subsequence_size int or float,子序列的最小长度,若为小数则为序列长度乘该值,由于在代码中有向下取整的过程,所以实际可能会比设定的长度要小一些
min_interval_size int or float,最小间隔长度,若为小数则为序列长度乘该值,必须比子序列的最小长度小
n_subsequences int or float,子序列的个数,若为小数则为序列长度乘该值,如果为’auto’,则会自动计算要抽多少子序列
bins int or array-like,为整数则在[0,1]之间划分相同的箱子,传数组则表示自定义增加的分箱边缘
criterion “gini”或“entropy”,节点划分的准则
max_depth int or None,树的深度限制,可以不设,但容易过拟合
min_samples_split int or float,划分内部节点(能继续分出节点的节点)需包含的最小样本数,若为float,则为向上取整(min_samples_split * 样本数)
min_samples_leaf int or float,叶节点包含的最小样本数,若为float,则为向上取整(min_samples_leaf * 样本数),可能可以平滑模型
min_weight_fraction_leaf float,成为叶节点的最小权重分数,当fit时没有提供sample_weight参数时所有样本都有相同的权重
max_features int, float, str or None,一般为“auto”即可,划分时考虑的最多特征数目。若为float,则max_features=round(max_features * n_features),若为“auto”或“sqrt”,max_features=sqrt(n_features),若为“log2”, max_features=log2(n_features),若为None,max_features=n_features。
max_leaf_nodes int,叶节点的最多数目
min_impurity_decrease float,最小不纯度的减少,一个节点划分减少的不纯度大于等于这个值时才会被划分
bootstrap bool,是否使用boostrap方法来构建每棵树,若为False,则会使用整个样本集。
oob_score bool,是否使用袋外分数来进行评分,只有bootstrap为True时,才会有一部分从来没有被抽中的样本来评分
n_jobs int or None,线程数,-1时用尽所有
random_state int, RandomState instance or None,随机种子,影响两个过程:1.bootstrap,2.寻找划分点。
verbose int,控制信息显示
class_weight dict, “balanced”, “balanced_subsample” or None,给类别添加权重,为"balanced"时使用n_samples / (n_classes * np.bincount(y)),为“balanced_subsample”时,一样的计算,只是使用在每颗树构建时bootstrap的样本
ccp_alpha 非负小数,Minimal cost-complexity pruning算法的复杂度参数,总之就是来防止过拟合的,详见Minimal cost-complexity pruning
max_samples int or float,当boostrap=True时用来拟合每颗树的最大样本数,若为None,就是X.shape[0],若为float,为max_samples * X.shape[0]

这次的API和上一节相比也就是多了min_subsequence_size=0.5, min_interval_size=0.1, n_subsequences=‘auto’, bins=10这四个参数,其他都是一样的。

重点讲解

1.这里面的分箱过程还是不好理解,能举一下具体例子吗?
第二个随机森林输入的特征总共为(n_bins + 1) * n_classes。
当n_bins=5时,如果标签分为两类,那么n_classes=2,总共输入的特征就有十二个,分别为:
1.[0,0.2) 第一类oob可能性落入该区间的数目,以下类推
2.[0.2,0.4)
3.[0.4,0.6)
4.[0.6,0.8)
5.[0.8,1.0]
6.第一类oob可能性分数的平均值
7.[0,0.2)第二类oob可能性落入该区间的数目,以下类推
8.[0.2,0.4)
9.[0.4,0.6)
10.[0.6,0.8)
11.[0.8,1.0]
12.第二类oob可能性分数的平均值
比如以下代码就很好的体现了分箱的计算:

import numpy as np
a = np.random.rand(100)
x = np.histogram(a,bins=5,range=(0,1))
#(array([18, 15, 27, 22, 18], dtype=int64),
 #array([0. , 0.2, 0.4, 0.6, 0.8, 1. ]))

2.在第二个随机森林上为什么使用oob_score而不是正常预测的全部合集来作为输入特征?
关于这点我猜是为了提升泛化能力,据说oob_score和预测集上的分数差不多,根据本人的调参经验来说,oob_score确实具有一定的参考价值,如果该分数较低的话,预测结果肯定不满意,当然还是要按照实际情况看吧,毕竟现实很复杂。此外在这个分类器里据说n_estimator也就是树的数目不能取太小,不然可能导致所有样本都训练过了,没有oob的样本。

猜你喜欢

转载自blog.csdn.net/weixin_43945848/article/details/123629004