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); }
/// <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)); }