【问题标题】:How to fix "column has values of Type which is not the same as an earlier observed Type "如何修复“列的类型值与先前观察到的类型不同”
【发布时间】:2019-01-30 10:31:42
【问题描述】:

我正在创建一个机器学习模型,我想从文本文件中读取不同的值并使用CustomMapping 处理它们。程序在运行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 static void Transform(ProfileInput input, ProfileProcess output)
{
  if (input.numberGameBans > 0 || input.numberVacBans > 0)
    output.isBanned = false;

  output.gameBannedFriendsPercent = input.gameBannedFriendsCount / input.friendCount;
  output.vacBannedFriendsPercent = input.vacBannedFriendsCount / input.friendCount;
  output.profileVisibility = input.profileVisibility;
  output.profileConfigured = input.profileConfigured;
  output.lastLogOff = input.lastLogOff;
  output.commentPermission =  input.commentPermission;
  output.timeCreated = input.timeCreated;
  output.friendCount = input.friendCount;
  output.gameBannedFriendsCount = input.gameBannedFriendsCount;
  output.vacBannedFriendsCount = input.vacBannedFriendsCount;
}

个人资料输入:

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: 'Column 'profileVisibility' 有 R4 的值与之前观察到的 Bool 类型不同。'

我希望它能够成功完成代码而不会引发错误,实际输出将是一个 TransformerChain 模型 - 我知道管道还没有训练器,因此该模型将是无用的现在。

【问题讨论】:

标签: c# ml.net


【解决方案1】:

context.Transforms.Concatenate 连接相同类型的列。类型由第一个输入列定义,在您的情况下是“isBanned”。由于这是一个布尔值,因此 Concatenate 期望下一个值也是一个布尔值。

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

【讨论】:

    【解决方案2】:

    您需要做的就是 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"));
    

    希望有帮助

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-12-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多