Блокнот, использованный для этого урока: Нажмите здесь (поставьте лайк, если понравилось😉)

Случайный лес — это метаоценка, которая соответствует ряду классификаторов дерева решений для различных подвыборок набора данных и использует усреднение для повышения точности прогнозирования и контроля переобучения. Размер подвыборки управляется параметром max_samples, если bootstrap=True (по умолчанию), в противном случае для построения каждого дерева используется весь набор данных. ~sklearn документы

Приведенное выше определение очень запутанное, давайте разберем его.

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

И….. лес — это совокупность деревьев. Таким образом, алгоритм случайного леса содержит большое количество деревьев решений. Его можно использовать как для классификации, так и для регрессии. Это также самый гибкий и простой в использовании алгоритм.

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

Для этого урока мы будем использовать набор данных Дождь в Австралии от Kaggle.

Прежде всего, это проблема классификации. Поэтому мы должны использовать для этой цели RandomForestClassifier.

Перед этим давайте сделаем некоторую очистку и предварительную обработку данных.

import numpy as np # linear algebra
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)

# Input data files are available in the read-only "../input/" directory
# For example, running this (by clicking run or pressing Shift+Enter) will list all files under the input directory

import os
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))

# You can write up to 20GB to the current directory (/kaggle/working/) that gets preserved as output when you create a version using "Save & Run All" 
# You can also write temporary files to /kaggle/temp/, but they won't be saved outside of the current session

Это выводит каталог данных.

Давайте преобразуем эти данные в pandas DataFrame.

df = pd.read_csv("/kaggle/input/weather-dataset-rattle-package/weatherAUS.csv")
df.head()

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

cols = list(df.columns)
cols

Опишите таблицу:

df.describe().T

Этот метод description() действительно помогает в конструировании числовых данных базы данных.

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

import matplotlib.pyplot as plt
import seaborn as sns

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

Для этого нам нужно сначала агрегировать функции, мы можем сделать это, разделив целевой столбец (RainTomorrow.)

X = df.drop('RainTomorrow', axis=1)
X.head()

y = df[["RainTomorrow"]]
y.head()

Мы готовы проверить корреляцию. Лучшим инструментом для визуализации корреляции является тепловая карта Seaborn.

plt.figure(figsize=(20,20))
sns.heatmap(X.corr())
plt.show()

Диагонали, очевидно, будут коррелированы. Кроме того, более темные квадраты представляют меньшую корреляцию, которую мы хотим.

Пока ясно, что некоторые черты определенно коррелируют. Опустим их.

cor_matrix = df.corr().abs()
print(cor_matrix)

upper_tri = cor_matrix.where(np.triu(np.ones(cor_matrix.shape),k=1).astype(np.bool))
print(upper_tri)

to_drop = [column for column in upper_tri.columns if any(upper_tri[column] > 0.95)]
print(); print(to_drop)

Ладно… это много кода. То, что мы сделали, довольно убедительно, сначала была создана корреляционная матрица, затем она была преобразована в верхнюю треугольную матрицу. Из этой верхней треугольной матрицы мы выбрали признаки с индексом больше 0,95.

Одна вещь осталась незамеченной!

Столбцы «Дата» и «Местоположение» также не сильно влияют на определение того, будет ли завтра дождь или нет. (Выбросьте их также).

df = df.drop(['Pressure3pm', 'Temp3pm', 'Date', 'Location'], axis=1)
print(df.head())

Мы близки к созданию нашей модели!

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

Нам нужно предварительно обработать наши данные, чтобы алгоритм мог эффективно предсказывать значения. Категориальные переменные должны быть преобразованы в индикаторные переменные. Для этого мы можем использовать метод панд get_dummies ().

ohe = pd.get_dummies(data=df, columns=['WindGustDir','WindDir9am','WindDir3pm'])
ohe.info()

Нам не хватает еще немного препроцессинга…..

from sklearn import preprocessing
from numpy import array

ohe['RainToday'] = df['RainToday'].astype(str)
ohe['RainTomorrow'] = df['RainTomorrow'].astype(str)

lb = preprocessing.LabelBinarizer()

ohe['RainToday'] = lb.fit_transform(ohe['RainToday'])
ohe['RainTomorrow'] = lb.fit_transform(ohe['RainTomorrow'])
y = ohe['RainTomorrow']
X = ohe.drop(['RainTomorrow'], axis=1)

Хорошо…… Не унывайте!! мы уже на полпути!🎉🎉

Далее мы разделим данные и определим нашу модель.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)
from sklearn.impute import SimpleImputer
imp = SimpleImputer(missing_values=np.nan, strategy='mean')
imp.fit_transform(X_train)

Простой импутер служит заполнителем нулевого значения. Он заменяет нулевые значения средним значением данных.

Создайте конвейер и добавьте в него SimpleImputer и RandomForestClassifier.

from sklearn.ensemble import RandomForestClassifier

model = make_pipeline(
    SimpleImputer(),
    RandomForestClassifier(n_jobs=4, verbose=True, n_estimators=200, max_depth=10, criterion='gini', )
)

model.fit(X_train, y_train)

n_jobs — это параметр, используемый для определения количества ядер, которые будут способствовать подгонке данных.

Теперь оцените модель.

model.score(X_test, y_test)

model.score(X_train, y_train)

Рассчитать счет F1

from sklearn.metrics import f1_score

pred = model.predict(X_test)
print(f1_score(y_test, pred))

И это все!!!

Мы сделали.

Поздравляем!!🎉 Вы создали модель, предсказывающую количество осадков в Австралии.

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

Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий…

Спасибо!!