Accord.net Кодификация не может обрабатывать не-строки - PullRequest
1 голос
/ 16 октября 2019

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

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

Codification codebook = new Codification(fulldata, AllAttributeNames);

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

"System.InvalidCastException: 'Unable toприведение объекта типа 'System.Double' к типу 'System.String'. '"

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

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

Codification codebook = new Codification(fulldata);

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

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

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

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

1 Ответ

1 голос
/ 16 октября 2019

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

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

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

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

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

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

...