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

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

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

Ниже приведены основные шаги, связанные с созданием случайного леса. Он работает в четыре этапа:

  1. Выберите случайные выборки из заданного набора данных.
  2. Постройте дерево решений для каждой выборки и получите результат прогноза из каждого дерева решений.
  3. Выполните голосование за каждый прогнозируемый результат.
  4. Выберите результат прогноза с наибольшим количеством голосов в качестве окончательного прогноза.

Создание классификатора с использованием Scikit-learn

Мы построим модель на наборе данных цветка ириса, который является очень известным классификационным набором. Он включает длину чашелистика, ширину чашелистика, длину лепестка, ширину лепестка и тип цветка. Существует три вида или класса: setosa, versicolor и virginia.

Мы построим модель для классификации типа цветка. Набор данных доступен в библиотеке scikit-learn.

  1. Начните с импорта библиотеки наборов данных из scikit-learn и загрузите набор данных радужной оболочки с помощью load_iris().

from sklearn import datasets
#Load dataset
iris = datasets.load_iris()

2. Здесь мы можем создать DataFrame набора данных радужной оболочки.

# Creating a DataFrame of given iris dataset.
import pandas as pd
data=pd.DataFrame({
    'sepal length':iris.data[:,0],
    'sepal width':iris.data[:,1],
    'petal length':iris.data[:,2],
    'petal width':iris.data[:,3],
    'species':iris.target
})
data.head()

3. Теперь разделите столбцы на зависимые и независимые переменные (или функции и метки). Затем разделите эти переменные на обучающий и тестовый наборы.

# Import train_test_split function
from sklearn.model_selection import train_test_split
X=data[['sepal length', 'sepal width', 'petal length', 'petal width']]  # Features
y=data['species']  # Labels
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3) # 70% training and 30% test

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

#Import Random Forest Model
from sklearn.ensemble import RandomForestClassifier
#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)
#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)
y_pred=clf.predict(X_test)

После обучения проверьте точность, используя фактические и прогнозируемые значения.

#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
('Accuracy:', 0.929990909399001)

4. Сделайте прогноз для одного элемента, например:

  • длина чашелистика = 3
  • ширина чашелистика = 5
  • длина лепестка = 4
  • ширина лепестка = 2

Теперь угадайте, какой это цветок.

clf.predict([[3, 5, 4, 2]])
array([2])

Здесь цифра 2 указывает на тип цветка Вирджиния.

5. Поиск важных функций в Scikit-learn

Здесь мы находим важные функции или выбираем функции в наборе данных IRIS. В scikit-learn мы можем выполнить эту задачу, выполнив следующие шаги:

а) создать модель случайного леса.

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

c) визуализировать эти оценки, используя библиотеку Seaborn.

from sklearn.ensemble import RandomForestClassifier
#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)
#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)
RandomForestClassifier(bootstrap=True, class_weight=None, criterion='gini',
            max_depth=None, max_features='auto', max_leaf_nodes=None,
            min_impurity_decrease=0.0, min_impurity_split=None,
            min_samples_leaf=1, min_samples_split=2,
            min_weight_fraction_leaf=0.0, n_estimators=100, n_jobs=1,
            oob_score=False, random_state=None, verbose=0,
            warm_start=False)
import pandas as pd
feature_imp = pd.Series(clf.feature_importances_,index=iris.feature_names).sort_values(ascending=False)
feature_imp
petal width (cm)     0.458607
petal length (cm)    0.413859
sepal length (cm)    0.103600
sepal width (cm)     0.023933
dtype: float64

Вы также можете визуализировать важность функции. Визуализации легко понять и интерпретировать.

Для визуализации можно использовать комбинацию matplotlib и seaborn. Поскольку seaborn построен на основе matplotlib, он предлагает ряд настраиваемых тем и предоставляет дополнительные типы сюжетов. Matplotlib — это надмножество Seaborn, и оба одинаково важны для хорошей визуализации.

import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
# Creating a bar plot
sns.barplot(x=feature_imp, y=feature_imp.index)
# Add labels to your graph
plt.xlabel('Feature Importance Score')
plt.ylabel('Features')
plt.title("Visualizing Important Features")
plt.legend()
plt.show()

6) Создание модели на выбранных функциях

Здесь мы можем удалить признак «ширина чашелистика», потому что он имеет очень малое значение, и выбрать 3 оставшихся признака.

# Import train_test_split function
from sklearn.cross_validation import train_test_split
# Split dataset into features and labels
X=data[['petal length', 'petal width','sepal length']]  # Removed feature "sepal length"
y=data['species']                                       
# Split dataset into training set and test set
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.70, random_state=5) # 70% training and 30% test

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

from sklearn.ensemble import RandomForestClassifier
#Create a Gaussian Classifier
clf=RandomForestClassifier(n_estimators=100)
#Train the model using the training sets y_pred=clf.predict(X_test)
clf.fit(X_train,y_train)
# prediction on test set
y_pred=clf.predict(X_test)
#Import scikit-learn metrics module for accuracy calculation
from sklearn import metrics
# Model Accuracy, how often is the classifier correct?
print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
('Accuracy:', 0.9408065267073221)

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

Для повышения точности я бы предложил поиграться с другими параметрами класса RandomForestClassifier