我使用 ML.NET 矩阵分解开发了一个产品推荐器。 训练数据仅包含产品 ID 对,因此我根据 Microsoft 文档调整了训练器。
有两个问题:
1- 每次我使用完全相同的数据训练模型时,同一产品都会得到不同的最高分结果。
2- 有时,结果甚至没有意义,因为当询问男士产品的建议时,会建议女士产品。训练数据产品对始终是男性产品对或女性产品对,从不混合。
数据处理管道似乎是正确的:
产品 ID 是文本,因此我使用 ML.NET MapValueToKey 对它们进行标准化。
var dataProcessPipeline = mlContext.Transforms.Conversion
.MapValueToKey("CoPurchaseProductIdEncoded", "CoPurchaseProductId")
.Append(MLContext.Transforms.Conversion.MapValueToKey("ProductIdEncoded","ProductId"));
传递给培训师的选项是:
MatrixFactorizationTrainer.Options options = new MatrixFactorizationTrainer.Options();
options.MatrixColumnIndexColumnName = "ProductIdEncoded";
options.MatrixRowIndexColumnName = "CoPurchaseProductIdEncoded";
options.LabelColumnName = "Label";
options.LossFunction = MatrixFactorizationTrainer.LossFunctionType.SquareLossOneClass;
options.Alpha = 0.01;
options.Lambda = 0.025;
options.NumberOfIterations = 500;
var est = MLContext.Recommendation().Trainers.MatrixFactorization(options);
您没有展示如何构建
MLContext
,但我怀疑您没有传递固定的seed
值。这样做会给你确定性的结果。请参阅文档中的备注部分。
这些模型并不完美,因此不同的产品组会有一些渗透。如果您想将建议限制为不同的组,您可以训练两个模型或随后过滤建议。