Ejemplo n.º 1
0
        protected virtual IDataTransform Create(IHostEnvironment env, Arguments args, IDataView input, out IDataView sourceCtx, IPredictor overwritePredictor)
        {
            sourceCtx = input;
            Contracts.CheckValue(env, "env");
            env.CheckValue(args, "args");
            env.CheckValue(input, "input");

            IPredictor predictor;

            if (overwritePredictor == null)
            {
                throw env.Except("No defined predictor.");
            }
            else
            {
                predictor = overwritePredictor;
            }

            // The function is returning something and modifying a member of the class. Not very fancy.
            _predictor = predictor;

            string feat = TrainUtils.MatchNameOrDefaultOrNull(env, input.Schema,
                                                              "featureColumn", args.featureColumn, DefaultColumnNames.Features);
            int index = SchemaHelper.GetColumnIndex(input.Schema, feat);
            var type  = input.Schema[index].Type;

            if (!type.IsVector() || type.AsVector().ItemType().RawKind() != DataKind.R4)
            {
                throw env.Except("Features must a vector of floats");
            }

            if (args.useProb)
            {
                var valueMapper = predictor as IValueMapperDist;
                if (valueMapper == null)
                {
                    throw env.Except("Predictor must be a IValueMapper.");
                }
                var output = valueMapper.DistType;
                if (output.IsVector())
                {
                    return(CreateTransformValueMapperDist <VBuffer <float>, VBuffer <float>, VBuffer <float> >(valueMapper, feat, args.outputColumn));
                }
                else
                {
                    return(CreateTransformValueMapperDist <VBuffer <float>, VBuffer <float>, float>(valueMapper, feat, args.outputColumn));
                }
            }
            else
            {
                var valueMapper = predictor as IValueMapper;
                if (valueMapper == null)
                {
                    throw env.Except("Predictor must be a IValueMapper.");
                }
                var output = valueMapper.OutputType;
                if (output.IsVector())
                {
                    return(CreateTransformValueMapper <VBuffer <float>, VBuffer <float> >(valueMapper, feat, args.outputColumn));
                }
                else
                {
                    return(CreateTransformValueMapper <VBuffer <float>, float>(valueMapper, feat, args.outputColumn));
                }
            }
        }