文章 "基于暴力算法的 CatBoost 模型高级重采样与选择" - 页 14

 
mytarmailS:

Karoch 我不知道,也许我的枪法不对 )))但我看不出有它和没有它有什么区别,在我看来,一切都是由目标决定的,别无其他....


我总共有 6 万个数据。

我从前端 10k 个数据中随机抽取 500 个点。

我要么立即对它们进行模型训练,要么先训练 gmm,然后再训练模型。

在剩余的 5 万个点上进行测试

即使用通常的方法,你也能找到像 gmm 这样的模型,而且它们的遗传频率是相同的

例如

不使用 gmm 的模型在 500 个点上训练,在 50k 个点上测试。


=================================================================================================

看到一个值得思考的有趣现象.....

有一种观点认为,应将市场划分为不同的状态,并在每个状态下采用不同的策略进行交易,但我所知道的所有尝试都不成功,要么是看不到状态,要么是即使在 "一种 "状态下模型的交易也很糟糕。

但通过这种方法,你可以很清楚地看到模型 "喜欢 "哪个市场,不喜欢哪个市场。哪些不喜欢。

可能是由于来自 mashka 的回报作为标志,该模型在平盘时运行得更好。

可以手动划分状态,并将这些时段添加到轨道中。您需要按 "状态 "平衡示例,或通过 gmm 制作人工示例。怎么说呢,我从未在裸模型上得到过这样的结果。也许一些 Mashas 可以做到这一点。
 
Maxim Dmitrievsky:
您可以手动分割成不同的状态,然后将这些时间段放入示例中。您需要按 "状态 "平衡示例,或通过 gmm 制作人工示例

是的,您可以按状态来做 HMM,但这都将通过滑动窗口来识别,因此窗口大小会有滞后,所以 ......)

我刚刚看到有一个非常清晰的状态视图,看起来很有趣。

 
mytarmailS:

是的,您可以按状态进行 HMM 处理,但所有状态都将通过滑动窗口识别,因此窗口大小存在滞后性,因此 ......。)

我刚刚看到,您可以在这里非常清楚地看到状态,这似乎很有趣。

趋势通常不那么平缓,所以在我看来,它总是这样的,你应该对它们进行采样。同样的聚类也可以用来划分状态。
 
Maxim Dmitrievsky:
.我怎么从来没有在裸体模特身上得到过这样的效果。也许几个马什卡人就能做到。

我一直在用 gmm,尝试不同的方法,这样那样。

 
Maxim Dmitrievsky:

我痴迷于通过优化分布或函数来创建训练样本。

根本不用任何样本,只需生成 "一些东西",然后在真实数据上进行测试。

但我还不知道如何实现它

=====================================================

我还有一个想法,就是通过删除模型中的坏树来提高质量,这可能也有帮助。

 
mytarmailS:

我痴迷于通过优化分布或函数来创建训练样本。

然后,无需从任何样本开始,只需生成 "一些东西",并在真实数据上进行测试。

但我还不知道如何实现它。

=====================================================

我还有一个想法,可以通过删除模型中的坏树来提高质量,这可能也有帮助。

你才是想深入研究随机建模的人
 
Maxim Dmitrievsky:

这是一种奇特的方法。为了平衡阶级。可以为我们所用我突然想到

https://towardsdatascience.com/augmenting-categorical-datasets-with-synthetic-data-for-machine-learning-a25095d6d7c8

我试图将这种方法整合到文章中的聚类器中,但不是作为一种类平衡方法,而是作为一种新的平衡数据集生成器。

那里有一个计算两个一维数组之间马哈拉诺比斯距离的 好方法。文章说,这是样本与分布均值的标准差的多变量概括

我还没有完全体验过这个指标,但作者建议用它来评估生成的特征是否属于某个特定类别

https://docs.scipy.org/doc/scipy/reference/generated/scipy.spatial.distance.mahalanobis.html

要计算这个指标,我们需要两个单变量数组和一个协方差矩阵。

在我们的例子中,第一个数组是生成的特征,第二个数组是来自 GMM 的特征平均分布。协方差矩阵也来自 GMM。GMM 是为每个类别分别准备的。同时生成每个特征的平均值、标准偏差和标签。这些都是生成新数据所需要的。

import numpy.linalg as lnalg
from scipy.spatial.distance import mahalanobis

#initialization 
gmms = dict()
desc_df = list()
inv_sig = dict()
arr_classes = np.sort(X.labels.unique())
cols = X.columns.tolist()
pr_c = add_labels(pr.copy(), min=60, max=120, add_noize=0.0)
X = pr_c[pr_c.columns[2:]]
x_train = X.copy()

#create descriptive statistics, train gmm, extract means and covariances for each classes
for ind, cls in enumerate(arr_classes):

    desc_df.append(x_train[x_train['labels'] == cls].describe())

    x_trainGMM = x_train[x_train['labels'] == cls].values[:, :-1]
    gmm = mixture.GaussianMixture(n_components=1, covariance_type='full').fit(x_trainGMM)
    gmms[cls] = (gmm.means_, gmm.covariances_)

    # invert the matrix for mahalanobis calc
    mu, sig = gmms[cls]
    isig = lnalg.inv(sig)
    inv_sig[cls] = mu, isig

生成和选择新数据的一切准备就绪。下面在平均值和偏差的基础上随机生成每个类别的特征,数量比规定的多 60 倍以上。这样做的目的是为了有所选择。并将标签带入 0 -1 状态。

 def brute_force(samples=5000):
    import numpy.linalg as lnalg
    gen = []

    for index_cl, cls in enumerate(arr_classes):

        dlt = samples * 60
        sub_arr = np.zeros((dlt, len(cols), 1))
        
        #generate samples ahd lables for cls class
        col_counter = 0
        for col in cols:
            sub_arr[:, col_counter] = np.random.normal(loc=desc_df[index_cl][col]['mean'],
                                                       scale=desc_df[index_cl][col]['std'],
                                                       size=(dlt, 1)
                                                       )
            col_counter += 1
        sub_arr = sub_arr.reshape((sub_arr.shape[:-1]))

        #normalization lables
        sub_arr[-1] = np.where(sub_arr[-1] >= 0.5, 1, 0)

        mh = np.zeros((arr_classes.shape[0]))
        counter = 0

        #selection of the most successful samples
        for index, i in enumerate(sub_arr):
            for m_index, m_cls in enumerate(arr_classes):
                mu, isig = inv_sig[m_cls]
                mh[m_index] = mahalanobis(i[:-1], mu, isig)
            
            #if gmm assignment the same as the original label add in gen
            if np.argmin(mh) == i[-1]:
                gen = np.append(gen, i)
                counter += 1
            if counter == int(samples / 2):
                break


...

计算每个样本与两个类别的 GMM 平均分布数组之间的马哈拉诺比距离 指数后,会得到一个包含 2 个值的数组,显示生成的样本与两个类别的接近程度。如果标签与之吻合,我们就将其添加到训练样本中。这样我们就得到了一个完全平衡的样本。

但这并不能消除手鼓舞和随机性的复杂关系。但如果你足够努力,就能得到一个正常的结果:

如果我有时间和精力,我会尝试在生成器中播撒 25 到 75 个量级的特征分布,也许会有收获。

我还尝试使用距离指标来评估目标特征的选择。我的想法是,如果标签和目标选择正确,该指标的平均值就会降低。

results = np.zeros(x_train.shape[0])
mh = np.zeros((arr_classes.shape[0]))
for index, i in enumerate(x_train.to_numpy()):
    for m_ind, m_cls in enumerate(arr_classes):
        mu, isig = inv_sig[m_ind]
        mh[m_ind] = mahalanobis(i[:-1], mu, isig)

    if np.argmin(mh) == i[-1]:
        results[index] = mh[np.argmin(mh)]

acc = results.sum() / results.shape[0]

print('Accuracy:', acc)

我运行了所有可用的 "成功 "目标和特征组合,同时也复制了 "不成功 "的组合。通过这种粗略的分析,成功的变体的指标值会降低,而不成功的变体的指标值会升高。这可能有一定的关联性,但您必须进行检查。如果您有任何网格扫描仪版本或 GA,可以查看一下

 
welimorn:

我试着将这种方法集成到文章中的聚类引擎中,但不是作为类平衡方法,而是作为新平衡数据集的生成器。

我运行了所有 "成功 "的目标和属性组合,并复制了 "不成功 "的组合。在这个粗略的分析中,成功变体的指数下降,不成功变体的指数上升。可能存在一定的相关性,但您必须进行检查。如果您有任何网格扫描仪版本或 GA,可以查看一下

还没有扫描仪。太好了,我得仔细看看。到目前为止,我一直在收集可以改进模型的其他方法的信息(除了编码员)。我可能很快就会正式发表一篇文章。

 
Maxim Dmitrievsky:

还没有扫描仪。太好了,我得仔细看看。与此同时,我一直在收集可以改进模型的其他方法的信息(除了编码员)。我可能很快就会正式发表一篇文章。

关于您提到的在搜索过程中结合成功模型的问题,我已经尝试过结合不同属性的成功模型。这种方法可以使历史记录中某些部分的缩减趋于均匀。我还注意到,即使有 R^2 为 0.85-0.95 的模型,添加R^2 为 0.65 以上的模型也能改善结果。

 
welimorn:

除了上述在搜索过程中组合成功模式的方法外,我还尝试了组合具有不同属性的成功模式。这种技术使历史上某些部分的缩减趋于均匀。我还注意到,即使存在 R^2 为 0.85-0.95 的模型,添加R^2 在 0.65 以上的模型也能改善结果。

是的,但代价往往是交易次数减少 10-20%。