Esempio n. 1
0
        private void PredictForCFModel(MLEntityPredictor predictor)
        {
            var modelLoader = ClassFactory.Get <IMLModelLoader>();

            if (!modelLoader.TryLoadModelForPrediction(UserConnection, MLModelId, out MLModelConfig modelConfig))
            {
                throw new InvalidObjectStateException($"Recommendation model with id {MLModelId} was not found"
                                                      + " or not ready for making predictions.");
            }
            if (modelConfig.CFResultSchemaUId.IsEmpty())
            {
                throw new NotImplementedException($"Model {MLModelId} is not configured for saving results");
            }
            EntitySchema modelRootSchema = UserConnection.EntitySchemaManager
                                           .GetInstanceByUId(modelConfig.EntitySchemaId);
            EntitySchemaQuery usersEsq = GetCFSchemaDataEsq(modelRootSchema,
                                                            modelConfig.CFUserColumnPath, CFUserFilterData);
            IEnumerable <Guid> users    = ReadCFData(usersEsq);
            EntitySchemaQuery  itemsEsq = GetCFSchemaDataEsq(modelRootSchema, modelConfig.CFItemColumnPath,
                                                             CFItemFilterData);
            bool isItemsFilterEmpty                       = itemsEsq.Filters.IsEmpty();
            IEnumerable <Guid>            items           = isItemsFilterEmpty ? Enumerable.Empty <Guid>() : ReadCFData(itemsEsq);
            RecommendationFilterItemsMode filterItemsMode = isItemsFilterEmpty
                                ? RecommendationFilterItemsMode.Black
                                : RecommendationFilterItemsMode.White;

            predictor.Recommend(MLModelId, users.ToList(), CFTopN, items.ToList(),
                                filterItemsMode: filterItemsMode, filterAlreadyInteractedItems: CFFilterAlreadyInteractedItems);
        }
Esempio n. 2
0
        /// <summary>
        /// Performs recommendation for specified users.
        /// </summary>
        /// <param name="model">Model instance.</param>
        /// <param name="users">Users to get recommendation.</param>
        /// <param name="recordsCount">Number of items to recommend for each user.</param>
        /// <param name="filterItems">Items to filter.</param>
        /// <param name="filterItemsMode">Mode of filter,</param>
        /// <param name="filterAlreadyInteractedItems">Filter out already interacted items from prediction.</param>
        /// <param name="userItems">Updated users items.</param>
        /// <param name="recalculateUsers">Recalculate users recommendations using <see cref="userItems"/></param>
        public RecommendationResponse Recommend(MLModelConfig model, List <Guid> users, int recordsCount = 10,
                                                List <Guid> filterItems = null,
                                                RecommendationFilterItemsMode filterItemsMode = RecommendationFilterItemsMode.White,
                                                bool filterAlreadyInteractedItems             = true, List <DatasetValue> userItems = null,
                                                bool recalculateUsers = false)
        {
            RecommendationRequest request = new RecommendationRequest {
                ModelId          = model.ModelInstanceUId,
                PredictionParams = new RecommendationInput {
                    UserIds = users.Select(e => e.ToString()).ToList(),
                    PredictionRecordsCount       = recordsCount,
                    FilterItems                  = filterItems?.Select(e => e.ToString()).ToList() ?? new List <string>(),
                    FilterItemsMode              = filterItemsMode.ToString().ToLowerInvariant(),
                    FilterAlreadyInteractedItems = filterAlreadyInteractedItems,
                    UserItems        = userItems,
                    RecalculateUsers = recalculateUsers
                }
            };

            return(Post <RecommendationResponse>(model.PredictionEndpoint, request, RecommendationTimeoutSec));
        }