1С дерево значений заполнить из запроса


Дерево значение в 1С 8.3 на примерах

Объект «ДеревоЗначений» в 1С 8.3 представляет собой динамический набор значений любого типа. Для такого набора доступны свойства «колонки» и «строки» где каждая строка может иметь набор подчинённых строк, а каждая подчинённая строка набор своих подчинённых строк и т.д.  Программная инициализация дерева значений в 1С осуществляется с помощью оператора НОВЫЙ.

Пример:

ДеревоЗначений = Новый ДеревоЗначений;

Визуально, объект «ДеревоЗначений» похож на дерево групп справочника. К примеру, можно открыть справочник «Номенклатура» любой типовой конфигурации выставив форму списка в «Режим просмотра» — «Дерево».

 

Полезно понимать, что объект «ДеревоЗначений» схож с объектом «ТаблицаЗначений». Основной отличительный признак наличие дополнительного реквизита «Родитель» у объекта «ДеревоЗначений», с помощью которого и организовывается иерархия и подчинённость.

Наша команда предоставляет услуги по консультированию, настройке и внедрению 1С.
Связаться с нами можно по телефону +7 499 350 29 00.
Услуги и цены можно увидеть по ссылке.
Будем рады помочь Вам!

Содержание

Дерево значений на управляемой форме

Если появляется необходимость показать данные в виде дерева пользователю, следует на форме создать реквизит с типом «ДеревоЗначений» и определится с составом колонок.

Для отображения на форме добавим реквизит в раздел элементов формы простым перетаскиванием.

Заполнение дерева значений

Заполнить данными дерево значений в 1С можно программно (вручную) или получить из результата запроса. Рассмотрим на примерах оба способа.

Ручное заполнение реквизита формы с типом «ДеревоЗначений»

Простой пример:

&НаКлиенте
 Процедура ДЗ_НаФорме(Команда)
 ДЗ_НаФормеНаСервере();
 КонецПроцедуры
 
 &НаСервере
 Процедура ДЗ_НаФормеНаСервере()
 
 // Преобразуем реквизит формы ДЗ в объект прикладного типа
 ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
 
 Корень = ДеревоЗначений.Строки.Добавить();
 Корень.Наименование = "Корневая группа";
 
 Группа1 = Корень.Строки.Добавить();
 Группа1.Наименование = "Первая группа";
 
 Элемент1 = Группа1.Строки.Добавить();
 Элемент1.Наименование = "Элемент №1";                               
 
 Группа2 = Корень.Строки.Добавить();
 Группа2.Наименование = "Втровая группа";
 
 Элемент1 = Группа2.Строки.Добавить();
 Элемент1.Наименование = "Элемент №1";
 
 Элемент2 = Группа2.Строки.Добавить();
 Элемент2.Наименование = "Элемент №2";
         
 // Преобразуем объект ДеревоЗначений в реквизит формы         
 ЗначениеВРеквизитФормы(ДеревоЗначений,"ДЗ");                                                                     
 
 КонецПроцедуры
 

Результат запроса на форме:

Заполнение дерева значений из результата запроса

Сделаем простой запрос к справочнику «Номенклатура». Результат запроса преобразуем в дерево значений с помощью метода «Выгрузить», установив для его параметра «ТипОбхода» в значение «ПоГруппировкамСИерархией».  Для передачи сформированного дерева значений на форму, важно чтобы имена колонок совпадали с именами колонок реквизита на форме.

&НаКлиенте
 Процедура ДЗ_НаФорме(Команда)
 ДЗ_НаФормеНаСервере();
 КонецПроцедуры
 
 &НаСервере
 Процедура ДЗ_НаФормеНаСервере()
 
 Запрос = Новый Запрос;
 Запрос.Текст =
 "ВЫБРАТЬ
 |          Номенклатура.Ссылка КАК Наименование
 |ИЗ
 |          Справочник.Номенклатура КАК Номенклатура
 |
 |УПОРЯДОЧИТЬ ПО
 |          Наименование ИЕРАРХИЯ";
 ДеревоЗначений = Запрос.Выполнить().Выгрузить(ОбходРезультатаЗапроса.ПоГруппировкамСИерархией);
 
 ЗначениеВРеквизитФормы(ДеревоЗначений, "ДЗ");
 
 КонецПроцедуры
 

Результат запроса на форме может выглядеть так:

Поиск строк в дереве значений

Для поиска строк в дереве значений существует два способа, точнее говоря, метода.

Метод «Найти()»

Возвращает строку дерева значений, если строка не найдена, вернёт «Неопределено». Поиск можно ограничивать, указав в параметре <Колонки> нужные колонки для поиска. Также расширять, указав для параметра <ВключатьПодчиненные> значение «Истина», тогда в поиске будут участвовать строки подчинённых коллекций.

Для примера найдём строку со значением «Элемент №1» в дереве значений вида:

Пример кода:

&НаКлиенте
 Процедура НайтиСтрокуДЗ(Команда)
             НайтиСтрокуДЗ_НаСервере();
 КонецПроцедуры
 
 &НаСервере
 Процедура НайтиСтрокуДЗ_НаСервере()
 
 // Преобразуем реквизит формы ДЗ в объект прикладного типа
 ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
 
 // Ищем строку
 НайденнаяСтрока = ДеревоЗначений.Строки.Найти("Элемент №1","Наименование", Истина);
 
 // Анализ результата поиска
 Если НайденнаяСтрока = Неопределено Тогда
 Сообщить("Строка не найдена");
 Иначе
 Сообщить(НайденнаяСтрока.Наименование + " - " + НайденнаяСтрока.Родитель.Наименование);
 КонецЕсли;
           
 КонецПроцедуры

Результат:

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

Метод «НайтиСтроки()»

Если необходимо найти все строки со значением «Элемент №1» тогда следует использовать метод НайтиСтроки()

Где <ПараметрыОтбора> — это условия для поиска в виде структуры, а параметр <ВключатьПодчиненные> с помощью значений Ложь/Истина контролирует возможность поиска в подчинённых коллекциях.

Пример кода:

&НаКлиенте
 Процедура НайтиСтрокиДЗ(Команда)
 НайтиСтрокиДЗНаСервере();
 КонецПроцедуры
 
 &НаСервере
 Процедура НайтиСтрокиДЗНаСервере()
 
 // Преобразуем реквизит формы ДЗ в объект прикладного типа
 ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
 
 // Условие для поиска
 ПараметрыОтбора = Новый Структура;
 ПараметрыОтбора.Вставить("Наименование", "Элемент №1");
 
 // Поиск строк
 МассивСтрок = ДеревоЗначений.Строки.НайтиСтроки(ПараметрыОтбора, Истина);
 
 // Проверяем найдены ли строки
 Если МассивСтрок.Количество() = 0 Тогда
 Сообщить("Не найдено ни одной строки, удовлетворяющей условия поиска.");
 КонецЕсли;
 
 // Перебор массива строк
 Для Каждого Строка Из МассивСтрок Цикл
 
 Если Строка.Родитель = Неопределено Тогда
 Сообщить(Строка.Наименование + " - Корень дерева значений.");
 Иначе
 Сообщить(Строка.Наименование + " - " + Строка.Родитель.Наименование);
 КонецЕсли
 
 КонецЦикла;
 
 КонецПроцедуры

Результат:

Очистка дерева значений или строк

Для очистки дерева значений пригодятся методы  Очистить(), Удалить(). Пример кода:

&НаСервере
 Процедура УдалитьСтрокуНаСервере()
 
 // Преобразуем реквизит формы ДЗ в объект прикладного типа
 ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
 
 ДеревоЗначений.Строки.Очистить();
 
 // Или по индексу
 ДеревоЗначений.Строки.Удалить(0);
 
 // Преобразуем объект ДеревоЗначений в реквизит формы
 ЗначениеВРеквизитФормы(ДеревоЗначений, "ДЗ");
 
 КонецПроцедуры

С помощью данных методов возможно удаление конкретных строк дерева значений.

!!!При удалении либо очистки строки все её подчинённые строки удалятся!!!

Обход дерева значений в 1С

Обойти все строки дерева значений удобнее всего с помощью рекурсии.  Таким способом мы сможем обойти дерево значений любой вложенности.

Пример:

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

Как преобразовать дерево значений в таблицу значений

Состав элементов и реквизитов формы:

&НаКлиенте
 Процедура ВТЗ(Команда)
 ВТЗНаСервере();
 КонецПроцедуры
 
 &НаСервере
 Процедура ВТЗНаСервере()
 
 
 ДеревоЗначений = РеквизитФормыВЗначение("ДЗ");
 ТаблицаЗначений = РеквизитФормыВЗначение("ТЗ");
 
 ПреобразоватьВ_ТЗ(ДеревоЗначений, ТаблицаЗначений, Новый УникальныйИдентификатор("00000000-0000-0000-0000-000000000000"));
 ДеревоЗначений.Строки.Очистить();
 
 ЗначениеВРеквизитФормы(ТаблицаЗначений, "ТЗ");
 ЗначениеВРеквизитФормы(ДеревоЗначений, "ДЗ");
 КонецПроцедуры
 
 &НаСервере
 Процедура ПреобразоватьВ_ТЗ(Данные, ТаблицаЗначений, ГУИД)
 
 Для Каждого Строка Из Данные.Строки Цикл
 
 НовСтрока = ТаблицаЗначений.Добавить();
 НовСтрока.Наименование = Строка.Наименование;
 НовСтрока.Родитель = ГУИД;
 НовСтрока.ГУИД = Новый УникальныйИдентификатор();
 
 Если Строка.Строки.Количество()>0 Тогда
 ПреобразоватьВ_ТЗ(Строка, ТаблицаЗначений, НовСтрока.ГУИД);
 КонецЕсли;
 
 КонецЦикла;
 
 КонецПроцедуры
 

Используя данный способ можно легко преобразовать таблицу значений обратно в дерево значений.  Из примера «ГУИД» это уникальный идентификатор строки, а «Родитель» уникальный идентификатор родителя. Если обратного преобразования не требуется можно исключить использование колонок «Родитель» и  «ГУИД».

Дерево значений. Категория: 1С:Предприятие • Программирование

Дерево значений представляет из себя некую структуру с иерархией. Каждая строка имеет свойства «Родитель» и «Строки». У каждой строки может быть сколько угодно подчиненных строк. При этом такие операции как поиск, сортировка, подсчет итогов можно проводить с учетом уровня иерархии и подчиненных строк.

Программное создание дерева значений

Как уже упоминалось выше, каждая строка имеет свойство Строки, которое содержит коллекцию дочерних строк. И сам объект ДеревоЗначений имеет свойство Строки, которое содержит коллекцию строк верхнего уровня.

&НаКлиенте Процедура СоздатьДеревоЗначений(Команда) СоздатьДеревоЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура СоздатьДеревоЗначенийНаСервере() // создаем объект ДеревоЗначений и добавляем колонки ДеревоЗначений = Новый ДеревоЗначений(); ДеревоЗначений.Колонки.Добавить("Код"); ДеревоЗначений.Колонки.Добавить("Наименование"); ДеревоЗначений.Колонки.Добавить("Количество"); // добавляем две строки верхнего уровня ГруппаТовары = ДеревоЗначений.Строки.Добавить(); ГруппаТовары.Код = "001"; ГруппаТовары.Наименование = "Товары"; ГруппаТовары.Количество = ""; ГруппаУслуги = ДеревоЗначений.Строки.Добавить(); ГруппаУслуги.Код = "002"; ГруппаУслуги.Наименование = "Услуги"; ГруппаУслуги.Количество = ""; // для первой строки верхнего уровня добавляем дочерние строки ПервыйТовар = ГруппаТовары.Строки.Добавить(); ПервыйТовар.Код = "003"; ПервыйТовар.Наименование = "Первый товар"; ПервыйТовар.Количество = 5; ПервыйТовар = ГруппаТовары.Строки.Добавить(); ПервыйТовар.Код = "004"; ПервыйТовар.Наименование = "Второй товар"; ПервыйТовар.Количество = 7; // для второй строки верхнего уровня добавляем дочерние строки ПерваяУслуга = ГруппаУслуги.Строки.Добавить(); ПерваяУслуга.Код = "005"; ПерваяУслуга.Наименование = "Первая услуга"; ПерваяУслуга.Количество = ""; ВтораяУслуга = ГруппаУслуги.Строки.Добавить(); ВтораяУслуга.Код = "006"; ВтораяУслуга.Наименование = "Вторая услуга"; ВтораяУслуга.Количество = ""; // цикл по строкам верхнего уровня Для Каждого ТекущаяГруппа Из ДеревоЗначений.Строки Цикл Сообщить("Код: " + ТекущаяГруппа.Код + ", Группа: " + ТекущаяГруппа.Наименование); // цикл по дочерним строкам текущей строки верхнего уровня Для Каждого ТекущийТоварИлиУслуга Из ТекущаяГруппа.Строки Цикл Сообщить( "Код: " + ТекущийТоварИлиУслуга.Код + ", Товар или услуга: " + ТекущийТоварИлиУслуга.Наименование ); КонецЦикла; КонецЦикла; КонецПроцедуры
Код: 001, Группа: Товары Код: 003, Товар или услуга: Первый товар Код: 004, Товар или услуга: Второй товар Код: 002, Группа: Услуги Код: 005, Товар или услуга: Первая услуга Код: 006, Товар или услуга: Вторая услуга
КоллекцияКолонокДереваЗначений.Добавить(Имя, Тип, Заголовок, Ширина) 
КоллекцияСтрокДереваЗначений.Добавить()

Заполнить табличное поле на форме

Визуальное представление дерева значений на форме обеспечивает элемент Таблица.

Пример программного заполнения дерева значений для управляемых форм:

&НаКлиенте Процедура ЗаполнитьТабличноеПоле(Команда) ЗаполнитьТабличноеПолеНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТабличноеПолеНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); // Добавляем строку в корень дерева ПерваяСтрока = ДеревоЗначений.Строки.Добавить(); ПерваяСтрока.ПерваяКолонка = "Первая строка, первая колонка"; ПерваяСтрока.ВтораяКолонка = "Первая строка, вторая колонка"; // Дочерняя строка первой строки ВтораяСтрока = ПерваяСтрока.Строки.Добавить(); ВтораяСтрока.ПерваяКолонка = "Вторая строка, первая колонка"; ВтораяСтрока.ВтораяКолонка = "Вторая строка, вторая колонка"; // Дочерняя строка второй строки ТретьяСтрока = ВтораяСтрока.Строки.Добавить(); ТретьяСтрока.ПерваяКолонка = "Третья строка, первая колонка"; ТретьяСтрока.ВтораяКолонка = "Третья строка, вторая колонка"; ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры

Результат выполнения запроса очень легко преобразовать в дерево значений, для этого нужно воспользоваться методом Выгрузить() и указать параметр ТипОбхода отличным от того, что стоит по умолчанию, т.е. ПоГруппировкам или ПоГруппировкамСИерархией.

&НаКлиенте Процедура ЗаполнитьТабличноеПоле(Команда) ЗаполнитьТабличноеПолеНаСервере(); КонецПроцедуры &НаСервере Процедура ЗаполнитьТабличноеПолеНаСервере() Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование КАК ПерваяКолонка, | Номенклатура.Код КАК ВтораяКолонка |ИЗ | Справочник.Номенклатура КАК Номенклатура |УПОРЯДОЧИТЬ ПО | ПерваяКолонка ИЕРАРХИЯ"; ДеревоЗначений = Запрос.Выполнить().Выгрузить( ОбходРезультатаЗапроса.ПоГруппировкамСИерархией ); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры

Свернуть и развернуть строки дерева значений

Свернуть и развернуть дочерние строки элемента дерева значений можно с помощью методов Свернуть() и Развернуть().

ВсеЭлементыФормы.ЭлементТаблицаФормы.Свернуть(ИдектификаторСтроки)
ВсеЭлементыФормы.ЭлементТаблицаФормы.Развернуть(ИдектификаторСтроки, СПодчиненными)
&НаКлиенте Процедура СвернутьТекущуюСтрокуДерева(Команда) Элементы.ЭлементДеревоЗначений.Свернуть( Элементы.ЭлементДеревоЗначений.ТекущаяСтрока ); КонецПроцедуры &НаКлиенте Процедура СвернутьВерхниеСтрокиДерева(Команда) СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы(); Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл Элементы.ЭлементДеревоЗначений.Свернуть( ТекущаяСтрока.ПолучитьИдентификатор() ); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура СвернутьВсеСтрокиДерева(Команда) СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы(); СвернутьДочерниеСтрокиДерева(СтрокиДерева); КонецПроцедуры &НаКлиенте Процедура СвернутьДочерниеСтрокиДерева(СтрокиДерева) Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл ДочерниеСтроки = ТекущаяСтрока.ПолучитьЭлементы(); // рекурсивный вызов процедуры СвернутьДочерниеСтрокиДерева() СвернутьДочерниеСтрокиДерева(ДочерниеСтроки); Элементы.ЭлементДеревоЗначений.Свернуть( ТекущаяСтрока.ПолучитьИдентификатор() ); КонецЦикла; КонецПроцедуры
&НаКлиенте Процедура РазвернутьТекущуюСтрокуДерева(Команда) Элементы.ЭлементДеревоЗначений.Развернуть( Элементы.ЭлементДеревоЗначений.ТекущаяСтрока, Истина ); КонецПроцедуры &НаКлиенте Процедура РазвернутьВсеСтрокиДерева(Команда) СтрокиДерева = РеквизитДеревоЗначений.ПолучитьЭлементы(); Для Каждого ТекущаяСтрока Из СтрокиДерева Цикл Элементы.ЭлементДеревоЗначений.Развернуть( ТекущаяСтрока.ПолучитьИдентификатор(), Истина ); КонецЦикла; КонецПроцедуры
ДанныеФормыДерево.ПолучитьЭлементы()
ДанныеФормыЭлементДерева.ПолучитьЭлементы()

Для представления в форме объектов конфигурации (справочники, документы и т.п.) существуют специальные типы данных:

Прикладной объект представлен либо одним, либо несколькими элементами данных формы. Например, документ, содержащий табличную часть, будет представлен объектом типа ДанныеФормыСтруктура (собственно документ), которому подчинен объект типа ДанныеФормыКоллекция (табличная часть документа).

Удалить строку и очистить дерево значений

&НаКлиенте Процедура УдалитьСтрокуДереваЗначений(Команда) УдалитьСтрокуДереваЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура УдалитьСтрокуДереваЗначенийНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); // удаляем первую строку дерева значений ДеревоЗначений.Строки.Удалить(0); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры
&НаКлиенте Процедура ОчиститьДеревоЗначений(Команда) ОчиститьДеревоЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура ОчиститьДеревоЗначенийНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); ДеревоЗначений.Строки.Очистить(); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры

Поиск в дереве значений

Среди наиболее часто используемых методов стоит отметить метод Найти() коллекции строк дерева значений.

КоллекцияСтрокДереваЗначений.Найти(Значение, Колонки, ВключатьПодчиненные)

Метод осуществляет поиск значения в дереве в указанных колонках коллекции строк дерева значений. Возвращает строку (тип СтрокаДереваЗначений), которая содержит искомое значение. Если значение не найдено, то возвращается значение Неопределено. Предназначен для поиска уникальных значений.

&НаКлиенте Процедура НайтиСтрокуДереваЗначений(Команда) ЗаполнитьТабличноеПолеНаСервере(); НайтиСтрокуДереваЗначенийНаСервере(); КонецПроцедуры &НаСервере Процедура НайтиСтрокуДереваЗначенийНаСервере() ДеревоЗначений = РеквизитФормыВЗначение("РеквизитДеревоЗначений"); РезультатПоиска = ДеревоЗначений.Строки.Найти( ИскомоеЗначение, "ПерваяКолонка,ВтораяКолонка", Истина ); Если РезультатПоиска <> Неопределено Тогда Сообщить( "Первая колонка: " + РезультатПоиска.ПерваяКолонка + ", Вторая колонка: " + РезультатПоиска.ВтораяКолонка ); Иначе Сообщить("Ничего не найдено"); КонецЕсли; КонецПроцедуры &НаСервере Процедура ЗаполнитьТабличноеПолеНаСервере() Запрос = Новый Запрос(); Запрос.Текст = "ВЫБРАТЬ | Номенклатура.Наименование КАК ПерваяКолонка, | Номенклатура.Код КАК ВтораяКолонка |ИЗ | Справочник.Номенклатура КАК Номенклатура |УПОРЯДОЧИТЬ ПО | ПерваяКолонка ИЕРАРХИЯ"; ДеревоЗначений = Запрос.Выполнить().Выгрузить( ОбходРезультатаЗапроса.ПоГруппировкамСИерархией ); ЗначениеВРеквизитФормы(ДеревоЗначений, "РеквизитДеревоЗначений"); КонецПроцедуры

Поиск: 1С:Предприятие • Дерево значений • Иерархия • Коллекция • Таблица формы • Типы данных • Управляемая форма

Работа с Деревом Значений » FAQ 1С 8.x » HelpF.pro

ДеревоЗначений в ТекстовыйДокумент[8.x, 8.2 УП, 8.3]
Как в дереве значений строку перекинуть в другой родитель?[8.x, 8.2 УП]
Как вывести в справочник в виде дерева значений[8.x]
Как из ДереваЗначений сделать ТаблицуЗначений по определенному уровню[8.x]
Как обойти, перебрать дерево значений?[8.x, 8.2 УП]
Как самостоятельно заполнить дерево значений?[8.x, 8.2 УП]
Как Свернуть, Развернуть узлы Дерева значений на форме?[8.x, 8.2 УП]
Как удалить строку или очистить дерево значений[8.x, 8.2 УП, 8.3]
Пересчет дерева, суммы и коэффициенты.[8.x, 8.2 УП]
Преобразование дерева значений в таблицу значений и обратно[8.x]
Примеры работы с Деревом значений в УП[8.x, 8.2 УП]

Свойства двоичного дерева Вопросы и ответы

перейти к содержанию Меню .

1.10. Деревья принятия решений - документация scikit-learn 0.23.2

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

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

Некоторые преимущества деревьев решений:

  • Просто для понимания и интерпретации. Деревья можно визуализировать.

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

  • Стоимость использования дерева (т.е., прогнозирование данных) является логарифмическим по количество точек данных, используемых для обучения дерева.

  • Может обрабатывать как числовые, так и категориальные данные. Другие техники обычно специализируются на анализе наборов данных только одного типа переменной. Смотрите алгоритмы для получения дополнительной информации Информация.

  • Может обрабатывать проблемы с несколькими выходами.

  • Использует модель белого ящика. Если данная ситуация наблюдается в модели, объяснение условия легко объясняется булевой логикой.Напротив, в модели черного ящика (например, в искусственной нейронной сеть), результаты может быть труднее интерпретировать.

  • Можно проверить модель с помощью статистических тестов. Это делает это Можно учесть надежность модели.

  • Работает хорошо, даже если его предположения несколько нарушаются истинная модель, из которой были созданы данные.

К недостаткам деревьев решений можно отнести:

  • Обучающиеся дерева решений могут создавать слишком сложные деревья, которые не хорошо обобщить данные.Это называется переобучением. Механизмы например, обрезка, установка минимального количества требуемых образцов на листовом узле или установка максимальной глубины дерева необходимо, чтобы избежать этой проблемы.

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

  • Известно, что задача изучения дерева оптимальных решений NP-полная по нескольким аспектам оптимальности и даже для простых концепции.Следовательно, практические алгоритмы обучения дереву решений основаны на эвристических алгоритмах, таких как жадный алгоритм, где локально оптимальные решения принимаются на каждом узле. Такие алгоритмы не может гарантировать возврат глобально оптимального дерева решений. Этот можно смягчить путем обучения нескольких деревьев в ученике ансамбля, где функции и образцы выбираются случайным образом с заменой.

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

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

1.10.1. Классификация

DecisionTreeClassifier - это класс, способный выполнять мультикласс классификация по набору данных.

Как и другие классификаторы, DecisionTreeClassifier принимает в качестве входных данных два массива: массив X, разреженный или плотный, размером [n_samples, n_features] , содержащий обучающие выборки и массив Y целых значений размером [n_samples] , с метками классов для обучающих выборок:

 >>> из дерева импорта sklearn >>> X = [[0, 0], [1, 1]] >>> Y = [0, 1] >>> clf = дерево.DecisionTreeClassifier () >>> clf = clf.fit (X, Y) 

После установки модель может быть использована для прогнозирования класса образцов:

 >>> clf.predict ([[2., 2.]]) массив ([1]) 

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

 >>> clf.predict_proba ([[2., 2.]]) массив ([[0., 1.]]) 

DecisionTreeClassifier поддерживает как двоичные (где метки - это [-1, 1]) классификация и мультикласс (где метки [0,…, K-1]) классификация.

Используя набор данных Iris, мы можем построить дерево следующим образом:

 >>> из sklearn.datasets import load_iris >>> из дерева импорта sklearn >>> 
.

python - что означает свойство value в сгенерированном дереве решений scikit learn?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
.

1.10. Деревья принятия решений - документация scikit-learn 0.19.1

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

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

Некоторые преимущества деревьев решений:

  • Просто понять и интерпретировать. Деревья можно визуализировать.
  • Требуется небольшая подготовка данных. Другие методы часто требуют данных нормализации, необходимо создать фиктивные переменные и пустые значения для удалить. Однако обратите внимание, что этот модуль не поддерживает отсутствующие ценности.
  • Стоимость использования дерева (т. Е. Прогнозирования данных) является логарифмической в количество точек данных, используемых для обучения дерева.
  • Может обрабатывать как числовые, так и категориальные данные. Другие техники обычно специализируются на анализе наборов данных только одного типа переменной. Смотрите алгоритмы для получения дополнительной информации Информация.
  • Может обрабатывать проблемы с несколькими выходами.
  • Использует модель белого ящика. Если данная ситуация наблюдается в модели, объяснение условия легко объясняется булевой логикой. Напротив, в модели черного ящика (например, в искусственной нейронной сеть), результаты может быть труднее интерпретировать.
  • Можно проверить модель с помощью статистических тестов. Это делает это Можно учесть надежность модели.
  • Хорошо работает, даже если его предположения несколько нарушаются истинная модель, из которой были созданы данные.

К недостаткам деревьев решений можно отнести:

  • Обучающиеся дерева решений могут создавать слишком сложные деревья, которые не хорошо обобщить данные. Это называется переобучением. Механизмы например, обрезка (в настоящее время не поддерживается), установка минимального количество выборок, требуемых на листовом узле, или установка максимального глубина дерева необходима, чтобы избежать этой проблемы.
  • Деревья решений могут быть нестабильными из-за небольших вариаций в данные могут привести к созданию совершенно другого дерева. Эта проблема смягчается за счет использования деревьев решений в ансамбль.
  • Как известно, проблема изучения дерева оптимальных решений NP-полная по нескольким аспектам оптимальности и даже для простых концепции. Следовательно, практические алгоритмы обучения дереву решений основаны на эвристических алгоритмах, таких как жадный алгоритм, где локально оптимальные решения принимаются на каждом узле.Такие алгоритмы не может гарантировать возврат глобально оптимального дерева решений. Этот можно смягчить путем обучения нескольких деревьев в ученике ансамбля, где функции и образцы выбираются случайным образом с заменой.
  • Есть концепции, которые сложно изучить, потому что деревья решений не выражают их легко, например, проблемы XOR, четности или мультиплексора.
  • Обучающиеся дерева решений создают предвзятые деревья, если некоторые классы доминируют. Поэтому рекомендуется сбалансировать набор данных перед подгонкой. с деревом решений.

1.10.1. Классификация

DecisionTreeClassifier - это класс, способный выполнять мультикласс классификация по набору данных.

Как и другие классификаторы, DecisionTreeClassifier принимает на вход два массива: массив X, разреженный или плотный, размером [n_samples, n_features] , содержащий обучающие образцы и массив Y целых значений размером [n_samples] , с метками классов для обучающих выборок:

 >>> из дерева импорта sklearn >>> X = [[0, 0], [1, 1]] >>> Y = [0, 1] >>> clf = дерево.DecisionTreeClassifier () >>> clf = clf.fit (X, Y) 

После установки модель может быть использована для прогнозирования класса образцов:

 >>> clf.predict ([[2., 2.]]) массив ([1]) 

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

 >>> clf.predict_proba ([[2., 2.]]) массив ([[0., 1.]]) 

DecisionTreeClassifier поддерживает как двоичные (где метки - это [-1, 1]) классификация и мультикласс (где метки [0,…, K-1]) классификация.

Используя набор данных Iris, мы можем построить дерево следующим образом:

 >>> из sklearn.datasets import load_iris >>> из дерева импорта sklearn >>> iris = load_iris () >>> clf = tree.DecisionTreeClassifier () >>> clf = clf.fit (iris.data, iris.target) 

После обучения мы можем экспортировать дерево в формат Graphviz, используя export_graphviz экспортер. Если вы используете менеджер пакетов conda, двоичные файлы graphviz и пакет python можно установить с помощью

conda установить python-graphviz

Также двоичные файлы для graphviz можно загрузить с домашней страницы проекта graphviz, и оболочка Python, установленная из pypi с помощью команды pip install graphviz .

Ниже приведен пример экспорта graphviz указанного дерева, обученного на всем набор данных радужной оболочки глаза; результаты сохраняются в выходном файле iris.pdf :

 >>> импорт графвиз >>> dot_data = tree.export_graphviz (clf, out_file = None) >>> graph = graphviz.Source (dot_data) >>> graph.render ("радужная оболочка") 

Экспортер export_graphviz также поддерживает различные эстетические параметры, включая окраску узлов по их классу (или значению для регрессии) и используя явные имена переменных и классов при желании.Ноутбуки Jupyter также автоматически отображать эти графики в строку:

 >>> dot_data = tree.export_graphviz (clf, out_file = None, feature_names = iris.feature_names, class_names = iris.target_names, заполнено = верно, округлено = верно, special_characters = True) >>> graph = graphviz.Source (dot_data) >>> график 

После установки модель может быть использована для прогнозирования класса образцов:

 >>> clf.предсказать (iris.data [: 1,:]) массив ([0]) 

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

 >>> clf.predict_proba (iris.data [: 1,:]) массив ([[1., 0., 0.]]) 

1.10.2. Регрессия

Деревья решений также могут применяться к задачам регрессии, используя DecisionTreeRegressor класс.

Как и в настройке классификации, метод соответствия будет принимать в качестве аргументов массивы X и y, только в этом случае ожидается, что y будет иметь значения с плавающей запятой вместо целых значений:

 >>> из дерева импорта sklearn >>> X = [[0, 0], [2, 2]] >>> у = [0.5, 2.5] >>> clf = tree.DecisionTreeRegressor () >>> clf = clf.fit (X, y) >>> clf.predict ([[1, 1]]) массив ([0.5]) 

1.10.3. Проблемы с несколькими выходами

Задача с несколькими выходами - это задача контролируемого обучения с несколькими выходами. чтобы предсказать, то есть когда Y - это 2d-массив размером [n_samples, n_outputs] .

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

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

  • Сохранять n выходных значений в листьях вместо 1;
  • Используйте критерии разделения, которые вычисляют среднее сокращение по всем n выходов.

Этот модуль предлагает поддержку проблем с несколькими выходами за счет реализации этого стратегии как в DecisionTreeClassifier , так и в Обсуждение Дерева . Если дерево решений соответствует выходному массиву Y размером [n_samples, n_outputs] , то итоговая оценка будет:

  • Вывести значения n_output при прогнозе ;
  • Вывести список массивов n_output вероятностей классов при Прогноз_проба .

Использование деревьев с несколькими выходами для регрессии продемонстрировано в Регрессия дерева решений с несколькими выходами. В этом примере вход X - одно действительное значение, а выходы Y - синус и косинус X.

Использование многовыходных деревьев для классификации продемонстрировано в Доработка лица с многовыходными оценщиками. В этом примере входы X - это пиксели верхней половины граней, а выходы Y - пиксели нижняя половина этих лиц.

1.10.5. Советы по практическому применению

  • Деревья решений имеют тенденцию чрезмерно соответствовать данным с большим количеством функций. Правильное соотношение количества образцов к количеству характеристик важно, поскольку дерево с несколькими образцами в многомерном пространстве, скорее всего, переобьется.
  • Рассмотреть возможность уменьшения размерности (PCA, ICA или Feature selection) заранее, чтобы дайте вашему дереву больше шансов найти отличительные признаки.
  • Визуализируйте свое дерево во время обучения с помощью экспорта функция.Используйте max_depth = 3 в качестве начальной глубины дерева, чтобы почувствовать насколько дерево соответствует вашим данным, а затем увеличьте глубину.
  • Помните, что количество образцов, необходимых для заполнения дерева, удваивается. за каждый дополнительный уровень, до которого растет дерево. Используйте max_depth для управления размер дерева, чтобы предотвратить переоснащение.
  • Используйте min_samples_split или min_samples_leaf , чтобы контролировать количество образцы на листовом узле. Очень маленькое число обычно означает дерево будет переобучаться, тогда как большое количество не позволит дереву обучаться данные.Попробуйте в качестве начального значения min_samples_leaf = 5 . Если размер выборки сильно варьируется, число с плавающей запятой можно использовать в процентах в этих двух параметрах. Основное различие между ними заключается в том, что min_samples_leaf гарантирует минимальное количество образцов в листе, а min_samples_split может создавать произвольные маленькие листья, хотя min_samples_split является более распространенным в литературе.
  • Сбалансируйте набор данных перед обучением, чтобы дерево не смещалось в сторону доминирующих классов.Балансировка классов может быть выполнена отбор равного количества образцов из каждого класса, или предпочтительно путем нормализация суммы весов выборки ( sample_weight ) для каждого класс к тому же значению. Также обратите внимание, что критерии предварительной обрезки на основе веса, например, min_weight_fraction_leaf , тогда будет меньше смещения в сторону доминирующие классы, чем критерии, которые не знают весов выборки, например min_samples_leaf .
  • Если образцы взвешены, будет проще оптимизировать дерево структура с использованием критерия предварительной обрезки на основе веса, такого как min_weight_fraction_leaf , что гарантирует, что конечные узлы содержат не менее часть общей суммы весов выборки.
  • Все деревья решений внутренне используют массивы np.float32 . Если данные обучения не в этом формате, будет сделана копия набора данных.
  • Если входная матрица X очень разреженная, рекомендуется преобразовать в разреженную csc_matrix перед вызовом fit и sparse csr_matrix перед вызовом предсказывать. Время обучения может быть на несколько порядков меньше для редких ввод матрицы по сравнению с плотной матрицей, когда объекты имеют нулевые значения в большинство образцов.

1.10.6. Алгоритмы дерева: ID3, C4.5, C5.0 и CART

Что представляют собой различные алгоритмы дерева решений и чем они отличаются друг от друга? Какой из них реализован в scikit-learn?

ID3 (Iterative Dichotomiser 3) был разработан Россом Куинланом в 1986 году. Алгоритм создает многостороннее дерево, находя для каждого узла (т.е. жадным образом) категориальный признак, который даст наибольший получение информации для категориальных целей. Деревья выросли до своих максимальный размер, а затем обычно применяется этап обрезки, чтобы улучшить способность дерева обобщать невидимые данные.

C4.5 является преемником ID3 и снял ограничение, связанное с должен быть категоричным путем динамического определения дискретного атрибута (на основе на числовых переменных), который разделяет непрерывное значение атрибута в дискретный набор интервалов. C4.5 конвертирует обученные деревья (т.е. результат алгоритма ID3) в наборы правил «если-то». Затем эта точность каждого правила оценивается для определения порядка в котором они должны применяться. Обрезка выполняется путем удаления правила предварительное условие, если без него точность правила улучшится.

C5.0 - это последняя версия Quinlan под частной лицензией. Он использует меньше памяти и создает меньшие наборы правил, чем C4.5, при этом более точным.

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

scikit-learn использует оптимизированную версию алгоритма CART.

1.10.7. Математическая постановка

Даны обучающие векторы, i = 1,…, l и вектор-метка , дерево решений рекурсивно разбивает пространство, такое что образцы с одинаковыми метками сгруппированы вместе.

Пусть данные в узле представлены как. За каждый раскол кандидатов, состоящий из функция и порог, разделите данные на и подмножества

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

Выберите параметры, минимизирующие примеси

Рекурсия для подмножеств и до достижения максимально допустимой глубины, или .

1.10.7.1. Критерии классификации

Если целью является результат классификации, принимающий значения 0,1,…, K-1, для узла, представляющего регион с наблюдения, пусть

- доля наблюдений класса k в узле

.

Общие меры примесей - Джини

Кросс-энтропия

и ошибочная классификация

, где данные обучения в узле

1.10.7.2. Критерии регрессии

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

Среднеквадратичная ошибка:

Средняя абсолютная ошибка:

, где данные обучения в узле

Артикулы:

.

java - Этот XML-файл не имеет связанной с ним информации о стилях. Дерево документа показано ниже

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
  3. Вакансии Программирование и связанные с ним технические возможности карьерного роста
.

веб-сервисов amazon - AWS S3 - Как исправить ошибку «Подпись запроса, которую мы рассчитали, не соответствует подписи»?

Переполнение стека
  1. Около
  2. Товары
  3. Для команд
  1. Переполнение стека Общественные вопросы и ответы
  2. Переполнение стека для команд Где разработчики и технологи делятся частными знаниями с коллегами
.

Смотрите также

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

Содержание, карта сайта.