Поделиться через


microsoftml.rx_fast_trees: ускоренные деревья

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

microsoftml.rx_fast_trees(formula: str,
    data: [revoscalepy.datasource.RxDataSource.RxDataSource,
    pandas.core.frame.DataFrame], method: ['binary',
    'regression'] = 'binary', num_trees: int = 100,
    num_leaves: int = 20, learning_rate: float = 0.2,
    min_split: int = 10, example_fraction: float = 0.7,
    feature_fraction: float = 1, split_fraction: float = 1,
    num_bins: int = 255, first_use_penalty: float = 0,
    gain_conf_level: float = 0, unbalanced_sets: bool = False,
    train_threads: int = 8, random_seed: int = None,
    ml_transforms: list = None, ml_transform_vars: list = None,
    row_selection: str = None, transforms: dict = None,
    transform_objects: dict = None, transform_function: str = None,
    transform_variables: list = None,
    transform_packages: list = None,
    transform_environment: dict = None, blocks_per_read: int = None,
    report_progress: int = None, verbose: int = 1,
    ensemble: microsoftml.modules.ensemble.EnsembleControl = None,
    compute_context: revoscalepy.computecontext.RxComputeContext.RxComputeContext = None)

Описание

Машинное обучение: быстрый лес

Сведения

rx_fast_trees — это реализация FastRank. FastRank — это эффективная реализация алгоритма градиентного усиления MART. Градиентный бустинг — это метод машинного обучения для проблем регрессии. Он пошагово создает каждое дерево регрессии, используя стандартную функцию потерь для измерения ошибок в каждом шаге и их исправления в следующем. Поэтому такая модель прогнозирования фактически является набором более слабых моделей прогнозирования. В задачах регрессии при усилении пошагово создается серия деревьев, а затем с помощью произвольной дифференцируемой функции потерь выбирается оптимальное дерево.

MART изучает набор деревьев регрессии, который является деревом принятия решений со скалярными значениями в листовых узлах. Дерево принятия решений (регрессии) — это древовидная блок-схема, в которой на каждом внутреннем узле принимается решение, какой из двух дочерних узлов использовать дальше, на основе одного из значений функции из входных данных. Значение возвращается в каждом листовом узле. Во внутренних узлах решение зависит от теста "x <= v", где x — это значение функции во входной выборке, а v — одно из возможных значений этой функции. Функции, которые могут создаваться с помощью дерева регрессии, представляют собой кусочные функции-константы.

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

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

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

  • Для проблемы ранжирования экземпляры упорядочиваются по выходному значению набора.

Если для method задано значение "regression", используется версия регрессии FastTree. Если задано значение "ranking", используется версия ранжирования FastTree. В случае ранжирования экземпляры нужно упорядочить по выходным данным набора деревьев. Единственное различие в параметрах этих версий заключается в параметрах калибровки, которые требуются только для классификации.

Аргументы

formula

Формула, описанная в revoscalepy.rx_formula. Члены взаимодействия и F() сейчас не поддерживаются в microsoftml.

.

Объект источника данных или символьная строка, указывающая файл .xdf или объект кадра данных.

method

Символьная строка, указывающая тип быстрого дерева: "binary" для двоичной классификации быстрых деревьев по умолчанию или "regression" для регрессии быстрых деревьев.

num_trees

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

num_leaves

Максимальное число листовых узлов (терминальных узлов), которые могут быть созданы в любом дереве. Более высокие значения потенциально увеличивают размер дерева и обеспечивают повышенную точность, но при этом возникает риск лжевзаимосвязи и требуется больше времени на обучение. Значение по умолчанию — 20.

learning_rate;

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

min_split

Минимальное число обучающих экземпляров, необходимых для формирования листового узла. То есть минимальное число документов, разрешенных на листовом узле дерева регрессии, из данных подвыборки. Часть split означает, что признаки на каждом уровне дерева (узла) распределяются случайным образом. Значение по умолчанию — 10. Учитывается только число экземпляров, даже если экземпляры взвешенные.

example_fraction

Доля случайно выбранных экземпляров, используемых для каждого дерева. Значение по умолчанию — 0,7.

feature_fraction

Доля случайно выбранных признаков, используемых для каждого дерева. Значение по умолчанию — 1.

split_fraction

Доля случайно выбранных признаков, используемых для каждого разбиения. Значение по умолчанию — 1.

num_bins

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

first_use_penalty

Признак, который первым использует штрафной коэффициент. Это форма регуляризации, которая получает штраф за использование новой функции при создании дерева. Увеличьте это значение, чтобы создать деревья, которые не используют большое число признаков. Значение по умолчанию — 0.

gain_conf_level

Соответствие дерева требованию к степени надежности (должно находиться в диапазоне [0, 1)). Значение по умолчанию — 0.

unbalanced_sets

Если True, используются производные, оптимизированные для несбалансированных наборов. Применимо, только если значение type равно "binary". Значение по умолчанию — False.

train_threads

Число потоков для использования при обучении. Значение по умолчанию: 8.

random_seed

Задает случайное начальное значение. Значение по умолчанию — None.

ml_transforms

Указывает список преобразований Машинного обучения Майкрософт, которые необходимо выполнить с данными до обучения, или значение None, если преобразования не нужно выполнять. Сведения о поддерживаемых трансформациях см. в разделах featurize_text, categorical и categorical_hash. Эти преобразования выполняются после любых заданных преобразований Python. Значение по умолчанию — None.

ml_transform_vars

Указывает символьный вектор имен переменных, используемых в ml_transforms, или значение None, если их не нужно использовать. Значение по умолчанию — None.

row_selection

НЕ ПОДДЕРЖИВАЕТСЯ. Указывает записи (наблюдения) из набора данных, которые будут использоваться моделью с именем логической переменной из набора данных (в кавычках) или логическим выражением с указанием переменных в наборе данных. Пример:

  • row_selection = "old" будет использовать только те наблюдения, в которых значение переменной old равно True.

  • row_selection = (age > 20) & (age < 65) & (log(income) > 10) использует только те наблюдения, в которых значение переменной age находится в диапазоне от 20 до 65, а значение log переменной income больше 10.

Выбор записей осуществляется после обработки всех преобразований данных (см. аргументы transforms или transform_function). Как и со всеми выражениями, row_selection можно определить за пределами вызова функции с помощью функции expression.

преобразования

НЕ ПОДДЕРЖИВАЕТСЯ. Выражение формы, представляющее первый круг преобразования переменных. Как и со всеми выражениями, transforms (или row_selection) можно определить за пределами вызова функции с помощью функции expression.

transform_objects

НЕ ПОДДЕРЖИВАЕТСЯ. Именованный список с объектами, на которые можно ссылаться с помощью transforms, transform_function и row_selection.

transform_function

Функция преобразования переменной.

transform_variables

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

transform_packages

НЕ ПОДДЕРЖИВАЕТСЯ. Символьный вектор, определяющий дополнительные пакеты Python (за исключением пакетов, указанных в RxOptions.get_option("transform_packages")), которые будут доступны и предварительно загружены для использования в функциях преобразования переменных. Например, явно определенные в функциях revoscalepy через свои аргументы transforms и transform_function или неявно определенные через свои аргументы formula или row_selection. Аргумент transform_packages также может иметь значение None, указывающее на то, что пакеты, указанные за пределами RxOptions.get_option("transform_packages"), не будут предварительно загружаться.

transform_environment

НЕ ПОДДЕРЖИВАЕТСЯ. Определяемая пользователем среда, выступающая в роли родительской среды для всех разработанных внутренних сред и используемая для преобразования данных переменных. При transform_environment = Noneзначении используется новая "хэш-среда" с родительским revoscalepy.baseenv.

blocks_per_read

Указывает количество считываемых блоков для каждого фрагмента данных, считываемого из источника данных.

report_progress

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

  • 0 — информирование не осуществляется.

  • 1 — выводится и обновляется число обработанных записей.

  • 2 — выводятся данные об обработанных записях и времени обработки.

  • 3 — выводятся данные об обработанных записях и все данные о времени обработки.

verbose

Целочисленное значение, указывающее требуемый объем выходных данных. Если задано значение 0, при вычислениях подробные выходные данные не выводятся. Целочисленные значения из диапазона от 1 до 4 позволяют увеличить объем информации.

compute_context

Задает контекст, в котором выполняются вычисления, указанные с помощью допустимого значения revoscalepy.RxComputeContext. Сейчас поддерживаются локальные контексты и контексты вычислений revoscalepy.RxInSqlServer.

ensemble

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

Возвращаемое значение

Объект FastTrees с обученной моделью.

Примечание

Этот алгоритм является многопоточным и всегда будет пытаться загрузить весь набор данных в память.

См. также

rx_fast_forest, rx_predict

Ссылки

Википедия: градиентное усиление (статья на английском языке)

Greedy function approximation: A gradient boosting machine. (Жадное приближение функции — устройство градиентного усиления.)

Пример двоичной классификации

'''
Binary Classification.
'''
import numpy
import pandas
from microsoftml import rx_fast_trees, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset

infert = get_dataset("infert")

import sklearn
if sklearn.__version__ < "0.18":
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split

infertdf = infert.as_df()
infertdf["isCase"] = infertdf.case == 1
data_train, data_test, y_train, y_test = train_test_split(infertdf, infertdf.isCase)

trees_model = rx_fast_trees(
    formula=" isCase ~ age + parity + education + spontaneous + induced ",
    data=data_train)
    
# RuntimeError: The type (RxTextData) for file is not supported.
score_ds = rx_predict(trees_model, data=data_test,
                     extra_vars_to_write=["isCase", "Score"])
                     
# Print the first five rows
print(rx_data_step(score_ds, number_rows_read=5))

Выходные данные:

Not adding a normalizer.
Making per-feature arrays
Changing data from row-wise to column-wise
Beginning processing data.
Rows Read: 186, Read Time: 0, Transform Time: 0
Beginning processing data.
Processed 186 instances
Binning and forming Feature objects
Reserved memory for tree learner: 7020 bytes
Starting to train ...
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0949161
Elapsed time: 00:00:00.0112103
Beginning processing data.
Rows Read: 62, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0230457
Finished writing 62 rows.
Writing completed.
Rows Read: 5, Total Rows Processed: 5, Total Chunk Time: 0.001 seconds 
  isCase PredictedLabel      Score  Probability
0  False          False  -4.722279     0.131369
1  False          False -11.550012     0.009757
2  False          False  -7.312314     0.050935
3   True           True   3.889991     0.825778
4  False          False  -6.361800     0.072782

Пример регрессии

'''
Regression.
'''
import numpy
import pandas
from microsoftml import rx_fast_trees, rx_predict
from revoscalepy.etl.RxDataStep import rx_data_step
from microsoftml.datasets.datasets import get_dataset

airquality = get_dataset("airquality")

import sklearn
if sklearn.__version__ < "0.18":
    from sklearn.cross_validation import train_test_split
else:
    from sklearn.model_selection import train_test_split

airquality = airquality.as_df()


######################################################################
# Estimate a regression fast forest
# Use the built-in data set 'airquality' to create test and train data

df = airquality[airquality.Ozone.notnull()]
df["Ozone"] = df.Ozone.astype(float)

data_train, data_test, y_train, y_test = train_test_split(df, df.Ozone)

airFormula = " Ozone ~ Solar_R + Wind + Temp "

# Regression Fast Forest for train data
ff_reg = rx_fast_trees(airFormula, method="regression", data=data_train)

# Put score and model variables in data frame
score_df = rx_predict(ff_reg, data=data_test, write_model_vars=True)
print(score_df.head())

# Plot actual versus predicted values with smoothed line
# Supported in the next version.
# rx_line_plot(" Score ~ Ozone ", type=["p", "smooth"], data=score_df)

Выходные данные:

'unbalanced_sets' ignored for method 'regression'
Not adding a normalizer.
Making per-feature arrays
Changing data from row-wise to column-wise
Beginning processing data.
Rows Read: 87, Read Time: 0.001, Transform Time: 0
Beginning processing data.
Warning: Skipped 4 instances with missing features during training
Processed 83 instances
Binning and forming Feature objects
Reserved memory for tree learner: 21528 bytes
Starting to train ...
Not training a calibrator because it is not needed.
Elapsed time: 00:00:00.0512720
Elapsed time: 00:00:00.0094435
Beginning processing data.
Rows Read: 29, Read Time: 0, Transform Time: 0
Beginning processing data.
Elapsed time: 00:00:00.0229873
Finished writing 29 rows.
Writing completed.
   Solar_R  Wind  Temp      Score
0    115.0   7.4  76.0  26.003876
1    307.0  12.0  66.0  18.057747
2    230.0  10.9  75.0  10.896211
3    259.0   9.7  73.0  13.726607
4     92.0  15.5  84.0  37.972855