Это 15-й день моего участия в августовском испытании обновлений. Узнайте подробности события:Испытание августовского обновления
Введение в случайные леса
Ансамблевое обучение — очень популярный алгоритм машинного обучения, который сам по себе не является единым алгоритмом машинного обучения, а объединяет результаты моделирования всех моделей путем построения нескольких моделей на данных. Алгоритм ансамбля рассматривает результаты моделирования нескольких оценщиков и объединяет их для получения комплексного результата, чтобы получить лучшую производительность регрессии или классификации, чем одна модель. Модель, объединяющая несколько моделей, называется оценщиком ансамбля, а каждая модель, составляющая оценщик ансамбля, называется базовой оценкой. Вообще говоря, существует три типа ансамблевых алгоритмов: бэггинг, бустинг и суммирование.
Основная идея бэггинга состоит в том, чтобы построить несколько независимых оценщиков, а затем выполнить среднее или большинство голосов по их прогнозам, чтобы определить результат ансамблевой оценки. Репрезентативной моделью метода мешков является случайный лес. В методе бустинга базовые оценки коррелируются и строятся одна за другой по порядку. Основная идея состоит в том, чтобы объединить мощность слабой оценки для прогнозирования выборок, которые трудно оценить снова и снова, таким образом сформировав сильную оценку. Репрезентативными моделями методов повышения являются Adaboost и деревья повышения градиента.
Два важных параметра
2.1 n_estimators
Количество базовых оценщиков. Влияние этого параметра на точность модели случайного леса монотонно, и чем больше n_estimators, тем лучше модель. Но у любой модели есть граница принятия решения.После того, как n_estimators достигает определенного уровня, точность случайного леса часто не повышается или начинает колебаться, и чем больше n_estimators, тем больше требуется вычислений и памяти, а время обучения будет быть все более и более длинным. Для этого параметра необходимо найти баланс между сложностью обучения и производительностью модели.
2.2 RandomForestClassifier VS DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_wine #内置红酒数据集
wine=load_wine()
wine.data
wine.target
#同时使用随机森林和决策树进行结果比较
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test=train_test_split(wine.data,wine.target,test_size=0.3)
clf=DecisionTreeClassifier(random_state=200)
rfc=RandomForestClassifier(random_state=200)
clf=clf.fit(x_train,y_train)
rfc=rfc.fit(x_train,y_train)
score_c=clf.score(x_test,y_test)
score_r=rfc.score(x_test,y_test)
print('Tree Score:{}'.format(score_c), ' \n' 'Random Forest Score:{}'.format(score_r))
Результаты случайного леса выше, чем результаты дерева решений
2.3 Снова используйте перекрестную проверку для сравнения (cross_val_score)
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
rfc=RandomForestClassifier(n_estimators=30)
rfc_s=cross_val_score(rfc,wine.data,wine.target,cv=10)
clf=DecisionTreeClassifier()
clf_s=cross_val_score(clf,wine.data,wine.target,cv=10)
plt.figure(figsize=(10,5))
plt.plot(range(1,11),rfc_s,label='RandomForest')
plt.plot(range(1,11),clf_s,label='Decision Tree')
plt.title('RandomForest VS Decision Tree')
plt.legend()
plt.show()
При перекрестной проверке 10, хотя результат дерева решений иногда совпадает с результатом случайного леса, в целом результат случайного леса значительно лучше, чем результат дерева решений.
Метод трех мешков
Когда random_state фиксировано, случайный лес генерирует фиксированный набор деревьев, но каждое дерево по-прежнему несовместимо, что устраняет случайность каждого результата. И мы можем доказать, что чем больше эта случайность, тем лучше и лучше будет работать метод бэггинга. При интеграции путем бэггинга базовые классификаторы должны быть независимыми друг от друга и не совпадать. Но ограничения этого подхода очень сильны: когда нам нужны тысячи деревьев, данные могут не предоставить тысячи признаков, которые позволили бы нам построить как можно больше деревьев. Итак, кроме random_state. Нужны и другие случайности.
3.1 bootstrap&oob_score
Чтобы сделать базовые классификаторы как можно более разными, для обучения используют разные обучающие наборы, а метод бэггинга формирует разные обучающие данные посредством методики случайной выборки с заменой, а для контроля параметров методики выборки используется бутстрап. В исходном обучающем наборе, содержащем n выборок, мы выполняем случайную выборку, по одной выборке за раз, и помещаем выборку обратно в исходную обучающую выборку перед взятием следующей выборки, что означает, что выборка все еще может использоваться в следующей выборке. Собрал, собрал n раз таким образом и, наконец, получил бутстрап-набор, состоящий из n семплов, равных исходному обучающему набору. Из-за случайной выборки каждый набор начальной загрузки отличается от исходного набора данных, а также отличается от других наборов выборки. Таким образом, существуют неисчерпаемые и разные наборы начальной загрузки, и мы используем эти наборы начальной загрузки для обучения наших базовых классификаторов, и наши базовые классификаторы, естественно, будут разными. Таким образом, часть обучающих данных будет потеряна.Эти данные называются данными из пакета (сокращенно oob).За исключением тестового набора, который был разделен в начале, эти данные используются в качестве алгоритма ансамбля.тест набор. То есть при использовании случайного леса мы не можем разделить тестовый набор и обучающий набор, и нам нужно только использовать данные из пакета для тестирования модели. Конечно, это не абсолютно, когда и n, и n_estimators недостаточно велики, очень вероятно, что никакие данные не выпадут из сумки, и, естественно, данные oob не могут быть использованы для тестирования модели. Если вы хотите протестировать данные из пакета, вам нужно настроить параметр oob_score на True при создании экземпляра.После обучения мы можем использовать другой важный атрибут случайных лесов: oob_score_ для просмотра наших данных из пакета.Результаты теста:
rfc=RandomForestClassifier(n_estimators=30,oob_score=True)
rfc=rfc.fit(wine.data,wine.target)
rfc.oob_score_
Четыре важных атрибута и интерфейса
Интерфейс случайного леса точно такой же, как и у дерева решений, поэтому по-прежнему есть четыре часто используемых интерфейса: применить, подобрать, предсказать и оценить. Кроме того, вам также нужно обратить внимание на интерфейс random forest predict_proba.Этот интерфейс возвращает вероятность того, что каждая тестовая выборка присвоена каждому типу метки.Если метка имеет несколько классификаций, он возвращает несколько вероятностей. Если это проблема бинарной классификации, если значение, возвращаемое с помощью predict_proba, больше 0,5, оно будет разделено на 1, а если оно меньше 0,5, оно будет разделено на 0. Традиционный случайный лес использует правила в методе мешков, а среднее или меньшинство подчиняется большинству, чтобы определить результат интеграции, в то время как случайный лес в sklearn усредняет вероятность, возвращаемую предсказанием_пробы, соответствующую каждой выборке, и получает среднюю вероятность для определения теста Классификация образцов.
rfc =RandomForestClassifier(n_estimators=25)
rfc=rfc.fit(x_train,y_train)
#预测结果和标签相比的正确率
print('Random Forest Score:{}'.format(rfc.score(x_test,y_test)))
print('-'*100)
#特征重要性
print('特征重要性:{}'.format([*zip(wine.feature_names,rfc.feature_importances_)]))
print('-'*100)
#每个样本在每棵树中叶子节点的索引
print('每个样本在每棵树中叶子节点的索引:{}'.format(rfc.apply(x_test)[:2]))
print('-'*100)
#测试集预测的标签
print('测试集预测的标签:{}'.format(rfc.predict(x_test)))
print('-'*100)
#每个样本被分到每个标签的概率
print('每个样本被分到每个标签的概率:{}'.format(rfc.predict_proba(x_test)[:5]))
**Перед использованием случайного леса обязательно убедитесь, что деревья классификации, используемые для создания случайного леса, имеют точность прогнозирования не менее 50 %.