Новосибирский Государственный Университет
Опубликован: 20.08.2013 | Доступ: свободный | Студентов: 861 / 36 | Длительность: 14:11:00
Самостоятельная работа 3:

Машинное обучение

2.3. Дерево решений

Идея, лежащая в основе алгоритма обучения дерева решений, состоит в рекурсивном разбиении пространства признаков с помощью простых правил на непересекающиеся области. Полученная в результате обучения модель представляет собой дерево, где каждому внутреннему узлу соответствует некоторая область пространства признаков и правило ее разбиения на подобласти (x_{j} \leq c, если -й признак количественный и x_{j} \in L, если признак категориальный). Каждой листовой вершине также соответствует область пространства \mathbb{X} и приписано константное значение, которому принимается равной функция f в данной области.

Алгоритм обучения дерева решений, осуществления с его помощью предсказаний, сохранения/загрузки модели, а также дополнительный функционал по работе с деревьями решений реализованы в библиотеке OpenCV в классе CvDTree. Остановимся подробнее на описании данного класса.

Для обучения дерева решений служит метод train.

bool train( const Mat& trainData, 
    int tflag, 
    const Mat& responses, 
    const Mat& varIdx=Mat(), 
    const Mat& sampleIdx=Mat(), 
    const Mat& varType=Mat(), 
    const Mat& missingDataMask=Mat(), 
    CvDTreeParams params=CvDTreeParams() ); 
    

Рассмотрим параметры метода.

  • trainData – матрица, содержащая векторы x^{(i)} из обучающей выборки. Матрица должна иметь тип CV_32F и размеры n \times d или d \times n. В отличие от метода CvSVM::train здесь возможен вариант как с построчным хранением векторов x^{(i)}, так и с их хранением по столбцам.
  • tflag – флаг, определяющий по строкам (tflag=CV_ROW_SAMPLE) хранятся вектора выборки в матрице trainData или по столбцам (tflag=CV_COL_SAMPLE).
  • responses – матрица-вектор, содержащая значения целевой переменной y^{(i)} для прецедентов обучающей выборки. Данная матрица должна иметь тип CV_32S или CV_32F и размеры 1 \times n или n \times 1.
  • varIdx – матрица-вектор, содержащая либо номера признаков (тип матрицы CV_32S), которые необходимо использовать при обучении, либо маску (тип матрицы CV_8U) размера 1 \times d, где единицами отмечены используемые признаки, нулями – игнорируемые. По умолчанию (varIdx=Mat()) используются все признаки.
  • sampleIdx – матрица-вектор, имеющая такой же формат, как и varIdx, но отвечающая за прецеденты выборки, которые необходимо использовать для обучения. По умолчанию используются все имеющиеся прецеденты.
  • varType – матрица-вектор, содержащая информацию о типах переменных. Деревья решений поддерживают использование как количественных (CV_VAR_ORDERED), так и категориальных (CV_VAR_CATEGORICAL) признаков. Данная матрица должна иметь тип CV_8U и размеры 1 \times (d + 1) или (d + 1) \times 1, где последний элемент определяет тип целевой переменной. По умолчанию (varType=Mat()) целевая переменная считается категориальной, т.е. решается задача классификации, а остальные количественными.
  • missingDataMask – матрица, содержащая маску пропущенных значений, где единицами отмечены неизвестные значения признаков, нулями – известные. В отличие от машины опорных векторов, деревья решений позволяют работать с пропущенными значениями в признаковых описаниях объектов x^{(i)}. Матрица missingDataMask должна иметь тип CV_8U и по размеру совпадать с матрицей trainData. По умолчанию считается, что пропущенных значений нет.
  • params – параметры алгоритма обучения.

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

struct CvDTreeParams 
{ 
  int max_categories; 
  int max_depth; 
  int min_sample_count; 
  int cv_folds; 
  bool use_surrogates; 
  bool use_1se_rule; 
  bool truncate_pruned_tree; 
  float regression_accuracy; 
  const float* priors; 
 
  CvDTreeParams(); 
  CvDTreeParams( int max_depth, 
      int min_sample_count, 
      float regression_accuracy, 
      bool use_surrogates, 
      int max_categories, 
      int cv_folds, 
      bool use_1se_rule, 
      bool truncate_pruned_tree, 
      const float* priors ); 
};          
    

Остановимся подробнее на описании данной структуры.

  • max_depth – ограничение на высоту обучаемого дерева.
  • min_sample_count – минимальное количество объектов обучающей выборки, которое должно быть в области пространства признаков, определяемой некоторым узлом дерева, чтобы разбиение этой области продолжилось.
  • regression_accuracy – разбиение узла регрессионного дерева прекращается, если модуль разности значения, приписанного этому узлу, и истинного значения целевого признака для всех прецедентов, попавших в данный узел, не превышает данного значения.
  • max_categories – максимальное количество возможных значений категориального признака, для которого точно вычисляется наилучшее правило разбиения. Данный параметр актуален лишь для задач классификации с числом классов больше двух, т.к. в данном случае выбор подмножества L множества возможных значений Q категориального признака происходит с помощью алгоритма с экспоненциальной от мощности Q трудоемкостью [ 2 ]. В данном случае для снижения времени работы алгоритма производится предварительная кластеризация множества Q так, чтобы количество кластеров не превышало max_categories. В случае если решается задача регрессии или бинарной классификации, то точное отыскания оптимального разбиения по данному признаку выполняется за линейное время от \mid Q \mid [ 2 ] и не требует предварительной кластеризации. Следует отметить, что максимальная поддерживаемая в OpenCV мощность Q равна 64.
  • use_surrogates – флаг, определяющий необходимость построения суррогатных разбиений. Каждому узлу дерева решений может быть приписано не только одно (основное) правило разбиения, а также несколько второстепенных (суррогатных) правил. В качестве суррогатных выбираются разбиения наиболее похожие на основное [ 1 ]. Построение суррогатных разбиений (use_surrogates=true) ведет к росту времени обучения модели, однако, может повысить качество оценки значимости переменных с помощью построенного дерева и улучшить качество предсказания для объектов с пропущенными значениями.
  • cv_folds – количество частей, на которые разделяется обучающая выборка, для выполнения перекрестного контроля при выполнении процедуры отсечений (pruning) [ 1 ]. Типичная стратегия построения дерева решений заключается в обучении большого дерева, к которому затем применяются отсечения для предотвращения переобучения. Если cv_folds=0, то отсечения не выполняются.
  • use_1se_rule – использование более строгого критерия отсечения. Если use_1se_rule=true, то после процедуры отсечения получается меньшее дерево.
  • truncate_pruned_tree – указывает, следует ли физически удалять из памяти отсеченные узлы дерева.
  • priors – для задачи классификации, задает априорные вероятности появления точек различных классов. Данный параметр можно использовать, например, в случае несбалансированной обучающей выборки, т.е. неравного количества прецедентов разных классов.

Предсказания с помощью предварительно обученной модели выполняются с помощью метода predict:

CvDTreeNode* predict( const Mat& sample, 
      const Mat& missingDataMask=Mat(), 
      bool preprocessedInput=false ) const; 
    

Рассмотрим параметры данного метода:

  • sample – матрица-вектор типа CV_32F и размера 1 \times d, содержащая координаты одной точки в пространстве признаков.
  • missingDataMask – матрица-вектор типа CV_8U и размера 1 \times d, представляющая собой маску пропущенных значений в sample.
  • preprocessedInput – определяет порядок работы с категориальными признаками в ходе предсказания. В матрице признаковых описаний объектов обучающей выборки, используемой методом CvDTree::train, значения категориальных признаков могут быть обозначены произвольными целыми числами. Например, множеством различных значений признака может быть \{3,7,9\}. Однако внутренним представлением обученной модели является множество, состоящее из чисел от 0 до \mid Q \mid -1 . Таким образом, на этапе предсказания требуется выполнять пересчет значений категориальных признаков, что может негативно сказаться на скорости выполнения данной операции. Значение preprocessedInput=true говорит, что пересчет значений уже выполнен. Данный параметр актуален лишь при наличии категориальных признаков.

Следует отметить, что метод CvDTree::predict возвращает указатель на структуру, описывающую узел дерева. Само предсказанное моделью значение целевого признака хранится в поле value данной структуры.

Сохранение модели дерева решений в файл и загрузка из него выполняется с помощью методов save и load, использование которых полностью совпадает с аналогичными методами класса CvSVM, описанными выше.

Следует отметить, что класс CvDTree также содержит дополнительный функционал, например, для определения значимости различных переменных для восстановления зависимости y от x, что, однако, выходит за рамки данной лабораторной работы и может быть предоставлено для самостоятельного изучения [ 7 ].

Александра Максимова
Александра Максимова

При прохождении теста 1 в нем оказались вопросы, который во-первых в 1 лекции не рассматривались, во-вторых, оказалось, что вопрос был рассмаотрен в самостоятельно работе №2. Это значит, что их нужно выполнить перед прохождением теста? или это ошибка?
 

Алена Борисова
Алена Борисова

В лекции по обработке полутоновых изображений (http://www.intuit.ru/studies/courses/10621/1105/lecture/17979?page=2) увидела следующий фильтр:


    \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 2 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array} - \frac{1}{9} \begin{array}{|c|c|c|}
    \hline \\
    0 & 0 & 0 \\
    \hline \\
    0 & 1 & 0 \\
    \hline \\
    0 & 0 & 0 \\
    \hline 
    \end{array}

В описании говорится, что он "делает изображение более чётким, потому что, как видно из конструкции фильтра, в однородных частях изображение не изменяется, а в местах изменения яркости это изменение усиливается".

Что вижу я в конструкции фильтра (скорее всего ошибочно): F(x, y) = 2 * I(x, y) - 1/9 I(x, y) = 17/9 * I(x, y), где F(x, y) - яркость отфильтрованного пикселя, а I(x, y) - яркость исходного пикселя с координатами (x, y). Что означает обычное повышение яркости изображения, при этом без учета соседних пикселей (так как их множители равны 0).

Объясните, пожалуйста, как данный фильтр может повышать четкость изображения?