C# (ML.NET)如何训练不';不包含标签

C# (ML.NET)如何训练不';不包含标签,c#,machine-learning,ml.net,C#,Machine Learning,Ml.net,对于一家网店,我想创建一个模型,根据某人的愿望列表上的内容给出建议:“某人的愿望列表上有X,我们也推荐Y”场景。问题是,培训师不工作,因为我的数据集中没有适当的标签,或者缺少足够的数据。这会导致float.NAN的数据或预测分数不准确(所有或大部分分数最终都是这样) 我拥有所有现有的愿望列表,以及后续的ProfileId和ItemId(都是整数)。这些被分组在ProfileID-ItemID组合中(表示愿望列表上的一个项目,因此有3个项目的用户将有3个组合)。总的来说,我可以为16000个用户和

对于一家网店,我想创建一个模型,根据某人的愿望列表上的内容给出建议:“某人的愿望列表上有X,我们也推荐Y”场景。问题是,培训师不工作,因为我的数据集中没有适当的标签,或者缺少足够的数据。这会导致float.NAN的数据或预测分数不准确(所有或大部分分数最终都是这样)

我拥有所有现有的愿望列表,以及后续的ProfileId和ItemId(都是整数)。这些被分组在ProfileID-ItemID组合中(表示愿望列表上的一个项目,因此有3个项目的用户将有3个组合)。总的来说,我可以为16000个用户和50000个项目使用大约150000个组合。仅出现在单个愿望列表上的项目(或根本不出现)或其愿望列表上只有一个项目的用户将从培训数据中排除(以上数字已过滤)。如果我愿意,我可以添加额外的数据列,这些数据表示物品所属的类别(玩具、书籍等)、价格和其他元数据

我没有的是收视率,因为网店不使用这些。因此,我不能用它们来代表“标签”

公共类愿望列表项
{
//这些变量是uint32或基于训练算法的单个(浮点)变量。
公共uint ProfileId;
公共uint项目ID;
公众浮标;
}
我希望我需要解决这个问题:

三者的组合或其中之一:

1) 我需要换一个教练。如果是的话,哪一个最合适

2) 我需要为Label变量插入不同的值。如果是,应如何生成

3) 我需要生成不同的“假”数据集来填充训练数据。如果是,应如何生成

对问题的解释和补救失败的尝试

我曾尝试使用不同的培训师解析数据,以了解什么最适合我的数据集:FieldAwareFactorizationMachine、MatrixFactoryizationMachine和OLFilter。我还尝试将MatrixFactorizationMachine用于LossFunctionType.SquareLossOneClass,其中插入了愿望列表上的ItemID组合,而不是ProfileID ItemID组合。(例如,有3项的愿望清单中的第1-2项、第2-3项、第1-3项)

这些机器基于其后续教程中的信息:

  • FieldAware:

  • 矩阵工厂化:

  • 矩阵工厂化(OneClass):

  • 苏丹生命线:

以下是其中一条管道的示例,其他管道非常相似:

string profileEncoded=nameof(WishlistItem.ProfileId)+“Encoded”;
string itemEncoded=nameof(WishlistItem.ItemId)+“Encoded”;
//矩阵分解流水线
var options=新矩阵factorizationtrainer.options{
MatrixColumnIndexColumnName=profileEncoded,
MatrixRowIndexColumnName=itemEncoded,
LabelColumnName=名称(WishlistItem.Label),
NumberOfIterations=100,
近似等级=100
};
trainerEstimator=Context.Transforms.Conversion.MapValueToKey(outputColumnName:profileEncoded,inputColumnName:nameof(WishlistItem.ProfileId))
.Append(Context.Transforms.Conversion.MapValueToKey(outputColumnName:itemEncoded,inputColumnName:nameof(WishlistItem.ItemId)))
.Append(Context.binaryclassion.Trainers.FieldAwareFactorizationMachine(新字符串[]{“Features”}));
为了缓解缺少标签的问题,我尝试了几种变通方法:

  • 将其留空(0f浮点值)
  • 使用itemid、profileid的哈希代码或两者的组合
  • 计算包含特定itemid或profileid的项的数量,并且在一个项被表示数百次的情况下操纵该数字以创建较少的极值。(使用平方根或日志函数,创建
    Label=Math.log(amountoftimes);
    Label=Math.天花(Math.log(amountoftimes)
  • 对于FieldAware机器,标签是布尔值而不是浮点值,上面的计算用于确定浮点结果是否高于所有项目的平均值或低于平均值
测试时,我使用以下两种可能的方法进行测试,以确定可以为项目“X”创建哪些建议“Y”:

  • 使用用户的ProfileID将ItemID X与所有现有项进行比较

列出predictionsForUser=profileMatrix.DistinctBy(x=>x.ItemID)。选择(x=>newwishlistitem(userId,x.GiftId,x.Label));
IDataView transformed=trainedModel.Transform(Context.Data.LoadFromEnumerable(predictionsForUser));
COPURCCHASEPREDICTION[]predictions=Context.Data.CreateEnumerable(已转换,false.ToArray();
IEnumerable results=Enumerable.Range(0,predictions.Length)。ToDictionary(x=>predictionsForUser[x],x=>predictions[x])。其中(x=>OrderByDescending(x=>x.Value.Score)。取(10);
返回结果。选择(x=>x.Key.GiftId.ToString()).ToArray();
  • 将ItemID X与其他人的愿望列表中也有X的项目进行比较。此项用于FieldAware Factorization Trainer,它使用布尔值作为标签
public IEnumerable CreatePredictDataForUser(字符串用户ID,IEnumerable用户项)
{
Dictionary giftIdGroups=profileMatrix.GroupBy(x=>x.GiftId).ToDictionary(x=>x.Key,x=>x.Select(y=>y));
Dictionary profileIdGroup=profileMatrix.GroupBy(x=>x.ProfileId).ToDictionary(x=>x.Key,x=>x.Select(y=>y));
添加(userId,userItems);
列表结果=新列表();
弗雷奇