交易中的机器学习:理论、模型、实践和算法交易 - 页 1260

 
Maxim Dmitrievsky:
与katbust - 它返回正常,通常在测试中>0.5...像往常一样

你在katbust中检查了1棵树的森林吗? 而且katbust给出的是交叉熵的输出还是其他错误?

Alglib给出了5个不同的错误。(这是我的例子,有1棵树)

提醒: 训练集误差估计报告:relclserror=0.267;avgce=184.207;rmserror=0.516;avgerror=0.267;avgrelerror=0.267。

 

不,提升的构建方式不同,它增加了树的数量,而熵却在减少,当它在n次迭代中开始增长时,它就停止了,这样就不会使模型过度复杂化。

它给出了熵和任何自定义指标,但建立在熵的基础上。

顺便说一下,alglib网站的英文版有一个新的、更快的森林......我想重写它,但找不到它 )

 
看了一下xgboost 的文档。这不是交叉熵的输出,而是
误差--二元分类错误率。它的计算方法是(#错误案例)/(#所有案例)。
默认情况下,它使用预测值的0.5阈值来定义负面和正面的实例。
不同的阈值(例如,0.)可以指定为 "错误@0"。
 
elibrarius
看了一下xgboost的文档。它没有一个交叉熵的输出,但
error - 二元分类错误率。它的计算方法是(#错误案例)/(#所有案例)。
默认情况下,它使用预测值的0.5阈值来定义负面和正面的实例。
不同的阈值(例如,0.)可以指定为 "错误@0"。

是的,这里的分类错误是默认使用的,显然是这样的

但你必须区分,提升使用错误停止,而森林只是后发制人,和树木在充分的深度
 
马克西姆-德米特里耶夫斯基

不,提升的构建方式不同,它增加了树的数量,而熵却在减少,当它在n次迭代中开始增长时,它就停止了,这样就不会使模型过度复杂化。

它给出了熵和任何自定义指标,但建立在熵的基础上。

在英语版本的alglib网站上,我发布了新的、更快的森林,顺便说一下......我想重写它,但我找不到它 )

新的alglib在哪里--我可以在论坛的某个地方寻找它吗?比较这个函数的代码很有意思

 
elibrarius

新的alglib在哪里--在论坛中是否有地方可以找?有意思的是,比较这个函数的代码

不,它是用C++或C#编写的

http://www.alglib.net/arcnews.php#date_16_06_2018

  • 改进的随机森林构建算法,比以前的版本快2倍到10倍,产生的森林数量级更小。
NEWS Archive
  • www.alglib.net
The news archive contains the list of all news, 44 in total. The latest news are at the news page.
 
马克西姆-德米特里耶夫斯基

不,它是用C++或C#编写的

http://www.alglib.net/arcnews.php#date_16_06_2018

  • 改进的随机森林构建算法,比以前的版本快2倍到10倍,产生的森林数量级更小。

谢谢!

 
elibrarius

谢谢你!

如果你会弄清楚并进行比较,让我知道:)你可以这样改写,如果不是太麻烦的话。目前森林的文件太大,如果能减少它们就好了。而加速也是一种奖励。

 

感谢马克西姆的倡议,我已经解禁了!谢谢你,马克西姆。

我已经在桑拿房里呆了一段时间,并在叶子上运行了我的EA,也就是我在新年前写的那个。 到目前为止,结果是负面的,但我认为我必须给它更多的时间,因为在新年的强劲走势之后,Si现在处于持平状态,而这在EA开始时还没有发生。

测试是在具有丰富历史和不良经验的账户上以最小的数量进行的,因此不会有公开的信号,我将在以后的统计中发布报告。我是为那些对我的方法是否有利可图感兴趣的人做的。

关于CatBoost'a,因为我有非常小的模型,1-30棵左右,那么面临的情况是,测试(在其上选择模型)和考试(在其上独立测试)样本可以显示非常好的财务结果,但在训练样本上的结果却非常弱。因此,现在我在所有三个样本上测试这个模型,如果我对它感到满意,我就选择它。因此,我建议也看一下训练样本,我没有这样做,因为我期望与树叶(我的替代方法,只选择树叶)或脚手架有相同的效果,即模型在测试样本上一定会表现良好,但事实证明,情况并非总是如此。

到目前为止,选择模型的标准问题对我来说是开放的,经过测试,在10万个样本中训练好的模型(对于一些金融指标 和标准模型)不超过10-30件,这当然是不够的。我们应该降低标准或创造更多的模型。Catbust有很多不同的参数,所以你可以铆接很多模型。

另一方面,我真的希望通过显卡进行训练,但事实证明1060的作用很小--到目前为止的实验表明,训练200个模型需要20分钟,而在G3900处理器上(实际上是LGA1151下的渣滓)只需要6分钟同时,处理器总是加载50%到60%,这使得它无法同时使用2块以上的显卡,而我对6块显卡的装备寄予厚望。我不知道为什么会发生这种情况,理论上一切都应该是快速的。GPU计算的最大瓶颈是模型从RAM到GPU之间的传输,但对我来说太慢了,也许传输发生在每次迭代之后,这就是滞后的原因。还有人试过在GPU上运行吗?

 
马克西姆-德米特里耶夫斯基

如果你会弄清楚并进行比较,让我知道:)你可以这样改写,如果不是太麻烦的话。目前森林的文件太大,如果能减少它们就好了。是的,而且加速也是一种奖励。

我比较了一下,下面有同样的一段未使用的代码。(2009年签署,即这部分没有进行编辑)


             Copyright 16.02.2009 by Bochkanov Sergey
        *************************************************************************/
        public static double dfavgce(decisionforest df,
            double[,] xy,
            int npoints,
            alglib.xparams _params)
        {
            double result = 0;
            double[] x = new double[0];
            double[] y = new double[0];
            int i = 0;
            int j = 0;
            int k = 0;
            int tmpi = 0;
            int i_ = 0;

            x = new double[df.nvars-1+1];
            y = new double[df.nclasses-1+1];
            result = 0;
            for(i=0; i<=npoints-1; i++)
            {
                for(i_=0; i_<=df.nvars-1;i_++)
                {
                    x[i_] = xy[i,i_];
                }
                dfprocess(df, x, ref y, _params);
                if( df.nclasses>1 )
                {
                   
                    //
                    // classification-specific code
                    //
                    k = (int)Math.Round(xy[i,df.nvars]);
                    tmpi = 0;
                    for(j=1; j<=df.nclasses-1; j++)
                    {
                        if( (double)(y[j])>(double)(y[tmpi]) )
                        {
                            tmpi = j;
                        }
                    }

                    if( (double)(y[k])!=(double)(0) )
                    {
                        result = result-Math.Log(y[k]);
                    }
                    else
                    {
                        result = result-Math.Log(math.minrealnumber);
                    }
                }
            }
            result = result/npoints;
            return result;
        }