C# “如何修复”;列的值的类型与以前观察到的类型不同;

C# “如何修复”;列的值的类型与以前观察到的类型不同;,c#,ml.net,C#,Ml.net,我正在创建一个机器学习模型,我想从文本文件中读取不同的值,并使用自定义映射处理它们。当运行CustomMapping时,程序抛出一个System.InvalidOperationException 我已经将原因缩小到我的CustomMapping函数,我正在读取的文本文件没有任何空值。我已经仔细检查了所有变量声明,并确保它们都使用了正确的类型。我的直觉是,自定义映射将1和0解释为布尔值,而不是浮点值,尽管我认为没有理由这样做 为大量的垃圾道歉,问题是关于类型的问题,所以我认为展示所有内容是很重要

我正在创建一个机器学习模型,我想从文本文件中读取不同的值,并使用
自定义映射处理它们。当运行
CustomMapping
时,程序抛出一个
System.InvalidOperationException

我已经将原因缩小到我的
CustomMapping
函数,我正在读取的文本文件没有任何空值。我已经仔细检查了所有变量声明,并确保它们都使用了正确的类型。我的直觉是,自定义映射将1和0解释为布尔值,而不是浮点值,尽管我认为没有理由这样做

为大量的垃圾道歉,问题是关于类型的问题,所以我认为展示所有内容是很重要的

我的管道:

var pipeline = context.Transforms.CustomMapping<ProfileInput, ProfileProcess>(ProfileMapping.Transform, nameof(ProfileMapping))
.Append(context.Transforms.Concatenate("Features", "isBanned", "profileVisibility", "profileConfigured", "lastLogOff", "commentPermission", "timeCreated", "friendCount", "gameBannedFriendsCount", "vacBannedFriendsCount", "gameBannedFriendsPercent", "vacBannedFriendsPercent"));
档案输入:

public class ProfileInput
{
  [LoadColumn(0)]
  public bool commentPermission;
  [LoadColumn(1)]
  public float lastLogOff;
  [LoadColumn(2)]
  public bool profileConfigured;
  [LoadColumn(3)]
  public float profileVisibility;
  [LoadColumn(4)]
  public float timeCreated;
  [LoadColumn(5)]
  public float numberVacBans;
  [LoadColumn(6)]
  public float numberGameBans;
  [LoadColumn(7)]
  public float vacBannedFriendsCount;
  [LoadColumn(8)]
  public float gameBannedFriendsCount;
  [LoadColumn(9)]
  public float friendCount;
}
档案处理:

public class ProfileProcess
{
  public bool isBanned;
  public float profileVisibility;
  public bool profileConfigured;
  public float lastLogOff;
  public bool commentPermission;
  public float timeCreated;
  public float friendCount;
  public float gameBannedFriendsCount;
  public float vacBannedFriendsCount;
  public float gameBannedFriendsPercent;
  public float vacBannedFriendsPercent;
}
运行
pipeline.fit()
时,出现以下异常:

System.InvalidOperationException:'列'profileVisibility'已更改 R4的值与之前观察到的Bool类型不同。”


我希望它能够在不抛出错误的情况下成功完成代码,实际输出将是TransformerChain模型-我知道管道中还没有培训师,因此该模型将一事无成。

context.Transforms.Concatenate连接相同类型的列。该类型由第一个输入列定义,在您的示例中为“isbanked”。因为这是一个bool,Concatenate期望下一个值也是bool


如果要将列连接在一起,而不需要对它们进行任何其他预处理,则可以直接将它们作为浮点(0/1)而不是布尔值加载

您只需对非浮点列进行OneHotEncode即可

.Append(context.Transforms.Categorical.OneHotEncoding(outputColumnName: "isBannedEncoded", inputColumnName: "isBanned"))
.Append(context.Transforms.Categorical.OneHotEncoding(outputColumnName: "profileConfiguredEncoded", inputColumnName: "profileConfigured"))
.Append(context.Transforms.Categorical.OneHotEncoding(outputColumnName: "commentPermissionEncoded", inputColumnName: "commentPermission"))

.Append(context.Transforms.Concatenate("Features", "isBannedEncoded", "profileVisibility", "profileConfiguredEncoded", "lastLogOff", "commentPermissionEncoded", "timeCreated", "friendCount", "gameBannedFriendsCount", "vacBannedFriendsCount", "gameBannedFriendsPercent", "vacBannedFriendsPercent"));

希望这有帮助

这里已经有人有同样的问题了
.Append(context.Transforms.Categorical.OneHotEncoding(outputColumnName: "isBannedEncoded", inputColumnName: "isBanned"))
.Append(context.Transforms.Categorical.OneHotEncoding(outputColumnName: "profileConfiguredEncoded", inputColumnName: "profileConfigured"))
.Append(context.Transforms.Categorical.OneHotEncoding(outputColumnName: "commentPermissionEncoded", inputColumnName: "commentPermission"))

.Append(context.Transforms.Concatenate("Features", "isBannedEncoded", "profileVisibility", "profileConfiguredEncoded", "lastLogOff", "commentPermissionEncoded", "timeCreated", "friendCount", "gameBannedFriendsCount", "vacBannedFriendsCount", "gameBannedFriendsPercent", "vacBannedFriendsPercent"));