Деревья решений - требуется много времени для обработки строковых значений, но нормально работает для значений с плавающей запятой. Как понимать? - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь построить классификатор дерева решений, используя код ниже

from sklearn.tree import DecisionTreeClassifier clf = DecisionTreeClassifier()

и мои данные age type_income loan_purpose loan_amount offer 18 Student study 500 yes 18 Student study 600 yes 18 Student study 700 yes 18 Student study 800 yes . . . поэтому дерево решений выдает ошибку о том, что оно не может преобразовать Student в значение с плавающей запятой.

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

Ответы [ 2 ]

0 голосов
/ 31 августа 2018

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

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

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

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

Вы также можете написать свое, если это важно. Проверьте Функция горячего кодирования от sklearn

Некоторая дополнительная информация

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

0 голосов
/ 31 августа 2018

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

Тем не менее, есть довольно удобный вариант: перейти к однокадровому кодированию ваших категориальных данных (при условии, что в вашем примере type_income и loan_purpose не слишком много разных уровней для этих факторов). Простое преобразование строк в числа с плавающей точкой (например, Student -> 0, Employee -> 1) не рекомендуется, поскольку тогда sklearn будет предполагать, что существует отношение Student < Employee.

Я предлагаю вам взглянуть на раздел 4.3.5 на этой странице документации

...