from sklearn.datasets import make_classification
from sklearn.tree import DecisionTreeClassifier
from sklearn import tree
from sklearn.model_selection import cross_val_score
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
%matplotlib inline
ΠΠ½Π΅Ρ: decision trees
ΠΡΠ΅Π΄ΠΈ ΡΠΎΠ²Π°: Π΄Π° ΡΠΈ ΠΏΡΠΈΠΏΠΎΠΌΠ½ΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ ΠΏΡΠ΅Π΄Π½ΠΈΡ ΠΏΡΡ.
ΠΠΎΠ²Π΅ΡΠ΅ΡΠΎ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² NumPy ΡΠ°Π±ΠΎΡΡΡ Ρ ΡΠ°ΠΊΠ° Π½Π°ΡΠ΅ΡΠ΅Π½Π°ΡΠ° Π²Π΅ΠΊΡΠΎΡΠΈΠ·Π°ΡΠΈΡ. Π’ΠΎΠ²Π° ΠΏΠΎ-Π»Π΅ΡΠ½ΠΎ ΡΠ΅ ΠΈΠ»ΡΡΡΡΠΈΡΠ° Ρ ΠΏΡΠΈΠΌΠ΅Ρ:
np.array([1, 2, 3, 4]) * 5
np.array([1, 2, 3]) * np.array([3, 4, 5])
np.array([8, 3, 4, 1, 9, 4]) > 4
(np.array([8, 3, 4, 1, 9, 4]) > 4).astype(float)
np.array([10, 20, 30])[np.array([1, 0, 2, 0, 1])]
ΠΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΡΠ΅Π» Π΅ Π΄Π° Π½Π΅ Π½ΠΈ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° ΠΏΠΈΡΠ΅ΠΌ for
ΡΠΈΠΊΠ»ΠΈ. ΠΠ°ΡΠΎ Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ β Π²Π΅ΠΊΡΠΎΡΠΈΠ·ΠΈΡΠ°Π½ΠΈΡΠ΅ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΈ Π² NumPy ΡΠ°Π±ΠΎΡΡΡ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎ-Π±ΡΡΠ·ΠΎ ΠΎΡ ΡΠΈΠΊΡΠ»Π° Π² Python, ΠΊΠΎΠΉΡΠΎ Π±ΠΈΡ
ΠΌΠ΅ Π½Π°ΠΏΠΈΡΠ°Π»ΠΈ.
ΠΠΊΠΎ ΠΈΠΌΠ° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΉΠ½ΠΈ Π΄Π°Π½Π½ΠΈ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π½ΠΈΠ·ΠΎΠ²Π΅), ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ LabelEncoder
Π΄Π° Π³ΠΈ Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Ρ ΡΠΈΡΠ»Π°:
from sklearn.preprocessing import LabelEncoder
encoder = LabelEncoder()
encoder.fit(["red", "green", "red", "blue", "red", "green"])
colors = ["green", "green", "blue"]
print("transofrmed:", encoder.transform(["green", "green", "blue"]))
print("inverse: ", encoder.inverse_transform([0, 1, 2]))
ΠΠΎΠΆΠ΅ Π΄Π° ΠΊΠΎΠ΄ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈ Ρ label encoder, ΠΊΠΎΠ³Π°ΡΠΎ Π² ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΠΈΡΠ΅ ΠΈΠΌΠ° Π½ΡΠΊΠ°ΠΊΡΠ² Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ ΡΠ΅Π΄ (Π½Π°ΠΏΡ. 4 Π΅ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠΎ ΠΎΡ 2). ΠΠΊΠΎ Π½ΡΠΌΠ° ΡΠ°ΠΊΡΠ² ΡΠ΅Π΄ ΠΎΠ±Π°ΡΠ΅, Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠ΅ Π΅ Π΄Π° ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ one-hot β ΡΠ°ΠΊΠ° ΡΡΠ·Π΄Π°Π²Π°ΠΌΠ΅ ΠΏΠΎ Π΅Π΄ΠΈΠ½ ΡΠΈΠΉΡΡΡ Π·Π° Π²ΡΡΠΊΠ° ΠΊΠ°ΡΠ΅Π³ΠΎΡΠΈΡ, ΠΊΠΎΠΉΡΠΎ ΠΈΠΌΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈ 0 ΠΈΠ»ΠΈ 1.
from sklearn.preprocessing import OneHotEncoder
encoder = OneHotEncoder()
encoder.fit([[0],
[1],
[0],
[2]])
print(encoder.transform([[0], [1], [1], [2], [0]]).toarray())
ΠΠΎ Π΄Π° ΡΠ΅ Π²ΡΡΠ½Π΅ΠΌ ΠΊΡΠΌ Π΄Π½Π΅ΡΠ½Π°ΡΠ° ΡΠ΅ΠΌΠ°!
ΠΠ΅ΠΊΠ° Π³Π΅Π½Π΅ΡΠΈΡΠ°ΠΌΠ΅ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ΅Π½ dataset ΠΏΠΎΠ΄Ρ ΠΎΠ΄ΡΡ Π·Π° ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡ. ΠΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΡΠ΅ Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ° Π·Π° Π·Π½Π°ΡΠ΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅:
X, y = make_classification(n_samples=100,
n_features=2,
n_redundant=0,
n_clusters_per_class=2,
random_state=123)
X
ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΌΠ°ΡΡΠΈΡΠ° ΠΎΡ ΡΠΎΡΠΊΠΈ (Π²ΡΠ΅ΠΊΠΈ ΡΠ΅Π΄ Π΅ ΡΠΎΡΠΊΠ° Ρ Π΄Π²Π° ΠΊΠΎΠΎΡΠ΄ΠΈΠ½Π°ΡΠ°), Π° y
ΡΠ΅ ΡΡΠ΄ΡΡΠΆΠ° ΠΊΠ»Π°ΡΠ° Π½Π° Π²ΡΡΠΊΠ° ΡΠΎΡΠΊΠ° (0 ΠΈΠ»ΠΈ 1):
print(X[:4])
print(y[:4])
ΠΠ΅ΠΊΠ° Π½Π°ΡΠ΅ΡΡΠ°Π΅ΠΌ ΡΠΎΡΠΊΠΈΡΠ΅ ΠΈ ΡΠ΅Ρ Π½ΠΈΡΠ΅ ΠΊΠ»Π°ΡΠΎΠ²Π΅ Π² ΡΠ°Π²Π½ΠΈΠ½Π°ΡΠ°:
plt.scatter(X[:, 0], X[:, 1], c=y);
Π’ΠΎΠ²Π° Π΅ Π΅Π΄Π½Π° ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΡΠ΅ Π½Π°ΡΠ΅ΡΡΠ°Π΅ decision boundary Π½Π° decision tree (ΡΠ΅ ΠΎΡΠ²Π΅ΡΠΈ ΡΠΎΠ½Π° ΡΠΏΡΡΠΌΠΎ ΠΊΠ°ΠΊ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ° ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈ Π΄Π°Π΄Π΅Π½Π° ΡΠΎΡΠΊΠ°):
# Plotting decision regions adapted from
# http://scikit-learn.org/stable/auto_examples/ensemble/plot_voting_decision_regions.html
def plot_boundary(clf, X, y):
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.1),
np.arange(y_min, y_max, 0.1))
f, ax = plt.subplots(figsize=(10, 8))
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, alpha=0.4)
ax.scatter(X[:, 0], X[:, 1], c=y, s=20, edgecolor='k')
plt.show()
ΠΠ΅ΠΊΠ° ΡΡΠ΅Π½ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ:
classifier = DecisionTreeClassifier().fit(X, y)
print(classifier.score(X, y))
ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΡΠΎΠΉ ΡΡΠΏΡΠ²Π° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅, ΠΊΠΎΠ΅ΡΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ° ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ. ΠΠ΅ΡΠΎΡΡΠΎ ΠΏΡΠ°Π²ΠΈ Π³ΠΎΠ»ΡΠΌ overfitting. ΠΠ° Π½Π°ΡΠ΅ΡΡΠ°Π΅ΠΌ decision boundary-ΡΠΎ:
plot_boundary(classifier, X, y)
ΠΡ Π³ΡΠ°ΡΠΈΠΊΠ°ΡΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ΅ ΠΈΠΌΠ° overfitting β Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ ΠΈΠΌΠ° Π²Π΅ΡΡΠΈΠΊΠ°Π»Π½Π°ΡΠ° ΠΈΠ²ΠΈΡΠ° ΠΎΠΊΠΎΠ»Π° $x_0 = -1$ ΡΠ΅ ΠΊΠ»Π°ΡΠΈΡΠΈΡΠΈΡΠ° ΠΈΠ·ΡΡΠ»ΠΎ ΠΊΠ°ΡΠΎ ΠΆΡΠ»ΡΠ°, Π·Π°ΡΠΎΡΠΎ ΠΈΠΌΠ° Π΅Π΄Π½Π° ΡΠΎΡΠΊΠ° ΠΎΡ ΡΠΎΠ·ΠΈ ΠΊΠ»Π°Ρ. ΠΠΎ-Π²Π΅ΡΠΎΡΡΠ½ΠΎ Π΅ ΡΠΎΠ²Π° Π΄Π° Π΅ Π½ΡΠΊΠ°ΠΊΠ²Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΡ ΠΈ Π΄Π° Π±ΠΈΡ ΠΌΠ΅ ΠΈΡΠΊΠ°Π»ΠΈ Π΄Π° Ρ ΡΠΌΠ΅ΡΠ½Π΅ΠΌ Π·Π° ΡΠΎΡΠΊΠ° ΠΎΡ Π΄ΡΡΠ³ΠΈΡ ΠΊΠ»Π°Ρ.
ΠΠΈΡ
ΠΌΠ΅ ΠΌΠΎΠ³Π»ΠΈ Π΄Π° ΡΠ΅Π³ΡΠ»ΡΡΠΈΠ·ΠΈΡΠ°ΠΌΠ΅ Ρ min_samples_split
:
classifier = DecisionTreeClassifier(min_samples_split=50).fit(X, y)
plot_boundary(classifier, X, y)
Π’ΡΠΊ ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ ΠΏΠΎ-ΠΏΡΠΎΡΡ ΠΌΠΎΠ΄Π΅Π», ΠΊΠΎΠΉΡΠΎ Π΅ΡΡΠ΅ΡΡΠ²Π΅Π½ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΠ° Π½ΡΠΊΠΎΠΈ ΡΠΎΡΠΊΠΈ, Π½ΠΎ ΠΏΠΎΠ½Π΅ Π½Π΅ overfit-Π²Π°.
ΠΠ΅ΠΊΠ° Π½Π°ΡΠ΅ΡΡΠ°Π΅ΠΌ Π΄ΡΡΠ²ΠΎΡΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π΅ ΠΎΡΠΊΡΠΈΠ»:
import graphviz
# ΠΠ° Π΄Π° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΡΠ΅ ΡΠΎΠ·ΠΈ ΠΊΠΎΠ΄ ΡΠ΅ ΡΠ΅ Π½ΡΠΆΠ΄Π°Π΅ΡΠ΅ ΠΎΡ graphviz Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°ΡΠ° ΠΈ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡ ΠΏΠ°ΠΊΠ΅Ρ Π·Π° Π½Π΅Ρ Π² python.
#
# ΠΠ° macOS ΡΠΎΠ²Π° ΡΡΠ°Π²Π° ΡΡΡ:
#
# brew install graphviz
# pip install graphviz
#
# ΠΠ° Π΄ΡΡΠ³ΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΈΠΎΠ½Π½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°ΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΡΡΠ²ΠΈΡ ΡΠ΅Π΄ Ρ ΠΊΠ°ΠΊΠ²ΠΎΡΠΎ Π²ΠΈ Π΅ Π½ΡΠΆΠ½ΠΎ (apt-get, yum, Ρ.Π½.)
def draw_decision_tree(classifier):
dot_data = tree.export_graphviz(classifier, out_file=None)
graph = graphviz.Source(dot_data)
graph.render("tree")
dot_data = tree.export_graphviz(classifier, out_file=None,
feature_names=np.array(['X_0 Vertical', 'X_1 Horizontal']),
class_names=np.array(['Class_0', 'Class_1']),
filled=True, rounded=True,
special_characters=True)
return graphviz.Source(dot_data)
draw_decision_tree(classifier)
Π’ΠΎΠ²Π° Π΅ Π΄ΡΡΠ²ΠΎΡΠΎ Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Ρ max_samples_split=50
. ΠΠΎΠΆΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π½Π΅ΡΠ°.
ΠΡΡΠ²ΠΎ, Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ Π΄ΡΡΠ²ΠΎ ΠΎΡ if
-ΠΎΠ²Π΅ Ρ ΠΊΠΎΠΈΡΠΎ Π΄Π° ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° ΠΊΠ»Π°ΡΠΈΡΠΈΠΊΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ Π²ΡΠΏΡΠΎΡ. ΠΡΡΠ²ΠΎΠ½Π°ΡΠ°Π»Π½ΠΎ ΡΡΠ°Π²Π½ΡΠ²Π° $x_0$ (ΠΏΡΡΠ²ΠΈΡ feature Π² X
Ρ $-0.5159$). ΠΠΊΠΎ Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ, ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Ρ ΠΎΡΠ°Π½ΠΆΠ΅Π²ΠΈΡ ΠΊΠ»Π°Ρ. ΠΠΊΠΎ Π΅ ΠΏΠΎ-Π³ΠΎΠ»ΡΠΌΠΎ, ΡΡΠ°Π²Π½ΡΠ²Π° $x_1$ Ρ $-1.6008$ ΠΈ Π½Π° Π±Π°Π·Π°ΡΠ° Π½Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ° ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π²Π·Π΅ΠΌΠ° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. Π’ΠΎΠ²Π° ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° ΠΏΡΠ°Π²ΠΎΡΠ³ΡΠ»Π½ΠΈΡ Π² ΠΎΠΏΡΠΎΡΡΠ΅Π½ΠΈΡ Π°Π»Π³ΠΎΡΠΈΡΡΠΌ.
ΠΡΠ² samples
ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΊΠΎΠ»ΠΊΠΎ ΡΠΎΡΠΊΠΈ ΠΎΡΡΠ°Π²Π°Ρ ΡΠ»Π΅Π΄ Π²Π·Π΅ΠΌΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠ΅ΡΠ΅Π½ΠΈΠ΅. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, ΠΏΡΡΠ²ΠΈΡ Π²ΡΠ·Π΅Π» ($x_0 < 0.5159$) ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ 100-ΡΠ΅ ΡΠΎΡΠΊΠΈ Π½Π° Π΄Π²Π° Π³ΡΡΠΏΠΈ, Π΅Π΄Π½Π° Ρ 42 ΠΈ Π΄ΡΡΠ³Π° Ρ 58. ΠΡΠ² value
ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠΎ ΠΊΠΎΠ»ΠΊΠΎ ΡΠΎΡΠΊΠΈ ΠΈΠΌΠ° ΠΎΡ Π²ΡΠ΅ΠΊΠΈ ΠΊΠ»Π°Ρ. ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ, Π² Π»ΡΠ²ΠΎΡΠΎ ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΠ΅ ΡΠ»Π΅Π΄ ΠΊΠΎΡΠ΅Π½Π° Π½Π° Π΄ΡΡΠ²ΠΎΡΠΎ ΠΏΠΎΠΏΠ°Π΄Π°ΠΌΠ΅ Π² ΡΠΈΡΡΠ°ΡΠΈΡ, Π² ΠΊΠΎΡΡΠΎ Π² train set-Π° ΠΈΠΌΠ° 39 ΠΎΡΠ°Π½ΠΆΠ΅Π²ΠΈ ΠΈ 3 ΡΠΈΠ½ΠΈ ΠΈ Π΄Π°Π²Π°ΠΌΠ΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡ ΠΎΡΠ°Π½ΠΆΠ΅Π²ΠΈ (Class_0
). ΠΠ»Π³ΠΎΡΠΈΡΡΠΌΠ° Π±ΠΈ ΠΌΠΎΠ³ΡΠ» Π΄Π° ΠΏΡΠΎΠ΄ΡΠ»ΠΆΠΈ Π΄Π° ΡΠ°Π·Π΄Π΅Π»Ρ Π΄ΡΡΠ²ΠΎΡΠΎ, Π½ΠΎ ΠΏΠΎΠ½Π΅ΠΆΠ΅ samples = 42
Π΅ ΠΏΠΎ-ΠΌΠ°Π»ΠΊΠΎ ΠΎΡ min_samples_split = 50
ΡΠΎΠΉ ΡΠΏΠΈΡΠ° Π΄Π° ΡΡΡΠΎΠΈ.
gini
Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΠΉΡΠΎ ΠΏΠΎΠΌΠ°Π³Π° Π½Π° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π΄Π° ΠΏΡΠ΅ΡΠ΅Π½ΠΈ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎΡΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ Π΄Π° Π΄ΡΡΠ²ΠΎΡΠΎ. Π©Π΅ Π³ΠΎ ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΠΎ-Π΄ΠΎΠ»Ρ.
ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊ ΡΠ΅ ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈ Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° Π±Π΅Π· ΡΠ΅Π³ΡΠ»ΡΡΠΈΠ·Π°ΡΠΈΡ:
classifier = DecisionTreeClassifier().fit(X, y)
Π’Π°ΠΊΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° decision boundary-ΡΠΎ:
plot_boundary(classifier, X, y)
Π’Π°ΠΊΠ° ΠΈΠ·Π³Π»Π΅ΠΆΠ΄Π° Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ:
draw_decision_tree(classifier)
ΠΠΎΠΆΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅, ΡΠ΅ Π΄ΡΡΠ²ΠΎΡΠΎ Π΅ Π΄ΠΎΡΡΠ° ΠΏΠΎ-ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ Π·Π° ΡΠΌΠ΅ΡΠΊΠ° Π½Π° ΡΠΎΠ²Π° ΠΎΡΠ³Π°ΡΠ²Π° train set-Π° ΠΏΠ΅ΡΡΠ΅ΠΊΡΠ½ΠΎ. ΠΠΊΠΎ ΠΏΡΠΎΡΠ»Π΅Π΄ΠΈΡΠ΅ ΡΡΠΎΠΉΠ½ΠΎΡΡΠΈΡΠ΅, ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ²Π΅ΡΠΈΡΠ΅, ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΡΡΠ²Π° Π½Π° Π³ΡΠ°ΡΠΈΠΊΠ°ΡΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅.
max_depth
)min_samples_split
)Π‘Π»Π΅Π΄Π²Π° ΠΌΠ°Π»ΠΊΠΎ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°, ΠΊΠΎΡΡΠΎ Π½Π΅ Π΅ ΡΡΡΠ΅ΡΡΠ²Π΅Π½Π° Π·Π° ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΎΠ²Π° ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ ΡΠ»ΡΡΠ²Π°, Π½ΠΎ ΠΎΠΏΠΈΡΠ²Π° ΠΊΠ°ΡΡΠΈΠ½ΠΊΠ°ΡΠ° Π΅Π΄Π½Π° ΠΈΠ΄Π΅Ρ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅:
ΠΡΠ΅Π½ΡΠ²Π°ΡΠ°ΡΠ° ΡΡΠ½ΠΊΡΠΈΡ ΡΠ°Π±ΠΎΡΠΈ, ΡΡΠ΅Π· Information Gain:
$$ InformationGain = impurity(parent) - {WeightedAverageBySamplesCount}\sum{impurity(children)}$$
$impurity$ Π΅ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ²Π° "ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅". Π Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»Π·Π²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ:
ΠΡΠΈ ΠΏΡΠ΅Π΄Π²ΠΈΠΆΠ΄Π°Π½Π΅ Π½Π° Π½ΠΎΠ² Π·Π°ΠΏΠΈΡ, Π°Π»Π³ΠΎΡΠΈΡΡΠΌΡΡ ΡΠ΅ ΡΠΏΡΡΠΊΠ° ΠΏΠΎ ΠΏΠΎΡΡΡΠΎΠ΅Π½ΠΎΡΠΎ Π΄ΡΡΠ²ΠΎ Π΄ΠΎΠΊΠ°ΡΠΎ ΡΡΠΈΠ³Π½Π΅ Π²ΡΠ·Π΅Π» Π±Π΅Π· Π½Π°ΡΠ»Π΅Π΄Π½ΠΈΡΠΈ.
ΠΠΌΠ°ΠΌΠ΅ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ:
['ΠΡΡΠΎ', 'ΠΡΡΠΎ', 'Π‘ΡΠ΅ΡΠ°Π½', 'Π‘ΡΠ΅ΡΠ°Π½']
ΠΡΡΠΎ - 2, Π‘ΡΠ΅ΡΠ°Π½ - 2
ΠΡΠΎΠΏΠΎΡΡΠΈΠΈ:
ΠΡΡΠΎ: $\frac{2}{4}$, Π‘ΡΠ΅ΡΠ°Π½: $\frac{2}{4}$
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΡΡΠΎ: $$-\frac{2}{4} * log_2(\frac{2}{4})$$ $$-0.5 * -1$$ $$0.5$$
Π‘ΡΠ΅ΡΠ°Π½ ΠΈΠΌΠ° ΡΡΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ $0.5$.
ΠΠ½ΡΡΠΎΠΏΠΈΡΡΠ° Π½Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ Π΅ $$entropy=0.5+0.5 = 1.0$$
['ΠΡΡΡΠΈ', 'ΠΡΡΡΠΈ', 'ΠΡΡΡΠΈ']
ΠΡΡΡΠΈ - 3
ΠΡΠΎΠΏΠΎΡΡΠΈΠΈ:
ΠΡΡΡΠΈ $\frac{3}{3} = 1$
$$-1 * log_2(1)$$ $$-1 * 0$$ $$entropy=0$$
ΠΡΠΎ ΡΡΠ½ΠΊΡΠΈΡ, ΠΊΠΎΡΡΠΎ ΠΈΠ·ΠΌΠ΅ΡΠ²Π° ΡΠΎΠ²Π°:
def entropy(subset_counts):
subset_counts = np.array(subset_counts)
subset_counts_normalized = subset_counts / subset_counts.sum()
entropy = sum([-subset_count * np.log2(subset_count + 0.000000000001)
for subset_count in subset_counts_normalized])
entropy = np.round(entropy, 4)
print('Entropy for', subset_counts, 'is', entropy)
return entropy
ΠΠ±ΡΡΠ½Π΅ΡΠ΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π½Π° + 0.000000000001
Π² Π»ΠΎΠ³Π°ΡΠΈΡΡΠΌΠ°. ΠΠΈΡΠ»Π΅ΡΠ΅ Π·Π° ΡΠΎΠ²Π° ΠΊΠ°ΡΠΎ Ρ
Π°ΠΊ, Ρ ΠΊΠΎΠΉΡΠΎ ΡΠ° ΡΠΈ ΡΠΏΠ΅ΡΡΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΡΠΌΠ΅ΡΠΊΠΈ Π·Π° Π΄Π° ΠΈΠ·Π±Π΅Π³Π½Π΅ΠΌ ΡΠΌΡΡΠ°Π½Π° Π½Π° Π»ΠΎΠ³Π°ΡΠΈΡΡΠΌ ΠΎΡ 0.
samples = [[2, 0], [1, 0], [9, 1], [4, 4]]
for sample in samples:
entropy(sample)
ΠΡΠΈ Π΄Π²Π° ΠΊΠ»Π°ΡΠ° Π΅Π½ΡΡΠΎΠΏΠΈΡΡΠ° ΡΠ΅ Π΅ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ $\big[0, 1\big]$. ΠΠΌΠ°ΠΌΠ΅ $1$ ΠΊΠΎΠ³Π°ΡΠΎ Π΄Π²Π°ΡΠ° ΠΊΠ»Π°ΡΠ° ΡΠ° ΡΠ°Π²Π½ΠΎΠΌΠ΅ΡΠ½ΠΎ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΠΈ $0$, ΠΊΠΎΠ³Π°ΡΠΎ ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ° Π΅Π»Π΅ΠΌΠ΅Π½ΡΠΈ ΡΠ°ΠΌΠΎ ΠΎΡ Π΅Π΄ΠΈΠ½ΠΈΡ Π²ΠΈΠ΄.
ΠΡΠΈ ΡΡΠΈ ΠΈΠ»ΠΈ ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΊΠ»Π°ΡΠ°, ΡΡΠ½ΠΊΡΠΈΡΡΠ° Π½ΡΠΌΠ° Π³ΠΎΡΠ½Π° Π³ΡΠ°Π½ΠΈΡΠ°:
samples = [[2, 0, 1], [6, 0, 0], [9, 1, 0], [5, 5, 0], [5, 5, 5]]
for sample in samples:
entropy(sample)
$H(X_m) = \sum_k p_{mk} (1 - p_{mk})$
$p_{mk}$ ΠΎΡΠ½ΠΎΠ²ΠΎ Π΅ ΠΏΡΠΎΠΏΠΎΡΡΠΈΡΡΠ° Π½Π° ΠΊΠ»Π°ΡΠ° Π² ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎΡΠΎ.
['ΠΡΡΠΎ', 'ΠΡΡΠΎ', 'Π‘ΡΠ΅ΡΠ°Π½', Π‘ΡΠ΅ΡΠ°Π½']
ΠΡΡΠΎ - 2, Π‘ΡΠ΅ΡΠ°Π½ - 2
ΠΡΠΎΠΏΠΎΡΡΠΈΠΈ:
ΠΡΡΠΎ: $\frac{2}{4}$, Π‘ΡΠ΅ΡΠ°Π½: $\frac{2}{4}$
Π‘ΡΠΎΠΉΠ½ΠΎΡΡ Π·Π° ΠΡΡΠΎ: $$\frac{2}{4} * (1 - \frac{2}{4})$$ $$0.5 * 0.5$$ $$0.25$$
Π‘ΡΠ΅ΡΠ°Π½ ΠΈΠΌΠ° ΡΡΡΠ°ΡΠ° ΡΡΠΎΠΉΠ½ΠΎΡΡ $0.25$.
$$gini=0.25+0.25 = 0.5$$
['ΠΡΡΡΠΈ', 'ΠΡΡΡΠΈ', 'ΠΡΡΡΠΈ']
ΠΡΡΡΠΈ - 3
ΠΡΠΎΠΏΠΎΡΡΠΈΠΈ:
ΠΡΡΡΠΈ $\frac{3}{3} = 1$
$$1 * (1 - 1)$$ $$1 * 0$$ $$gini=0$$
def gini_impurity(subset_counts):
subset_counts = np.array(subset_counts)
subset_counts_normalized = subset_counts / subset_counts.sum()
impurity = sum([subset_count * (1 - subset_count)
for subset_count in subset_counts_normalized])
print('Gini impurity for', subset_counts, 'is', impurity)
return impurity
samples = [[2, 0], [1, 0], [9, 1], [4, 4]]
for sample in samples:
gini_impurity(sample)
samples = [[2, 0, 1], [6, 0, 0], [9, 1, 0], [5, 5, 0], [5, 5, 5]]
for sample in samples:
gini_impurity(sample)
$H(X_m) = 1 - \max(p_{mk})$
def missclassification_impurity(subset_counts):
subset_counts = np.array(subset_counts)
subset_counts_normalized = subset_counts / subset_counts.sum()
impurity = 1 - max(subset_counts_normalized)
print('Misclassification impurity for', subset_counts, 'is', impurity)
return impurity
samples = [[2, 0], [1, 0], [9, 1], [4, 4]]
for sample in samples:
missclassification_impurity(sample)
samples = [[2, 0, 1], [6, 0, 0], [9, 1, 0], [5, 5, 0], [5, 5, 5]]
for sample in samples:
missclassification_impurity(sample)
ΠΠΎΠ³Π°ΡΠΎ ΠΊΠΎΠ½ΡΡΡΡΠΈΡΠ°ΡΠ΅ Π΄ΡΡΠ²ΠΎ, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΏΠΎΠ΄Π°Π΄Π΅ΡΠ΅ ΠΊΡΠΈΡΠ΅ΡΠΈΠΉ ΠΊΠΎΡ ΡΡΠ½ΠΊΡΠΈΡ Π΄Π° ΡΠ΅ ΠΏΠΎΠ»Π·Π²Π°. Π’ΠΎΠ²Π° Π΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° criterion
. scikit-learn ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΡΠ°ΠΌΠΎ gini
ΠΈ entropy
. ΠΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°ΡΠΈΡΡΠ°:
http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html
ΠΠ° Π²ΡΡΠΊΠ° ΡΡΡΠΏΠΊΠ° Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ²Π° Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈ Π½Π΅ΡΠ°Π²Π΅Π½ΡΡΠ²ΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΄Π° ΠΎΠΏΡΠΈΠΌΠΈΠ·ΠΈΡΠ° information gain-Π°. Π’ΠΎΠΉ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠ°Π²Π° ΠΏΠΎ ΡΠ»Π΅Π΄Π½Π°ΡΠ° ΡΠΎΡΠΌΡΠ»Π°:
$ InformationGain = impurity(parent) - \sum_k{p_{mk}}{impurity(children)}$
ΠΠΎΠΆΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈ, ΠΊΠΎΠΈΡΠΎ Π±ΠΈΡ ΠΌΠ΅ ΠΈΠΌΠ°Π»ΠΈ ΠΏΡΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈΡΠ΅ ΡΡΠ½ΠΊΡΠΈΠΈ Π·Π° ΠΎΡΠ΅Π½ΠΊΠ° Π½Π° ΠΏΡΠΈΠΌΠ΅ΡΠΈΡΠ΅:
def information_gain(subsets, parent_impurity=1, f=entropy):
total_count = sum(sum(i) for i in subsets)
print("Total count:", total_count)
subsets_impurity = sum((sum(subset) / total_count * f(subset) for subset in subsets))
gain = parent_impurity - subsets_impurity
print("Information gain:", gain)
return gain
subsets = [[2, 1], [1]]
for f in [entropy, gini_impurity, missclassification_impurity]:
information_gain(subsets, parent_impurity=1, f=f);
print();
subsets = [[2], [2]]
for f in [entropy, gini_impurity, missclassification_impurity]:
information_gain(subsets, parent_impurity=1, f=f);
print();
gini_impurity([48, 52])
gini_impurity([9, 49])
gini_impurity([39, 3])
gini_impurity([0, 46]);
ΠΠΎ ΡΡΠΊ Ρ ΠΌΠ°ΡΠ΅ΠΌΠ°ΡΠΈΠΊΠ°ΡΠ°. ΠΠ΅ Π΅ Π½ΡΠΆΠ½ΠΎ Π΄Π° Π·Π°ΠΏΠΎΠΌΠ½ΠΈΡΠ΅ Π²ΡΠΈΡΠΊΠΎ, Π½ΠΎ Π°ΠΊΠΎ Π²ΠΈ ΡΠ΅ Π½Π°Π»Π°Π³Π° Π΄Π° Π΄Π΅Π±ΡΠ³Π²Π°ΡΠ΅ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΠΎΡΠΊΡΠΈΠ» Π°Π»Π³ΠΎΡΠΈΡΡΠΌΠ°, ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΠΏΠΎΠΌΠΎΠ³Π½Π΅ Π΄Π° ΡΠΈ Π³ΠΎ ΠΎΠ±ΡΡΠ½ΠΈΡΠ΅.
ΠΠ° Π΄Π° ΡΠ΅ ΡΠΏΡΠ°Π²ΠΈΠΌ Ρ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈΡΠ΅ Π½Π° decision tree ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π½Π΅ΡΠΎ, Π½Π°ΡΠ΅ΡΠ΅Π½ΠΎ random forest. Π’ΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
ΠΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΠΏΡΠΈΡΠΈΠ½ΠΈΡΠ΅ ΡΠΎΠ²Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΠΏΠΎ-Π΄ΠΎΠ±ΡΠ΅:
Π scikit-learn ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ random forest ΠΏΠΎ ΡΠ»Π΅Π΄Π½ΠΈΡ Π½Π°ΡΠΈΠ½:
from sklearn.ensemble import RandomForestClassifier
classifier = RandomForestClassifier(random_state=23).fit(X, y) # Π±Π΅Π· Π½Π°ΡΡΠΎΠΉΠΊΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅
plot_boundary(classifier, X, y)
(ΠΏΠΎΠ΄Π°Π»ΠΈ ΡΠΌΠ΅ random_state=23
Π·Π° Π΄Π° ΠΏΠΎΠ»ΡΡΠ°Π²Π°ΠΌΠ΅ Π΄Π΅ΡΠ΅ΡΠΌΠΈΠ½ΠΈΡΡΠΈΡΠ΅Π½ ΠΎΡΠ³ΠΎΠ²ΠΎΡ β Π°ΠΊΠΎ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π°ΠΌΠ΅ΡΠ΅Π½Π° Π΄ΡΡΠ³Π° Π³ΠΎΡΠ°, ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ ΠΏΡΠ°Π²ΠΈ Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄Π½ΠΈ ΠΈ ΡΡΡΠΈ Π³ΡΠ°ΡΠΈΠΊΠΈ Π² ΡΠΎΠ·ΠΈ notebook ΡΡΡΠ΄Π½ΠΎ)
n_estimators
β Π±ΡΠΎΠΉ Π΄ΡΡΠ²Π΅ΡΠ° (10, 100, 1000)criterion
β Π·Π° Π²ΡΠΈΡΠΊΠΈ Π΄ΡΡΠ²Π΅ΡΠ° (gini, entropy)max_features
β ΠΊΠΎΠ»ΠΊΠΎ feature Π΄Π° ΡΠ΅ ΠΏΡΠΎΠ±Π²Π°Ρ ΠΏΡΠΈ ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π½Π°ΠΉ-Π΄ΠΎΠ±ΡΠΎ ΡΠ°Π·Π΄Π΅Π»ΡΠ½Π΅. ΠΠΎ ΠΏΠΎΠ΄ΡΠ°Π·Π±ΠΈΡΠ°Π½Π΅ Π΅ sqrt(n_features)
, ΠΊΠ°ΡΠΎ ΡΠ° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΈ Π²ΡΡΠΊΠΎ Π½ΠΎΠ²ΠΎ ΡΡΡΡΠ΅Π½Π΅.max_depth
β ΠΌΠ°ΠΊΡΠΈΠΌΠ°Π»Π½Π° Π΄ΡΠ»Π±ΠΎΡΠΈΠ½Π° Π½Π° Π΄ΡΡΠ²Π΅ΡΠ°ΡΠ°.min_samples_split
β ΠΌΠΈΠ½ΠΈΠΌΠ°Π»Π΅Π½ Π±ΡΠΎΠΉ ΡΠ΅ΠΌΠΏΠ»ΠΈ Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΠ°Π·Π΄Π΅Π»ΠΈ Π²ΡΠ·Π΅Π»Π°bootstrap
β Π²ΡΠΎΡΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π·Π° ΡΠ»ΡΡΠ°ΠΉΠ½ΠΎΡΡ - random sampling with replacement. Π’Π΅Π³Π»ΠΈ ΡΡΡΠΈΡ Π±ΡΠΎΠΉ ΡΠ΅ΠΌΠΏΠ»ΠΈ ΠΊΠ°ΡΠΎ ΠΎΡΠΈΠ³ΠΈΠ½Π°Π»Π½ΠΈΡ ΡΠ΅Ρ, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠ·ΡΠ΅Π³Π»ΠΈ Π΅Π΄ΠΈΠ½ Π΅Π»Π΅ΠΌΠ΅Π½ Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΡΠΈ (ΠΈ Π΄Π° Π½Π΅ ΠΈΠ·ΡΠ΅Π»ΠΈ Π΄ΡΡΠ³)n_jobs
β ΡΡΠ΅Π½ΠΈΡΠ° ΠΏΠΎ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΄ΡΡΠ²Π΅ΡΠ° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ, Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΏΠ°ΠΌΠ΅Ρrandom_state
β Π·Π° Π²ΡΠ·ΠΏΡΠΎΠΈΠ·Π²Π΅Π΄ΠΈΠΌΠΈ Π΅ΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΠΡΠΎ ΠΈ Π΄Π²Π΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»Π½ΠΈ Π΄ΡΡΠ²Π΅ΡΠ°, Π±Π΅Π· ΡΠΈΠΊΡΠΈΡΠ°Π½ random_state
:
classifer = RandomForestClassifier().fit(X, y)
plot_boundary(classifer, X, y)
classifer = RandomForestClassifier().fit(X, y)
plot_boundary(classifer, X, y)
Π‘Ρ ΠΎΠ΄Π½ΠΎ Π½Π° ΡΠ΅Π³Π»Π°ΡΠ° Π½Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ ΠΏΡΠΈ Π»ΠΈΠ½Π΅ΠΉΠ½ΠΈ ΠΌΠΎΠ΄Π΅Π»ΠΈ, random forest ΠΌΠΎΠΆΠ΅ Π΄Π° Π²ΠΈ ΠΊΠ°ΠΆΠ΅ ΠΊΠΎΠΈ feature-Π° Π½Π°ΠΌΠΈΡΠ° Π·Π° Π½Π°ΠΉ-Π·Π½Π°ΡΠΈΠΌΠΈ (Ρ.Π΅. Π½ΠΎΡΡΡ Π½Π°ΠΉ-ΠΌΠ½ΠΎΠ³ΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ).
ΠΠΎΠΆΠ΅ Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΏΠΎΠ²Π΅ΡΠ΅ ΡΡΠΊ: http://scikit-learn.org/stable/auto_examples/ensemble/plot_forest_importances.html