1 часть, 2 часть, 3 часть, 4 часть, 5 часть...
Перейдём от отдельных деревьев к целым лесам.
Для начала импортируем эти леса.
from sklearn.ensemble import RandomForestClassifier
Ну и сразу создадим соответствующий классификатор.
clf = RandomForestClassifier()
Можно считать, что ты создали лес, теперь нам надо подобрать ему оптимальные параметры и обучить его.
Мы конечно можем подбирать параметры через for, но это будет довольно долго, к тому же есть довольно удобный GridSearchCV, так что не будем мучиться и просто импортируем его.
from sklearn.model_selection import GridSearchCV
Теперь нам надо определиться с тем какие параметры мы будем подбирать.
Так как лес это куча деревьев мы естественно будем подбирать кол-во деревьев( n_estimators ) которые у нас будут в этом лесу. Помимо этого нам надо бы изменить критерий( criterion ) с gini на entropy, но сейчас мы их сравним чтобы посмотреть какой более эффективен. Помимо этого пройдёмся по максимальной глубине дерева( max_depth ), минимальному кол-ву объектов которое должно быть перед разделением( min_samples_split ) и какое кол-во должно быть минимум в каждом "разделённом"( min_samples_leaf ). Можно было бы просто перебрать все параметры, но мы этой фигнёй заниматься пока что не будем.
parametrs = {'n_estimators': range(50, 201, 50),
'criterion': ['gini', 'entropy'],
'max_depth': range(1, 10, 2),
'min_samples_split': range(6, 8),
'min_samples_leaf': range(3, 5)}
grid_search_cv_clf = GridSearchCV(clf, parametrs)
Ну а теперь скормим ему наши данные чтобы он подобрал параметры.
grid_search_cv_clf.fit(X, y)
Это займёт некоторое время.
По итогу мы сможем проверить какие параметры он нам подобрал.
grid_search_cv_clf.best_params_
{'criterion': 'entropy',
'max_depth': 7,
'min_samples_leaf': 4,
'min_samples_split': 7,
'n_estimators': 100}
Ну и под конец мы создадим классификатор по этим параметрам.
clf_1 = grid_search_cv_clf.best_estimator_
Ну и теперь наши метрики нам покажут, что классификатор стал лучше.
score - 0.8779904306220095
precision_score - 0.8389261744966443
recall_score - 0.8223684210526315
Но это не предел и можно лучше.