Accord.net Codification не может обрабатывать нестроки

Я пытаюсь использовать библиотеку Accord.net для создания метода тестирования нескольких алгоритмов машинного обучения, поддерживаемых библиотекой. .

Одна из проблем, с которыми я столкнулся, заключается в том, что когда я пытаюсь кодифицировать свои строковые данные, класс кодификации, похоже, не способен работать с какими-либо столбцами данных, которые не являются строками, несмотря на то, что в документации говорится об обратном.

Codification codebook = new Codification(fulldata, AllAttributeNames);

Я называю эту строку, где fulldata является datatable, и я попытался включить столбцы как типа Int32, так и типа Double, и класс Codification выдал ошибку, говоря, что он не может преобразовать их в тип String.

«System.InvalidCastException:« Невозможно преобразовать объект типа« System.Double »в тип« System.String »».

РЕДАКТИРОВАТЬ: Оказывается, эта ошибка связана с тем, что система кодирования может обрабатывать альтернативные типы данных только в том случае, если она кодирует всю таблицу. Я полагаю, что вижу здесь логику, хотя я бы предпочел лучшую ошибку или чтобы метод был немного умнее.

Теперь у меня возникла другая проблема, связанная с этим. После изменения моего кода на это:

Codification codebook = new Codification(fulldata);

Затем я учусь. Изучай (вводы, выводы) мой алгоритм и хочу использовать только что обученный алгоритм. Таким образом, следующим шагом будет взять набор тестовых данных, убедиться, что они соответствуют кодировке кодовых книг, и отправить их через алгоритм. К сожалению, когда я пытаюсь использовать

int[][] testinput = codebook.Transform(testData, inputColumnNameArray);

Он взрывается, утверждая, что не может найти сопоставление для преобразования. Это делается со ссылкой на столбец Integer, который кодовая книга правильно не сопоставила с новыми значениями. Итак, теперь кажется, что этот метод Transform не может обрабатывать столбцы, не являющиеся строками, и я не нашел его перегруженного варианта, хотя документация указывает, что это должно быть в состоянии справиться с этим.

Кто-нибудь знает, как обойти эту проблему, не создавая вручную весь массив int[][] testinput по одному значению за раз?


person Jereme Guenther    schedule 16.10.2019    source источник


Ответы (1)


Оказывается, в конце концов я смог ответить на свой вопрос.

Насколько я могу судить, у класса кодификации есть два метода его использования. Конструктору, который принимает список имен столбцов, а также методам Transform не хватает интеллекта при работе с нестроковыми типами данных, возможно, эти методы исчезнут в будущем.

Конструктор, который просто принимает данные, а также метод Apply способны обрабатывать типы данных, отличные от строк. Как только я переключился на использование этих двух методов, мои ошибки исчезли.

Codification codebook = new Codification(fulldata);
int[][] testinput = codebook.Apply(testData, inputColumnNameArray);

Путаница для меня заключалась в том, что весь код примера, казалось бы, случайным образом использует эти два метода, но использует метод Apply только при обработке обучающих данных и использует метод Transform при кодировании тестовых данных.

Я не уверен, почему они решили сделать это в коде примера документации, но мне определенно потребовалось много времени, чтобы понять, что происходит, достаточно, чтобы избавиться от этой конкретной проблемы.

person Jereme Guenther    schedule 16.10.2019