Как исправить «столбец имеет значения типа, который не совпадает с ранее наблюдаемым типом» - PullRequest
0 голосов
/ 30 января 2019

Я создаю модель машинного обучения, я хочу прочитать различные значения из текстового файла и обработать их, используя CustomMapping.Программа выдает System.InvalidOperationException при запуске CustomMapping.

Я уже сузил причину для моей функции 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"));

Мой CustomMapping:

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

ProfileInput:

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

ProfileProcess:

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 - я понимаю, что в конвейере еще нет тренератак что модель будет бесполезной, как сейчас.

1 Ответ

0 голосов
/ 30 января 2019

Context.Transforms.Concatenate объединяет столбцы одного типа.Тип определяется первым входным столбцом, в вашем случае это isBanned.Так как это bool, Concatenate ожидает, что следующим значением будет также bool.

Если вы собираетесь объединять столбцы вместе, не выполняя для них никакой предварительной обработки, вы можете напрямую загружать их как числа с плавающей точкой (0/1), а не как логические значения.

...