C++ хранилище дерева решений
У меня есть дерево решений. Я передаю этому дереву решений некоторые входные значения. Дерево решений затем возвращает значение.
Входными значениями могут быть "число детей", "возраст в годах" и т. Д. Дерево решений может затем возвратить (например) определенное значение, которое будет указывать, сколько автомобилей принадлежит семье, или что-то в этом роде.
Это дерево решений (при преобразовании в оператор if-then) будет выглядеть так:
int i=0;
if (ownedHouses==0)
{
if (numberOfChildren==4)
{
if (ageFather==39)
{
if (incomeFamily==40000)
{
if (carsAlreadyCrashed==1)
{
i=3;
}
else
{
if (carsAlreadyCrashed==2)
{
if (insurancePaysForCrashes==1)
{
i=5;
}
}
else
{
i=4;
}
}
else
{
i=11;
}
}
}
else
{
i=2;
}
}
else
{
i=9;
}
}
else
{
i=22;
}
else
{
i=8;
}
Это всего лишь пример. На самом деле, итоговое утверждение if-then будет абсолютно огромным. Хотя я могу анализировать данные и создавать из них такое if-then, я не смог использовать такой большой цикл if-then-loop в своем программном обеспечении.
Поэтому я ищу другой способ интеграции дерева решений в мое программное обеспечение.
Я видел подходы, в которых данные дерева решений (в какой бы форме они ни предоставлялись...) анализировались во время выполнения, а затем из него создавались классы с корнем, узлами и листьями.
Для моих целей это не достаточно быстро.
У кого-нибудь есть другая идея?
Спасибо вам за помощь.
Изменить: я изменил некоторые значения на реальные значения, чтобы сделать смысл более ясным.
1 ответ
Самая быстрая реализация, которую я знаю, реализована в ALGLIB. Дерево решений хранится в виде массива двойников.
- Конечный узел - два значения {-1, данные}.
- Нелистовой узел - три значения {input_value_index, threshold, right_branch_offset}.
Вы можете найти реализацию этого подхода в dforest.dfprocessinternal