Программирование на Python: обеспечение доступности машинного обучения с помощью алгоритма случайного леса

Джон Пол Мюллер, Лука Массарон

Случайный лес - это алгоритм классификации и регрессии, разработанный Лео Брейманом и Адель Катлер, который использует большое количество моделей дерева решений для обеспечения точных прогнозов за счет уменьшения как смещения, так и дисперсии оценок. Когда вы объединяете несколько моделей вместе для создания единого прогноза, результатом будет ансамбль моделей. Случайный лес - это не просто модель ансамбля, это также простой и эффективный алгоритм, который можно использовать в качестве готового алгоритма. Это делает машинное обучение доступным для неспециалистов. Алгоритм случайного леса использует следующие шаги для выполнения своих прогнозов:

3604 таблетка с красными пятнышками фыркает
  1. Создайте большое количество деревьев решений, каждое из которых отличается от другого, на основе различных подмножеств наблюдений и переменных.
  2. Загрузите набор данных наблюдений для каждого дерева (взятый из исходных данных с заменой). Одно и то же наблюдение может появляться несколько раз в одном наборе данных.
  3. Произвольно выберите и используйте только часть переменных для каждого дерева.
  4. Оцените производительность для каждого дерева, используя наблюдения, исключенные при выборке (оценка Out Of Bag или OOB).
  5. Получите окончательный прогноз, который является средним для оценок регрессии или наиболее частым классом для прогнозирования, после того, как все деревья были подогнаны и использованы для прогнозирования.

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



Лео Брейман заимствовал идею случайного леса из техники мешковины. Scikit-learn имеет класс упаковки для регрессии (BaggingRegressor) и классификации (BaggingClassifier), который вы можете использовать с любым другим предиктором, который вы предпочитаете выбирать из модулей Scikit-learn. max_samples и max_features Параметры позволяют вам определять долю наблюдений и переменных в выборке (не в начальной, а в выборочной, так что вы можете использовать случай только один раз) для построения каждой модели ансамбля. n_estimators Параметр определяет общее количество моделей в ансамбле. Вот пример, который загружает набор рукописных цифр (используется для демонстрации позже с другими алгоритмами ансамбля), а затем соответствует модели путем упаковки:

max_features

Вот перекрестная проверенная точность упаковки, примененной к набору рукописных данных:

min_samples_leaf

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

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

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

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

Работа с классификатором случайного леса

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

max_features

Перекрестная проверенная точность, сообщаемая этим кодом для случайного леса, является улучшением по сравнению с методом упаковки:

auto

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

gg 225 уличная стоимость
sqrt

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

Наука о данных Random Forest Python

Проверка влияния количества оценщиков на случайный лес.

Работа с регрессором случайного леса

RandomForestRegressor работает аналогично Random Forest для классификации, используя точно такие же параметры:

log2

Вот результат перекрестной проверки среднеквадратичной ошибки:

min_samples_leaf

Случайный лес использует деревья решений. Деревья решений https://www.dummies.com/programming/big-data/data-science/how-to-create-classification-and-regression-trees-in-python-for-data-science/ сегментируют набор данных на небольшие разделы, называемые листьями, при оценке значений регрессии. Случайный лес использует среднее значение каждого листа для создания прогноза. Использование этой процедуры приводит к тому, что экстремальные и высокие значения исчезают из прогнозов из-за усреднения, используемого для каждого листа леса, что дает сброшенные значения вместо гораздо более высоких или гораздо более низких значений.

Оптимизация случайного леса

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

from sklearn.datasets import load_digits digit = load_digits() X, y = digit.data, digit.target from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold tree_classifier = DecisionTreeClassifier(random_state=0) crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) bagging = BaggingClassifier(tree_classifier, max_samples=0.7, max_features=0.7, n_estimators=300) scores = np.mean(cross_val_score(bagging, X, y, scoring='accuracy', cv=crossvalidation)) print ('Accuracy: %.3f' % scores)

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

Accuracy: 0.967
и
X, y = digit.data, digit.target from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) RF_cls = RandomForestClassifier(n_estimators=300, random_state=1) score = np.mean(cross_val_score(RF_cls, X, y, scoring='accuracy', cv=crossvalidation)) print('Accuracy: %.3f' % score)
. При оптимизации
Accuracy: 0.977
вы используете предварительно настроенные параметры (
from sklearn.model_selection import validation_curve param_range = [10, 50, 100, 200, 300, 500, 800, 1000, 1500] crossvalidation = KFold(n_splits=3, shuffle=True, random_state=1) RF_cls = RandomForestClassifier(n_estimators=300, random_state=0) train_scores, test_scores = validation_curve(RF_cls, X, y, 'n_estimators', param_range=param_range, cv=crossvalidation, scoring='accuracy') mean_test_scores = np.mean(test_scores, axis=1) import matplotlib.pyplot as plt plt.plot(param_range, mean_test_scores, 'bD-.', label='CV score') plt.grid() plt.xlabel('Number of estimators') plt.ylabel('accuracy') plt.legend(loc='lower right', numpoints= 1) plt.show()
для всех функций,
X, y = boston.data, boston.target from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold RF_rg = RandomForestRegressor (n_estimators=300, random_state=1) crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) score = np.mean(cross_val_score(RF_rg, X, y, scoring='neg_mean_squared_error', cv=crossvalidation)) print('Mean squared error: %.3f' % abs(score))
или
Mean squared error: 12.028
функции, применяемые к количеству функций) и интегрируете их, используя небольшое количество функций и значение 1/3 характеристик. Выбор правильного количества функций для выборки имеет тенденцию сокращать количество раз, когда коррелированные и аналогичные переменные выбираются вместе, тем самым повышая эффективность прогнозирования.

Есть статистическая причина для оптимизации

from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import KFold X, y = digit.data, digit.target crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) RF_cls = RandomForestClassifier(random_state=1) scorer = 'accuracy'
. Использование листьев с несколькими регистрами часто соответствует переобучению очень специфическим комбинациям данных. Вам необходимо иметь как минимум 30 наблюдений, чтобы достичь минимальной статистической уверенности в том, что шаблоны данных соответствуют реальным и общим правилам:

from sklearn.model_selection import GridSearchCV max_features = [X.shape[1]//3, 'sqrt', 'log2', 'auto'] min_samples_leaf = [1, 10, 30] n_estimators = [50, 100, 300] search_grid = {'n_estimators':n_estimators, 'max_features': max_features, 'min_samples_leaf': min_samples_leaf} search_func = GridSearchCV(estimator=RF_cls, param_grid=search_grid, scoring=scorer, cv=crossvalidation) search_func.fit(X, y) best_params = search_func.best_params_ best_score = search_func.best_score_ print('Best parameters: %s' % best_params) print('Best accuracy: %.3f' % best_score)

Затем сообщаются наилучшие параметры и полученная наилучшая точность, подчеркивая, что параметры, на которые необходимо воздействовать, - это количество деревьев:

Best parameters: {'max_features': 'sqrt', 'min_samples_leaf': 1, 'n_estimators': 100} Best accuracy: 0.978