protected override Delegate[] CreatePredictionGetters(Booster xgboostModel, IRow input, Func <int, bool> predicate)
        {
            var active = Utils.BuildArray(OutputSchema.ColumnCount, predicate);

            xgboostModel.LazyInit();
            var getters = new Delegate[1];

            if (active[0])
            {
                var             featureGetter  = RowCursorUtils.GetVecGetterAs <Float>(PrimitiveType.FromKind(DataKind.R4), input, InputSchema.Feature.Index);
                VBuffer <Float> features       = default(VBuffer <Float>);
                var             postProcessor  = Parent.GetOutputPostProcessor();
                VBuffer <Float> prediction     = default(VBuffer <Float>);
                int             expectedLength = input.Schema.GetColumnType(InputSchema.Feature.Index).VectorSize;
                var             xgboostBuffer  = Booster.CreateInternalBuffer();

                ValueGetter <Float> localGetter = (ref Float value) =>
                {
                    featureGetter(ref features);
                    Contracts.Assert(features.Length == expectedLength);
                    xgboostModel.Predict(ref features, ref prediction, ref xgboostBuffer);
                    value = prediction.Values[0];
                    postProcessor(ref value);
                };

                getters[0] = localGetter;
            }
            return(getters);
        }
예제 #2
0
        protected override Delegate[] CreatePredictionGetters(Booster xgboostModel, IRow input, Func <int, bool> predicate)
        {
            var active = Utils.BuildArray(OutputSchema.ColumnCount, predicate);

            xgboostModel.LazyInit();
            var getters = new Delegate[1];

            if (active[0])
            {
                var             featureGetter   = RowCursorUtils.GetVecGetterAs <Float>(PrimitiveType.FromKind(DataKind.R4), input, InputSchema.Feature.Index);
                VBuffer <Float> features        = new VBuffer <Float>();
                var             postProcessor   = Parent.GetOutputPostProcessor();
                int             expectedLength  = input.Schema.GetColumnType(InputSchema.Feature.Index).VectorSize;
                var             xgboostBuffer   = Booster.CreateInternalBuffer();
                int             nbMappedClasses = _classMapping == null ? 0 : _numberOfClasses;

                if (nbMappedClasses == 0)
                {
                    ValueGetter <VBuffer <Float> > localGetter = (ref VBuffer <Float> prediction) =>
                    {
                        featureGetter(ref features);
                        Contracts.Assert(features.Length == expectedLength);
                        xgboostModel.Predict(ref features, ref prediction, ref xgboostBuffer);
                        postProcessor(ref prediction);
                    };
                    getters[0] = localGetter;
                }
                else
                {
                    ValueGetter <VBuffer <Float> > localGetter = (ref VBuffer <Float> prediction) =>
                    {
                        featureGetter(ref features);
                        Contracts.Assert(features.Length == expectedLength);
                        xgboostModel.Predict(ref features, ref prediction, ref xgboostBuffer);
                        Contracts.Assert(prediction.IsDense);
                        postProcessor(ref prediction);
                        var indices = prediction.Indices;
                        if (indices == null || indices.Length < _classMapping.Length)
                        {
                            indices = new int[_classMapping.Length];
                        }
                        Array.Copy(_classMapping, indices, _classMapping.Length);
                        prediction = new VBuffer <float>(nbMappedClasses, _classMapping.Length, prediction.Values, indices);
                    };
                    getters[0] = localGetter;
                }
            }
            return(getters);
        }