Вернуться на страницу brain2net: https://brain2net.ru/post/derevya-i-lesa-klassifikacziya/
import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn import tree
import matplotlib.pyplot as plt
%matplotlib inline
# Загрузка набора данных Breast Cancer
from sklearn.datasets import load_breast_cancer
cancer = load_breast_cancer()
# Разделение набора данных на обучающую и тестовую выборки
X_train, X_test, y_train, y_test = train_test_split(cancer.data, cancer.target, stratify=cancer.target, random_state=42)
# Если не ограничить глубину, дерево может быть сколь угодно глубоким и сложным.
# Поэтому необрезанные деревья склонны к переобучению и плохо обобщают результат на новые данные.
# Один из вариантов – остановка процесса построения дерева по достижении определенной глубины.
# max_depth=4 - можно задать только четыре последовательных вопроса
clf = DecisionTreeClassifier(max_depth=4, random_state=0)
clf.fit(X_train, y_train)
print("Правильность на обучающем наборе: {:.3f}".format(clf.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.3f}".format(clf.score(X_test, y_test)))
# Визуализация дерева
# max_depth = 2 количество визуализируемых уровней
# fontsize = 6 Размер шрифта
tree.plot_tree(clf, max_depth = 2, fontsize = 6)
plt.show()
# Визуализация важности признаков
print("Важности признаков:\n{}".format(clf.feature_importances_))
for name, score in zip(cancer["feature_names"], clf.feature_importances_):
print(name, score)
# Визуализировать важности признаков
def plot_feature_importances_cancer(model):
n_features = cancer.data.shape[1]
plt.barh(range(n_features), model.feature_importances_, align='center')
plt.yticks(np.arange(n_features), cancer.feature_names)
plt.xlabel("Важность признака")
plt.ylabel("Признак")
plot_feature_importances_cancer(clf)
from sklearn.ensemble import RandomForestClassifier
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
forest = RandomForestClassifier(n_estimators=100, n_jobs=-1, random_state=0)
forest.fit(X_train, y_train)
print("Правильность на обучающем наборе: {:.3f}"
.format(forest.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.3f}".
format(forest.score(X_test, y_test)))
from sklearn.ensemble import GradientBoostingClassifier
X_train, X_test, y_train, y_test = train_test_split(
cancer.data, cancer.target, random_state=0)
Для уменьшения переобучения можно применить
более сильную предварительную обрезку, ограничив максимальную глубину, max_depth=1
или снизить скорость обучения learning_rate=0.01
gbrt = GradientBoostingClassifier(random_state=0,
max_depth=2, learning_rate=0.01)
gbrt.fit(X_train, y_train)
print("Правильность на обучающем наборе: {:.3f}"
.format(gbrt.score(X_train, y_train)))
print("Правильность на тестовом наборе: {:.3f}"
.format(gbrt.score(X_test, y_test)))
from sklearn.datasets import make_hastie_10_2
X, y = make_hastie_10_2(random_state=0)
X_train, X_test = X[:2000], X[2000:]
y_train, y_test = y[:2000], y[2000:]
clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,
max_depth=1, random_state=0).fit(X_train, y_train)
clf.score(X_test, y_test)
Вернуться на страницу brain2net: https://brain2net.ru/post/derevya-i-lesa-klassifikacziya/