Ищем реализацию C++ алгоритма C4.5

Я искал реализацию C++ алгоритма C4.5, но не нашел еще не смог найти. Я нашел C4.5 Release 8 от Quinlan, но он написан на C... кто-нибудь видел открытые исходные C++ реализации алгоритма C4.5?

Я думаю о портировании исходного кода J48 (или просто написание оболочки вокруг версии C), если я не могу найти реализацию C++ с открытым исходным кодом, но я надеюсь, что мне не придется этого делать! Пожалуйста, дайте мне знать, если вы столкнулись с реализацией алгоритма на C++.

Обновлять

Я рассматривал вариант написания тонкой оболочки C++ вокруг реализации C алгоритма C5.0 (C5.0 — улучшенная версия C4.5). Я скачал и скомпилировал реализацию алгоритма C5.0 на языке C, но не похоже, чтобы его было легко перенести на C++. Реализация C использует множество глобальных переменных, и простое написание тонкой оболочки C++ вокруг функций C не приведет к объектно-ориентированному дизайну, поскольку каждый экземпляр класса будет изменять одни и те же глобальные параметры. Другими словами: У меня не будет инкапсуляции, а это довольно простая вещь, которая мне нужна.

Чтобы получить инкапсуляцию, мне нужно будет полностью портировать код C на C++, что примерно так же, как портировать версию Java (J48) на C++.

Обновление 2.0

Вот некоторые конкретные требования:

  1. Каждый экземпляр классификатора должен инкапсулировать свои собственные данные (т. е. никаких глобальных переменных, кроме постоянных).
  2. Поддержка одновременного обучения классификаторов и одновременной оценки классификаторов.

Вот хороший сценарий: предположим, я выполняю 10-кратную перекрестную проверку, я хотел бы одновременно обучить 10 деревьев решений с их соответствующим фрагментом обучающего набора. Если бы я просто запускал программу C для каждого слайса, мне пришлось бы запускать 10 процессов, что не так уж и ужасно. Однако, если мне нужно классифицировать тысячи выборок данных в режиме реального времени, мне придется начинать новый процесс для каждой выборки, которую я хочу классифицировать, а это не очень эффективно.


person Kiril    schedule 25.05.2012    source источник
comment
очень интересная страница, на ней даже не упоминается, что такое программное обеспечение   -  person lurscher    schedule 25.05.2012
comment
@lurscher Я думаю, что это просто его страница загрузки ... он, вероятно, предполагает, что если вы там, вы, вероятно, уже знаете, что такое C4.5.   -  person Kiril    schedule 25.05.2012
comment
Алгоритм построения деревьев решений. Вики для заинтересованных   -  person G. Martinek    schedule 25.05.2012
comment
Я не понимаю... вопрос игнорируется и закрывается?   -  person Kiril    schedule 25.05.2012
comment
@Lirik: тоже не понял, возможно, первую версию вашего вопроса было трудно получить? он открыт в 4/5, так что, надеюсь, мы скоро туда доберемся.   -  person Matthieu M.    schedule 25.05.2012
comment
Голосование по открытию - ИМХО вполне правомерный вопрос. Кроме того, это не ответ, но может быть полезен для других - Weka Реализация C4.5 с открытым исходным кодом, но она написана на java.   -  person amit    schedule 25.05.2012
comment
Где я могу найти ...? вопросы обычно закрыты.   -  person BNL    schedule 25.05.2012
comment
@amit J48 - это версия C4.5 Weka ... Я думаю о ее переносе (наихудший сценарий).   -  person Kiril    schedule 25.05.2012
comment
Вы бы предпочли портировать его с Java вместо того, чтобы писать оболочку C++ поверх версии C? Также доступен преемник C4.5 под названием C5.0: rulequest.com/see5-info.html< /а>   -  person Eugen Constantin Dinca    schedule 25.05.2012
comment
@EugenConstantinDinca да, я изучал код C и сначала подумал, что с ним слишком сложно работать, но создание оболочки на C ++ будет намного быстрее, чем перенос с Java. Кажется лучшим вариантом, если реализация C++ недоступна.   -  person Kiril    schedule 25.05.2012
comment
@NicolBolas Я думаю, что комментарий о том, что SO не является фермой ссылок, предназначен для решения проблемы создания ссылок на ваш собственный веб-сайт для повышения рейтинга вашей страницы: в этом вопросе я не публиковал ссылку ни на один из моих личных материалов. , поэтому я не знаю, как это применимо. Я также искал в Google, но не нашел реализации алгоритма на С++.   -  person Kiril    schedule 25.05.2012
comment
Неужели сложно преобразовать его в c++?   -  person Saeed Amiri    schedule 25.05.2012
comment
@SaeedAmiri Я все еще изо всех сил пытаюсь скомпилировать его в Windows ... как только я закончу с этим, мне придется сделать оболочку C ++. Вероятно, это не так сложно, но было бы намного проще, если бы уже существовала версия на C++.   -  person Kiril    schedule 25.05.2012
comment
Возьмите порт в качестве упражнения, это улучшит ваше мастерство.   -  person Gold    schedule 29.05.2012
comment
@Gold Улучшать свои навыки всегда здорово, но я чувствую, что собираюсь потратить значительное количество времени на перенос кода C на C++. Я хотел бы избежать этого, потому что это время, которое я мог бы вместо этого потратить на обучение и тестирование алгоритмов.   -  person Kiril    schedule 29.05.2012


Ответы (3)


Возможно, я нашел возможную C++ "реализацию" C5.0 (см. 0), но я не смог достаточно изучить исходный код, чтобы определить, действительно ли он работает так, как рекламируется.

Чтобы повторить мои первоначальные опасения, автор порта говорит следующее об алгоритме C5.0:

Еще одним недостатком See5Sam [C5.0] является невозможность иметь более одного дерева приложений одновременно. Приложение считывается из файлов каждый раз, когда запускается исполняемый файл, и тут и там сохраняется в глобальных переменных.

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

Обновлять

Выглядит неплохо, вот интерфейс C++:

class CMee5
{
  public:

    /**
      Create a See 5 engine from tree/rules files.
      \param pcFileStem The stem of the See 5 file system. The engine
             initialisation will look for the following files:
              - pcFileStem.names Vanilla See 5 names file (mandatory)
              - pcFileStem.tree or pcFileStem.rules Vanilla See 5 tree or rules
                file (mandatory)
              - pcFileStem.costs Vanilla See 5 costs file (mandatory)
    */
    inline CMee5(const char* pcFileStem, bool bUseRules);

    /**
      Release allocated memory for this engine.
    */
    inline ~CMee5();

    /**
      General classification routine accepting a data record.
    */
    inline unsigned int classifyDataRec(DataRec Case, float* pOutConfidence);

    /**
      Show rules that were used to classify the last case.
      Classify() will have set RulesUsed[] to
      number of active rules for trial 0,
      first active rule, second active rule, ..., last active rule,
      number of active rules for trial 1,
      first active rule, second active rule, ..., last active rule,
      and so on.
    */
    inline void showRules(int Spaces);

    /**
      Open file with given extension for read/write with the actual file stem.
    */
    inline FILE* GetFile(String Extension, String RW);

    /**
      Read a raw case from file Df.

      For each attribute, read the attribute value from the file.
      If it is a discrete valued attribute, find the associated no.
      of this attribute value (if the value is unknown this is 0).

      Returns the array of attribute values.
    */
    inline DataRec GetDataRec(FILE *Df, Boolean Train);
    inline DataRec GetDataRecFromVec(float* pfVals, Boolean Train);
    inline float TranslateStringField(int Att, const char* Name);

    inline void Error(int ErrNo, String S1, String S2);

    inline int getMaxClass() const;
    inline int getClassAtt() const;
    inline int getLabelAtt() const;
    inline int getCWtAtt() const;
    inline unsigned int getMaxAtt() const;
    inline const char* getClassName(int nClassNo) const;
    inline char* getIgnoredVals();

    inline void FreeLastCase(void* DVec);
}

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

person Kiril    schedule 04.06.2012

Реализация C++ для C4.5 под названием YaDT доступна здесь, в разделе "Дерева решений":
http://www.di.unipi.it/~ruggieri./software.html

Это исходный код последней версии:
http://www.di.unipi.it/~ruggieri/YaDT/YaDT1.2.5.zip

Из бумаги, где описывается инструмент:

[...] В этой статье мы описываем новую реализацию C ++ с нуля алгоритма индукции дерева решений, который дает деревья решений на основе энтропии в стиле C4.5. Реализация называется YaDT, что является аббревиатурой от Еще один конструктор дерева решений. Предполагаемый вклад этой статьи состоит в том, чтобы представить принципы разработки реализации, которая позволила получить высокоэффективную систему. Мы обсуждаем наш выбор в отношении представления памяти и моделирования данных и метаданных, алгоритмической оптимизации и ее влияния на производительность памяти и времени, а также компромисс между эффективностью и точностью эвристики обрезки. [...]

Документ доступен здесь.

person gRizzlyGR    schedule 10.12.2014
comment
Привет, @gRizzlyGR, спасибо за ссылки. Чтобы избежать гниения ссылок, не могли бы вы немного рассказать о решении, поэтому, даже если ссылки сломаются, этот ответ все равно будет полезен? Спасибо - person StackExchange What The Heck; 10.12.2014
comment
Привет, @yochannah, я добавила выдержку из документа об инструменте. Сейчас все в порядке? К сожалению, я не могу напрямую связать статью из-за моей низкой репутации. - person gRizzlyGR; 10.12.2014

Если я правильно понимаю... кажется, что это организовано не как C API, а как программа C. Набор данных загружается, затем он запускает алгоритм и возвращает вам некоторые описания правил.

Я думаю, что путь, по которому вы должны пойти, зависит от того, будете ли вы:

  1. просто нужен интерфейс C++ для предоставления данных и получения правил из существующего движка, или...

  2. вам нужна реализация C++, с которой вы можете повозиться, чтобы настроить алгоритм для своих целей

Если вы хотите (1), то вы действительно можете просто создать программу как процесс, ввести ее в виде строк и получить вывод в виде строк. Вероятно, это был бы самый простой и наиболее перспективный способ разработки «оболочки», и тогда вам нужно было бы только разработать классы C++ для представления входных данных и моделирования результатов правила (или сопоставить существующие классы с этими абстракциями).

Но если вы хотите (2)... тогда я бы предложил попробовать любые хаки, которые вы имеете в виду, поверх существующего кода на C или Java - в зависимости от того, что вам удобнее. Таким образом вы узнаете код, и если у вас есть какие-либо улучшения, вы сможете передать их автору. Если вы строите отношения в долгосрочной перспективе, то, возможно, вы могли бы сотрудничать и постепенно переводить кодовую базу C на C++, по одному аспекту за раз, как и был разработан язык.

Думаю, я просто думаю, что философия «Когда в Риме» обычно работает лучше, чем «Порт-на-одном», особенно в начале.


ОТВЕТ НА ОБНОВЛЕНИЕ: Изоляция процесса решает проблему с вашей глобальной переменной. Что касается производительности и размера набора данных, у вас есть ровно столько ядер/процессоров и памяти, сколько у вас есть. Используете ли вы процессы или потоки, обычно это не проблема, когда вы говорите о масштабах на этом уровне. Накладные расходы возникают, если сортировка слишком дорога.

Докажите, что маршаллинг является узким местом и в какой степени... и вы сможете обосновать, почему процесс является проблемой по сравнению с потоком. Но в существующий код могут быть внесены небольшие изменения, удешевляющие сортировку и не требующие перезаписи.

person HostileFork says dont trust SE    schedule 29.05.2012
comment
Правильно, из того, что я могу сказать, это больше программа C, чем C API. Проблема в том, что мне нужно классифицировать несколько экземпляров данных в режиме реального времени, поэтому не очень эффективно и быстро начинать новый процесс для каждого экземпляра данных, который мне нужно классифицировать. Наконец, я не могу дождаться, чтобы собрать экземпляры данных вместе или, в лучшем случае, я могу собрать около 300 экземпляров данных в секунду (опять же, вероятно, все еще не очень эффективно запускать/останавливать 10 процессов каждую секунду). Обратите внимание, что я использую 10-кратную перекрестную проверку, поэтому у меня есть 10 классификаторов для оценки при прогнозировании. - person Kiril; 29.05.2012
comment
У меня такое ощущение, что я остался с вариантом 2, несмотря на то, что мне не особо хочется возиться с алгоритмом или модифицировать его. - person Kiril; 29.05.2012
comment
Вы знаете, многие современные браузеры, такие как Chrome, создают процесс для каждой вкладки. То, как ОС справляется с вещами, она разделяет кодовые страницы в памяти для общих процессов одного и того же исполняемого образа ... вы можете быть удивлены тем, что она может осуществить. Выполняйте простые тесты и проверяйте производительность прежде чем делать предположения, и даже тогда... когда вы обнаружите узкое место, вы можете обнаружить, что нужные вам настройки намного проще, чем переписывать! Возможно, простая и в целом полезная функция восходящей ветки кодовой базы C может помочь заполнить любой пробел, который вы обнаружите. - person HostileFork says dont trust SE; 29.05.2012
comment
Да, сложная часть с несколькими процессами — это IPC, потому что нам нужно загрузить классификатор из файла, держать процесс открытым и продолжать подавать ему экземпляры данных из основного процесса. Кроме того, идея защиты вашего приложения от сбоя в случае сбоя одного из процессов классификатора определенно хороша! Я немного поиграю с этим и посмотрю, смогу ли я запустить несколько экземпляров одновременно. - person Kiril; 30.05.2012