АнализДанныхДеревоРешений

Типы · DataAnalysisDecisionTree

Тип анализа данных - дерево решений. Параметры: МинимальноеКоличествоСлучаев (MinCaseCount) - минимальное количество случаев в узле (Число); МаксимальнаяГлубина (MaxDepth) - максимальная глубина дерева (Число); ТипУпрощения (SimplificationType) - тип упрощения дерева решений (ТипУпрощенияДереваРешений).

Полное описание, параметры и ограничения

АнализДанныхДеревоРешений (DataAnalysisDecisionTree)

АнализДанныхДеревоРешений (DataAnalysisDecisionTree)

Доступен, начиная с версии 8.0.

Описание:

Тип анализа данных - дерево решений.
Параметры:
МинимальноеКоличествоСлучаев (MinCaseCount) - минимальное количество случаев в узле (Число);

МаксимальнаяГлубина (MaxDepth) - максимальная глубина дерева (Число);

ТипУпрощения (SimplificationType) - тип упрощения дерева решений (ТипУпрощенияДереваРешений).

Доступность:

Сервер, толстый клиент, внешнее соединение.

Использование в версии:

Доступен, начиная с версии 8.0.

Методическая информация

Практические примеры

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

Полный серверный модуль создает собственную размеченную таблицу, назначает тип алгоритма и реальные параметры, получает результат и диагностирует все его свойства. Взвешенные классификации отделены от строк источника, дерево обходится без рекурсии, модель создается из результата без неизвестных объектов.

Где и как запускать

Полный серверный общий модуль УчебноеДеревоРешений85 собственной пустой конфигурации; отдельная управляемая форма получает только текст. В1С не выполнялся.

Подготовка

  1. НОВАЯ отдельная пустая файловая база точно8.5.1.1343. Имя конфигурации УчебноеДеревоРешений85, совместимость Не использовать, Русский. Нет прикладных объектов, общих реквизитов, расширений, подписок, заданий или рабочих данных; модули конфигурации вручную пустые. Не использовать БП/КА2/УТ/УНФ.

  2. Общие → Общие модули → УчебноеДеревоРешений85. Сервер=Да, Вызов сервера=Да, Клиент=Нет, Глобальный=Нет, Привилегированный=Нет. Вставить весь основной модуль, включая функции подготовки, проверки, обхода и защиты стенда. Будущая ручная подготовка: сохранить и обновить только собственную базу F7.

  3. Собственная внешняя обработка УчебныйРасчетДерева85 → управляемая Форма → команда/кнопка Выполнить, действие Выполнить. Полный отдельный модуль формы ниже вызывает только собственный серверный общий модуль и получает текст отчета. Таблицы, алгоритм, узлы и модель на клиент не передаются.

  4. Код в памяти создает32 строки: восемь повторений остатков0,1,10,11 с уникальными own-case-кодами. РешениеПоПравилу=Нужно для остатка<5, иначе Достаточно. Это вымышленные метки, иллюстрирующие уже заданное учебное правило, а не данные реальных продаж/заказов.

  5. Код — НеИспользуемая колонка, Остаток — Входная с видом Непрерывные, РешениеПоПравилу — Прогнозируемая с видом Дискретные. МинимальноеКоличествоСлучаев1, МаксимальнаяГлубина4, ТипУпрощенияНеУпрощать. Имена параметров сверены с installed-справкой; их реально ищет созданный анализатор.

  6. Никакие строки1С, модели в базе, файлы, печатные документы или сетевые сервисы не подготавливать. Нет рабочего источника, обучения нейросети, отправки данных наружу или автоматической закупки. Вывод основан только на текущем маленьком объекте памяти.

Функция ВыполнитьПример() Экспорт
    ПроверитьСвойПустойСтенд();
    Таблица = СоздатьСвоиСлучаи();
    Анализатор = Новый АнализДанных;
    Анализатор.ТипАнализа = Тип("АнализДанныхДеревоРешений");
    Анализатор.ИсточникДанных = Таблица;
    НастроитьСвоиКолонки(Анализатор.НастройкаКолонок);
    НастроитьСвойПараметр(Анализатор.Параметры, "МинимальноеКоличествоСлучаев", 1);
    НастроитьСвойПараметр(Анализатор.Параметры, "МаксимальнаяГлубина", 4);
    НастроитьСвойПараметр(Анализатор.Параметры, "ТипУпрощения", ТипУпрощенияДереваРешений.НеУпрощать);
    Результат = Анализатор.Выполнить();
    Если ТипЗнч(Результат) <> Тип("РезультатАнализаДанныхДеревоРешений") Тогда
        ВызватьИсключение "Не получен настоящий результат своего дерева решений";
    КонецЕсли;
    Если Результат.КоличествоОбъектов <> Таблица.Количество() Или Результат.КоличествоКлассов <> 2
        Или Результат.КоличествоЛистьев < 1 Или Результат.КоличествоУзлов < Результат.КоличествоЛистьев
        Или Результат.Глубина < 0 Или Результат.Ошибка < 0 Или Результат.Ошибка > 100 Тогда
        ВызватьИсключение "Результат не согласован с собственными32 случаями и двумя метками";
    КонецЕсли;
    ПроверитьСвоиКолонкиРезультата(Результат.НастройкаКолонок);
    ПроверитьСвойПараметр(Результат.Параметры, "МинимальноеКоличествоСлучаев", 1);
    ПроверитьСвойПараметр(Результат.Параметры, "МаксимальнаяГлубина", 4);
    ПроверитьСвойПараметр(Результат.Параметры, "ТипУпрощения", ТипУпрощенияДереваРешений.НеУпрощать);
    Отчет = "СВОЙ УЧЕБНЫЙ РАСЧЕТ, НЕ ПРОГНОЗ РЕАЛЬНЫХ ЗАКУПОК" + Символы.ПС;
    Отчет = Отчет + "Объектов: " + Строка(Результат.КоличествоОбъектов) + "; классов: " + Строка(Результат.КоличествоКлассов) + Символы.ПС;
    Отчет = Отчет + "Узлов: " + Строка(Результат.КоличествоУзлов) + "; листьев: " + Строка(Результат.КоличествоЛистьев) + Символы.ПС;
    Отчет = Отчет + "Глубина по платформе: " + Строка(Результат.Глубина) + "; ошибка дерева в процентах: " + Строка(Результат.Ошибка) + Символы.ПС;
    Классификации = Результат.Классификации;
    Если ТипЗнч(Классификации) <> Тип("ФиксированныйМассив") Или Классификации.Количество() = 0 Тогда
        ВызватьИсключение "Нужен реальный непустой массив сгруппированных классификаций";
    КонецЕсли;
    ВсегоСлучаев = 0;
    Для Каждого Классификация Из Классификации Цикл
        Если ТипЗнч(Классификация) <> Тип("КлассификацияОбъектаАнализаДанных") Или Классификация.Количество < 0 Тогда
            ВызватьИсключение "Не получена настоящая классификация собственных случаев";
        КонецЕсли;
        Факт = ОписатьСвойКласс(Классификация.Факт);
        Прогноз = ОписатьСвойКласс(Классификация.Прогноз);
        ВсегоСлучаев = ВсегоСлучаев + Классификация.Количество;
        Отчет = Отчет + "Случаев: " + Строка(Классификация.Количество) + "; факт: " + Факт + "; прогноз: " + Прогноз + Символы.ПС;
    КонецЦикла;
    Если ВсегоСлучаев <> Таблица.Количество() Тогда
        ВызватьИсключение "Сумма количества случаев классификаций не равна32";
    КонецЕсли;
    Корни = Результат.КорневыеУзлы;
    СтатистикаУзлов = ОбойтиСвоиУзлы(Корни);
    Если СтатистикаУзлов.Узлов <> Результат.КоличествоУзлов Или СтатистикаУзлов.Листьев <> Результат.КоличествоЛистьев Тогда
        ВызватьИсключение "Независимый обход не совпал с числами узлов и листьев результата";
    КонецЕсли;
    Отчет = Отчет + СтатистикаУзлов.Отчет + Символы.ПС;
    Модель = Результат.СоздатьМодельПрогноза();
    Если ТипЗнч(Модель) <> Тип("МодельПрогнозаДеревоРешений") Тогда
        ВызватьИсключение "Результат не создал настоящий объект модели прогноза";
    КонецЕсли;
    КорниМодели = Модель.КорневыеУзлы;
    СтатистикаМодели = ОбойтиСвоиУзлы(КорниМодели);
    Если СтатистикаМодели.Узлов <> СтатистикаУзлов.Узлов Или СтатистикаМодели.Листьев <> СтатистикаУзлов.Листьев Тогда
        ВызватьИсключение "Модель и результат не согласованы по своей структуре дерева";
    КонецЕсли;
    Отчет = Отчет + "Модель действительно создана из собственного результата; ее корни обходятся. Прогноз на новых данных в этом уроке не выполнялся";
    Возврат Отчет;
КонецФункции

Функция СоздатьСвоиСлучаи()
    Таблица = Новый ТаблицаЗначений;
    Таблица.Колонки.Добавить("Код", Новый ОписаниеТипов("Строка"));
    Таблица.Колонки.Добавить("Остаток", Новый ОписаниеТипов("Число"));
    Таблица.Колонки.Добавить("РешениеПоПравилу", Новый ОписаниеТипов("Строка"));
    Остатки = Новый Массив;
    Остатки.Добавить(0);
    Остатки.Добавить(1);
    Остатки.Добавить(10);
    Остатки.Добавить(11);
    Для Повтор = 1 По 8 Цикл
        Для Каждого Остаток Из Остатки Цикл
            СтрокаСлучая = Таблица.Добавить();
            СтрокаСлучая.Код = "own-case-" + Строка(Повтор) + "-" + Строка(Остаток);
            СтрокаСлучая.Остаток = Остаток;
            СтрокаСлучая.РешениеПоПравилу = ?(Остаток < 5, "Нужно", "Достаточно");
        КонецЦикла;
    КонецЦикла;
    Если Таблица.Количество() <> 32 Тогда
        ВызватьИсключение "Нужны ровно32 собственных учебных случая";
    КонецЕсли;
    Возврат Таблица;
КонецФункции

Процедура НастроитьСвоиКолонки(Настройки)
    Код = Настройки.Найти("Код");
    Остаток = Настройки.Найти("Остаток");
    КолонкаРешения = Настройки.Найти("РешениеПоПравилу");
    Если Код = Неопределено Или Остаток = Неопределено Или КолонкаРешения = Неопределено Или Настройки.Количество() <> 3 Тогда
        ВызватьИсключение "Анализатор должен создать настройки трех собственных колонок";
    КонецЕсли;
    Код.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.НеИспользуемая;
    Остаток.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.Входная;
    Остаток.ВидДанных = ВидДанныхАнализа.Непрерывные;
    КолонкаРешения.ТипКолонки = ТипКолонкиАнализаДанныхДеревоРешений.Прогнозируемая;
    КолонкаРешения.ВидДанных = ВидДанныхАнализа.Дискретные;
    ПроверитьСвоиКолонкиРезультата(Настройки);
КонецПроцедуры

Процедура ПроверитьСвоиКолонкиРезультата(Настройки)
    Если ТипЗнч(Настройки) <> Тип("КолонкиАнализаДанных") Или Настройки.Количество() <> 3 Тогда
        ВызватьИсключение "Нужны настоящие три настройки колонок анализа";
    КонецЕсли;
    Код = Настройки.Найти("Код");
    Остаток = Настройки.Найти("Остаток");
    КолонкаРешения = Настройки.Найти("РешениеПоПравилу");
    Если Код = Неопределено Или Остаток = Неопределено Или КолонкаРешения = Неопределено Тогда
        ВызватьИсключение "Исчезла собственная колонка";
    КонецЕсли;
    Если Код.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.НеИспользуемая
        Или Остаток.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.Входная
        Или Остаток.ВидДанных <> ВидДанныхАнализа.Непрерывные
        Или КолонкаРешения.ТипКолонки <> ТипКолонкиАнализаДанныхДеревоРешений.Прогнозируемая
        Или КолонкаРешения.ВидДанных <> ВидДанныхАнализа.Дискретные Тогда
        ВызватьИсключение "Перепутаны ключ, числовой вход или собственная метка класса";
    КонецЕсли;
КонецПроцедуры

Функция НайтиСвойПараметр(Параметры, Имя)
    Параметр = Параметры.Найти(Имя);
    Если Параметр = Неопределено Или ТипЗнч(Параметр) <> Тип("ПараметрАнализаДанных") Тогда
        ВызватьИсключение "Не найден собственный параметр алгоритма " + Имя;
    КонецЕсли;
    Индекс = Параметры.Индекс(Параметр);
    Если Индекс < 0 Или Индекс >= Параметры.Количество() Тогда
        ВызватьИсключение "Индекс настоящего параметра выходит за границы";
    КонецЕсли;
    ПоИндексу = Параметры.Получить(Индекс);
    Если ПоИндексу.Имя <> Параметр.Имя Или ПоИндексу.Имя <> Имя Тогда
        ВызватьИсключение "Найти и Получить не вернули один собственный параметр";
    КонецЕсли;
    Возврат Параметр;
КонецФункции

Процедура НастроитьСвойПараметр(Параметры, Имя, Значение)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если Не Параметр.ТипЗначения.СодержитТип(ТипЗнч(Значение)) Тогда
        ВызватьИсключение "Тип значения не разрешен реальным параметром " + Имя;
    КонецЕсли;
    Параметр.Значение = Значение;
    ПроверитьСвойПараметр(Параметры, Имя, Значение);
КонецПроцедуры

Процедура ПроверитьСвойПараметр(Параметры, Имя, Эталон)
    Параметр = НайтиСвойПараметр(Параметры, Имя);
    Если ТипЗнч(Параметр.Значение) <> ТипЗнч(Эталон) Или Параметр.Значение <> Эталон Тогда
        ВызватьИсключение "Не совпал собственный параметр результата " + Имя;
    КонецЕсли;
КонецПроцедуры

Функция ОписатьСвоеСвойство(Описание)
    Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Тогда
        ВызватьИсключение "Нужно реальное описание значения или условия собственного анализа";
    КонецЕсли;
    Возврат Описание.Имя + "; сравнение=" + Строка(Описание.ВидСравнения)
        + "; значение=" + Строка(Описание.Значение) + "; с=" + Строка(Описание.ЗначениеС) + "; по=" + Строка(Описание.ЗначениеПо);
КонецФункции

Функция ОписатьСвойКласс(Класс)
    Если ТипЗнч(Класс) <> Тип("ОбъектАнализаДанных") Тогда
        ВызватьИсключение "Нужен реальный объект факта, прогноза или решения";
    КонецЕсли;
    Свойства = Новый Структура("РешениеПоПравилу", Неопределено);
    ЗаполнитьЗначенияСвойств(Свойства, Класс);
    Описание = Свойства.РешениеПоПравилу;
    Если Описание = Неопределено Тогда
        ВызватьИсключение "У собственного класса отсутствует единственная прогнозируемая колонка";
    КонецЕсли;
    Если ТипЗнч(Описание) <> Тип("СвойствоОбъектаАнализаДанных") Или Описание.Имя <> "РешениеПоПравилу"
        Или Описание.ВидСравнения <> ВидСравнения.Равно
        Или ТипЗнч(Описание.Значение) <> Тип("Строка")
        Или (Описание.Значение <> "Нужно" И Описание.Значение <> "Достаточно") Тогда
        ВызватьИсключение "Факт или прогноз не описывает собственную метку класса";
    КонецЕсли;
    Возврат ОписатьСвоеСвойство(Описание);
КонецФункции

Функция ОписатьСвоеРешение(Решение)
    Если ТипЗнч(Решение) <> Тип("РешениеАнализаДанных") Или Решение.КоличествоСлучаев < 0 Тогда
        ВызватьИсключение "Нужно настоящее возможное решение собственного узла";
    КонецЕсли;
    Возврат ОписатьСвойКласс(Решение.Решение) + "; правильных случаев=" + Строка(Решение.КоличествоСлучаев)
        + "; вероятность как вернула платформа=" + Строка(Решение.Вероятность);
КонецФункции

Функция ОбойтиСвоиУзлы(Корни)
    Если ТипЗнч(Корни) <> Тип("ФиксированныйМассив") Или Корни.Количество() = 0 Тогда
        ВызватьИсключение "Нужны настоящие непустые корни собственного результата или модели";
    КонецЕсли;
    Стек = Новый Массив;
    Для Каждого Корень Из Корни Цикл
        Стек.Добавить(Новый Структура("Узел,Уровень", Корень, 0));
    КонецЦикла;
    КоличествоУзлов = 0;
    КоличествоЛистьев = 0;
    Отчет = "ОБХОД СОБСТВЕННЫХ УЗЛОВ" + Символы.ПС;
    Пока Стек.Количество() > 0 Цикл
        Индекс = Стек.Количество() - 1;
        Кадр = Стек[Индекс];
        Стек.Удалить(Индекс);
        Узел = Кадр.Узел;
        Если ТипЗнч(Узел) <> Тип("УзелДереваРешений") Или Кадр.Уровень > 64 Или КоличествоУзлов >= 128 Тогда
            ВызватьИсключение "Свой маленький обход вышел за допустимые учебные границы";
        КонецЕсли;
        КоличествоУзлов = КоличествоУзлов + 1;
        Отчет = Отчет + "Узел=" + Строка(КоличествоУзлов) + "; уровень обхода=" + Строка(Кадр.Уровень)
            + "; попало случаев=" + Строка(Узел.КоличествоСлучаев) + Символы.ПС;
        Условие = Узел.Условие;
        Если Условие <> Неопределено Тогда
            Если ТипЗнч(Условие) <> Тип("ОбъектАнализаДанных") Тогда
                ВызватьИсключение "Узел не вернул документированный объект условия";
            КонецЕсли;
            Свойства = Новый Структура("Остаток", Неопределено);
            ЗаполнитьЗначенияСвойств(Свойства, Условие);
            Если Свойства.Остаток <> Неопределено Тогда
                Отчет = Отчет + "Условие своего числового входа: " + ОписатьСвоеСвойство(Свойства.Остаток) + Символы.ПС;
            Иначе
                Отчет = Отчет + "У этого узла нет описания условия по Остаток; выдуманная граница не подставлялась" + Символы.ПС;
            КонецЕсли;
        КонецЕсли;
        Отчет = Отчет + "Лучшее решение: " + ОписатьСвоеРешение(Узел.Решение) + Символы.ПС;
        ВсеРешения = Узел.ВсеРешения;
        Если ТипЗнч(ВсеРешения) <> Тип("ФиксированныйМассив") Тогда
            ВызватьИсключение "Нужен настоящий массив возможных решений узла";
        КонецЕсли;
        Для Каждого Возможное Из ВсеРешения Цикл
            Отчет = Отчет + "Возможное решение: " + ОписатьСвоеРешение(Возможное) + Символы.ПС;
        КонецЦикла;
        Дети = Узел.Узлы;
        Если ТипЗнч(Дети) <> Тип("ФиксированныйМассив") Тогда
            ВызватьИсключение "Нужен настоящий массив вложенных узлов";
        КонецЕсли;
        Если Дети.Количество() = 0 Тогда
            КоличествоЛистьев = КоличествоЛистьев + 1;
        Иначе
            Для Каждого Дочерний Из Дети Цикл
                Стек.Добавить(Новый Структура("Узел,Уровень", Дочерний, Кадр.Уровень + 1));
            КонецЦикла;
        КонецЕсли;
    КонецЦикла;
    Возврат Новый Структура("Узлов,Листьев,Отчет", КоличествоУзлов, КоличествоЛистьев, Отчет);
КонецФункции

Процедура ПроверитьСвойПустойСтенд()
    Если Метаданные.Справочники.Количество() <> 0 Или Метаданные.Документы.Количество() <> 0 Или Метаданные.Перечисления.Количество() <> 0 Или Метаданные.РегистрыСведений.Количество() <> 0 Или Метаданные.РегистрыНакопления.Количество() <> 0 Или Метаданные.РегистрыБухгалтерии.Количество() <> 0 Или Метаданные.РегистрыРасчета.Количество() <> 0 Или Метаданные.ПланыВидовХарактеристик.Количество() <> 0 Или Метаданные.ПланыВидовРасчета.Количество() <> 0 Или Метаданные.ПланыСчетов.Количество() <> 0 Или Метаданные.ПланыОбмена.Количество() <> 0 Или Метаданные.Последовательности.Количество() <> 0 Или Метаданные.БизнесПроцессы.Количество() <> 0 Или Метаданные.Задачи.Количество() <> 0 Или Метаданные.ОбщиеРеквизиты.Количество() <> 0 Или Метаданные.ПодпискиНаСобытия.Количество() <> 0 Или Метаданные.РегламентныеЗадания.Количество() <> 0 Или Метаданные.ВнешниеИсточникиДанных.Количество() <> 0 Тогда
        ВызватьИсключение "Нужен только свой новый пустой учебный стенд";
    КонецЕсли;
    Если Метаданные.ЕстьИзмененияРасширениямиКонфигурации() Тогда
        ВызватьИсключение "Свой сеанс не должен изменяться расширениями";
    КонецЕсли;
    Источники = Новый Массив;
    Источники.Добавить(ИсточникРасширенийКонфигурации.БазаДанных);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансАктивные);
    Источники.Добавить(ИсточникРасширенийКонфигурации.СеансОтключенные);
    Для Каждого Источник Из Источники Цикл
        Расширения = РасширенияКонфигурации.Получить(, Источник);
        Если ТипЗнч(Расширения) <> Тип("Массив") Тогда
            ВызватьИсключение "Native список расширений должен иметь тип Массив";
        КонецЕсли;
        Если Расширения.Количество() <> 0 Тогда
            ВызватьИсключение "В своём новом стенде нет расширений базы или сеанса";
        КонецЕсли;
    КонецЦикла;
    Если ТранзакцияАктивна() Тогда
        ВызватьИсключение "Чужая или вложенная активная транзакция не допускается";
    КонецЕсли;
КонецПроцедуры
УчебныйРасчетДерева85.Форма

Собственная внешняя обработка → управляемая Форма → Модуль

Полный клиент-серверный модуль формы, не клиентский расчет анализа данных.

&НаКлиенте
Процедура Выполнить(Команда)
    Отчет = ВыполнитьНаСервере();
    Сообщить(Отчет);
КонецПроцедуры

&НаСервереБезКонтекста
Функция ВыполнитьНаСервере()
    Возврат УчебноеДеревоРешений85.ВыполнитьПример();
КонецФункции

Разбор по шагам

  1. Серверный guard проверяет отсутствие прикладных объектов, расширений и активной транзакции. СоздатьСвоиСлучаи возвращает реальную ТаблицаЗначений с32 явно размеченными строками, а не неизвестный Источник.

  2. ТипАнализа — значение Тип("АнализДанныхДеревоРешений"), не строка или выдуманное перечисление. После назначения источника появляются реальные настройки колонок. Каждое Найти проверяется, три роли и два вида данных задаются и перечитываются.

  3. Параметры создаются самим алгоритмом. НайтиСвойПараметр подтверждает настоящий ПараметрАнализаДанных, получает Индекс, проверяет границы и перечитывает его через Получить. ТипЗначения.СодержитТип проверяется до присваивания Значение; после расчета те же значения и типы сверяются через Результат.Параметры.

  4. Выполнить возвращает настоящий РезультатАнализаДанныхДеревоРешений. КоличествоОбъектов сопоставляется с32 строками, КоличествоКлассов с двумя собственными метками; глубина, узлы, листья и ошибка выводятся фактически. Не обещается конкретная граница разделения, размер дерева или нулевая ошибка.

  5. Классификации — ФиксированныйМассив сгруппированных пар Факт/Прогноз. Количество каждого элемента — вес случаев этой классификации. Складываем веса и сверяем с32, а не требуем32 элементов массива. Факт и Прогноз имеют тип ОбъектАнализаДанных, их динамическое свойство РешениеПоПравилу содержит отдельное СвойствоОбъектаАнализаДанных, не голую строку.

  6. В собственную Структура копируется только совпадающее имя свойства без явного СписокСвойств. Поэтому у корневого условия без Остаток структура остается с Неопределено, а отсутствие не скрывается универсальным Попытка. Классовая метка обязательна; имя, сравнениеРавно, строковый тип и два допустимых значения проверяются.

  7. ОписатьСвоеСвойство показывает настоящее Имя, ВидСравнения, Значение, ЗначениеС и ЗначениеПо. У равенства границы не выдаются за смысл сравнения; у числового условия диагностируются фактические значения интервала без выдуманного правила включения/исключения концов.

  8. КорневыеУзлы обходятся собственным стеком Массив, без рекурсивного роста стека вызовов. Для каждого настоящего УзелДереваРешений используются количество случаев, условие, лучшее и все решения, дочерние узлы. Лист определяется отсутствием детей. Учебные ограничения128 узлов/64 уровня предотвращают неограниченный диагностический обход.

  9. РешениеАнализаДанных содержит число верных случаев, вероятность и отдельный ОбъектАнализаДанных класса. Вероятность выводится как вернула платформа: без неподтвержденного умножения на100. Только Результат.Ошибка прямо объявлена в справке процентами.

  10. Числа узлов и листьев вычисляются независимо обходом и сверяются с результатом. Уровень собственного обхода начинается с0; его нельзя автоматически приравнивать к Глубина по платформе без знания соглашения о нумерации.

  11. СоздатьМодельПрогноза вызывается именно у собственного результата. Реальная МодельПрогнозаДеревоРешений используется: ее КорневыеУзлы также обходятся и сопоставляются с результатом. Это создание и проверка структуры, не уже выполненный прогноз на новых данных.

Как проверить результат

  1. Будущий результат:32 объектов и2 класса, действительные параметры1/4/НеУпрощать, отчет по сгруппированным факт/прогноз и реальным узлам. Сумма весов классификаций32; независимые числа узлов/листьев совпадают с результатом и созданной моделью. Значения глубины, ошибки и вероятностей не подставляются вручную.

  2. Будущий отрицательный контроль данных: в СоздатьСвоиСлучаи заменить число повторений8 на7. Проверка собственного источника должна отклонить28 вместо32 до выполнения алгоритма. Вернуть8 после опыта.

  3. Будущий отрицательный контроль ролей: только в НастроитьСвоиКолонки заменить роль Остаток сВходная наНеИспользуемая. ПроверитьСвоиКолонкиРезультата должен отвергнуть схему до расчета. Эталон проверяющей процедуры не изменять, затем вернуть исходную роль.

  4. Будущий отрицательный контроль результата: только сразу после Результат = Анализатор.Выполнить() присвоить Результат = Неопределено. Проверка точного native-типа должна остановиться до readonly-чтений. Затем вернуть полный исходный код.

  5. runtimeVerifiedScenarios=0: алгоритм, модель, BSL, форма и база1С здесь не запускались. Статические проверки не являются доказательством построенного дерева, качества прогноза или успешного обучения. Описан будущий опыт только собственной пустой базы.

Ожидаемый результат

Собственный полный учебный конвейер связывает реальные данные памяти, параметры, результат, группировки, граф дерева и созданную модель; все диагностические числа берутся из полученных объектов.

На что обратить внимание

  1. У результатов, классификаций, узлов, решений и описаний свойств нет используемых здесь конструкторов. Они получены из настоящего анализа; readonly-свойствам ничего не присваивается. Не подменять их фиктивными Структура с похожими именами.

  2. Учебные метки построены известным правилом по тому же Остаток. Разбор классификаций на обучающем источнике не доказывает обобщение на новых данных и не заменяет отдельную контрольную выборку. Для реальной закупки требуются реальные правила, данные и разрешение.

  3. Количество элементов Классификации не равно автоматически КоличествоОбъектов. У одного элемента может быть несколько случаев; код проверяет сумму именно весов.

  4. Корень может не иметь свойства условия по Остаток; это не разрешение придумать границу. ЗаполнитьЗначенияСвойств без явного списка копирует пересечение имен только в собственную структуру памяти. readonly-объект источника не меняется.

  5. ЗначениеС/ЗначениеПо относятся к описанию интервала; не использовать их как готовое число класса и не угадывать включенность концов. Вероятность решения и процентная Ошибка результата — разные показатели; формат не меняет их математический смысл.

  6. МаксимальнаяГлубина4 — настройка алгоритма, Уровень0 собственного обхода — счетчик программы. Точная структура дерева и соглашение о глубине требуют будущего реального исполнения, не обещаются по статическим тестам.

  7. В этом уроке модель не получает новый ИсточникДанных и не выполняет прогноз. Ее тип и КорневыеУзлы привязаны к реальному созданию/обходу; остальные API модели должны изучаться отдельным полным прогнозным сценарием, а не чужими формальными target-привязками.

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

Не хотите разбираться сами?

Адаптируем это решение под вашу базу. Оценка бесплатно.

Оставить задачу

1С, 1С:Предприятие — товарные знаки ООО «1С». Сайт не является официальным представительством фирмы «1С» и не аффилирован с ней.