Вопрос или проблема
Существует ли способ обучения decisionTreeClassifier в SKLearn на разреженных кортежах? Данные, которые у меня есть, основаны примерно на 100 характеристиках, но только несколько из них используются для принятия решения. Таким образом, каждая строка данных является разреженным кортежем.
Мои входные данные состоят из 30 тысяч записей, как:
(да, если f1=v1 и f3=v2)
(нет, если f1=v3 и f5=v4)
...
и так далее.
Записей десятки тысяч, и выводы не обязательно однозначны. Моя цель – найти автоматизированный метод, который сократит это до десятков узлов, которые будут приближенно воспроизводить то же поведение. Мне нужен доступ к результирующей структуре – вот почему я рассматриваю использование SKLearn, а не, скажем, DataRobot.
Я понимаю, что для использования decisionTreeClassifier в SKLearn мне нужно конвертировать данные в массив кортежей из 100 значений и просто присвоить характеристикам номер индекса. Но это означает, что мне нужно предоставить значение для каждой из 100 характеристик в каждой строке. И это не очень хорошо отражает данные, которые у меня есть.
Это похоже на классификацию данных, которые выглядят как
(да,v1,__,v2,__,__)
(нет,v3,__,__,__,v4)
Таким образом, интерес заключается, например, в том, чтобы иметь возможность указать значение данных как None, чтобы обозначить, что на этом поле нет ограничений.
Данные, как указано, содержат только равенства. Но ожидаемый вывод будет иметь неравенства, поскольку, похоже, именно это предоставляет SKLearn. Я бы на самом деле предпочел дерево решений с равенствами и неравенствами.
Мое собственное исследование на этом форуме и на отчетах об ошибках и форумах SKLearn показывает, что суть проблемы – в том, что классификатор деревьев решений SKLearn не обрабатывает категориальные или разреженные данные – обсуждается уже несколько лет без значительных изменений в коде в этом отношении.
Три подхода приходят на ум. Во-первых, развернуть кортежи в неразрежные с некоторым значением по умолчанию, таким как 0, для всех случаев, когда значение не имеет значения, с идеей, что постоянство этого значения заставит SKLearn использовать другие значения для принятия решений. Во-вторых, перенести работу в R – где, по всей видимости, эквивалентные процедуры действительно обрабатывают категориальные и разреженные данные. Или, в-третьих, написать код для обучения дерева решений самостоятельно с нуля.
Я намерен вернуться позже и рассказать, как это сработало для меня.
Ответ или решение
Классификатор дерева решений в библиотеке SKLearn не поддерживает разреженные данные в виде кортежей. Это может стать проблемой, особенно когда ваша задача заключается в работе с набором данных, содержащим множество признаков (около 100), из которых лишь немногие используются для принятия решений.
Контекст проблемы
Вы обладаете данными, представленными в виде разреженных кортежей. Каждый экземпляр в вашем наборе данных характеризует наличие или отсутствие определённых значений для различных признаков, и такие признаки, как правило, имеют множество возможных состояний. Пример вашего набора данных может выглядеть так:
(да, f1=v1, __, f3=v2, __, __)
(нет, f1=v3, __, __, __, f5=v4)
Вашей задачей является автоматизированное извлечение значений и построение дерева решений, которое сможет аппроксимировать поведение ваших данных. Одно из основных требований состоит в том, чтобы получить доступ к структуре дерева решений, так как это важно для дальнейшего анализа.
Решение проблемы
Поскольку SKLearn не поддерживает разреженные данные напрямую, есть несколько возможных путей решения вашей проблемы:
1. Преобразование разреженных данных в полные массивы
Вы можете расширить ваши кортежи, заполнив неиспользуемые признаки значением по умолчанию, таким как 0 или -1. Это позволяет вам представлять данные в виде полноразмерного массива (100 признаков), где для неактивных признаков будет указываться состояние, не влияющее на принятие решения. Однако это может привести к возникновению "пустых" переменных, которые будут добавлены к модели и могут исказить результаты.
2. Использование альтернативных инструментов
Если вы рассматриваете возможность использования других платформ, то стоит обратить внимание на языки программирования и библиотеки, которые лучше обрабатывают категориальные и разреженные данные. Например, в R есть пакеты, которые позволяют работать с такими типами данных более эффективно. Это может быть хорошим обходным решением, если SKLearn не удовлетворяет вашим требованиям.
3. Разработка собственного алгоритма
Разработка собственного кода для обучения дерева решений – это наиболее трудоемкий вариант, однако он позволит вам настроить модель под свои потребности. Также это даст возможность интегрировать поддержку разреженных форматов данных и лучше учесть категориальные переменные, которые могут понадобиться для точного моделирования ваших данных.
Заключение
Ваша ситуация, безусловно, требует более внимательного подхода. Выбор между преобразованием данных, использованием других инструментов и разработкой собственного решения зависит от вашей готовности инвестировать время и ресурсы. Помните, что каждое из этих решений имеет свои плюсы и минусы, поэтому стоит внимательно рассмотреть каждый из них прежде чем принимать решение.
Если вы решите использовать один из рекомендованных подходов, пожалуйста, вернитесь и дайте обратную связь о том, как это сработало для вас. Ваш опыт может быть ценным для других пользователей с аналогичными задачами.