14.1. Trenowanie klasyfikatora drzewa decyzyjnego

# Wczytanie bibliotek.
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora drzewa decyzyjnego.
decisiontree = DecisionTreeClassifier(random_state=0)

# Wytrenowanie modelu.
model = decisiontree.fit(features, target)





# Utworzenie nowej obserwacji.
observation = [[ 5,  4,  3,  2]]

# Prognozowanie klasy obserwacji.
model.predict(observation)

array([1])





# Wyświetlenie dla trzech klas prawdopodobieństwa prognozowanej klasy.
model.predict_proba(observation)

array([[ 0.,  1.,  0.]])





# Utworzenie obiektu klasyfikatora drzewa decyzyjnego za pomocą entropii.
decisiontree_entropy = DecisionTreeClassifier(
    criterion='entropy', random_state=0)

# Wytrenowanie modelu.
model_entropy = decisiontree_entropy.fit(features, target)





14.2. Trenowanie regresora drzewa decyzyjnego

# Wczytanie bibliotek.
from sklearn.tree import DecisionTreeRegressor
from sklearn import datasets

# Wczytanie danych zawierających tylko dwie cechy.
diabetes = datasets.load_diabetes()
features = diabetes.data
target = diabetes.target

# Utworzenie obiektu klasyfikatora drzewa decyzyjnego.
decisiontree = DecisionTreeRegressor(random_state=0)

# Wytrenowanie modelu.
model = decisiontree.fit(features, target)





# Utworzenie nowej obserwacji.
observation = [features[0]]

# Prognozowanie wartości obserwacji.
model.predict(observation)

array([ 151.])





# Utworzenie obiektu klasyfikatora drzewa decyzyjnego za pomocą entropii.
decisiontree_mae = DecisionTreeRegressor(criterion="absolute_error", random_state=0)

# Wytrenowanie modelu.
model_mae = decisiontree_mae.fit(features, target)





14.3. Wizualizacja modelu drzewa decyzyjnego

# Wczytanie bibliotek.
import pydotplus
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets
from IPython.display import Image
from sklearn import tree

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora drzewa decyzyjnego.
decisiontree = DecisionTreeClassifier(random_state=0)

# Wytrenowanie modelu.
model = decisiontree.fit(features, target)

# Utworzenie danych w formacie DOT.
dot_data = tree.export_graphviz(decisiontree,
                                out_file=None,
                                feature_names=iris.feature_names,
                                class_names=iris.target_names)

# Wygenerowanie drzewa w postaci wizualnej.
graph = pydotplus.graph_from_dot_data(dot_data)

# Wyświetlenie wygenerowanego drzewa.
Image(graph.create_png())





# Utworzenie pliku w formacie PDF.
graph.write_pdf("iris.pdf")

True

# Utworzenie pliku w formacie PNG.
graph.write_png("iris.png")

True





14.4. Trenowanie klasyfikatora losowego lasu

# Wczytanie bibliotek.
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora losowego lasu.
randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)

# Wytrenowanie modelu.
model = randomforest.fit(features, target)





# Utworzenie nowej obserwacji.
observation = [[ 5,  4,  3,  2]]

# Prognozowanie klasy obserwacji.
model.predict(observation)

array([1])





# Utworzenie obiektu klasyfikatora losowego lasu za pomocą entropii.
randomforest_entropy = RandomForestClassifier(
    criterion="entropy", random_state=0)

# Wytrenowanie modelu.
model_entropy = randomforest_entropy.fit(features, target)





14.5. Trenowanie regresora losowego lasu

# Wczytanie bibliotek.
from sklearn.ensemble import RandomForestRegressor
from sklearn import datasets

# Wczytanie danych zawierających tylko dwie cechy.
diabetes = datasets.load_diabetes()
features = diabetes.data
target = diabetes.target

# Utworzenie obiektu regresora losowego lasu.
randomforest = RandomForestRegressor(random_state=0, n_jobs=-1)

# Wytrenowanie modelu.
model = randomforest.fit(features, target)





14.6. Ocena losowego lasu za pomocą estymatora błędu out-of-bag

# Wczytanie bibliotek.
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora losowego lasu.
randomforest = RandomForestClassifier(
    random_state=0, n_estimators=1000, oob_score=True, n_jobs=-1)

# Wytrenowanie modelu.
model = randomforest.fit(features, target)

# Wyświetlenie wartości estymatora błędu out-of-bag.
randomforest.oob_score_

0.95333333333333334





14.7. Identyfikacja ważnych cech w losowych lasach

# Wczytanie bibliotek.
import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora losowego lasu.
randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)

# Wytrenowanie modelu.
model = randomforest.fit(features, target)

# Ustalenie wagi cechy.
importances = model.feature_importances_

# Posortowanie wagi cech w kolejności malejącej.
indices = np.argsort(importances)[::-1]

# Ponowne rozmieszczenie nazw cech w taki sposób, aby zostały dopasowane do posortowanych wag cech.
names = [iris.feature_names[i] for i in indices]

# Utworzenie wykresu.
plt.figure()

# Utworzenie tytułu wykresu.
plt.title("Waga cech")

# Dodanie słupków.
plt.bar(range(features.shape[1]), importances[indices])

# Dodanie nazw cech jako etykiet na osi X.
plt.xticks(range(features.shape[1]), names, rotation=90)

# Wyświetlenie wykresu.
plt.show()





# Wyświetlenie wag cech.
model.feature_importances_

array([0.09090795, 0.02453104, 0.46044474, 0.42411627])





14.8. Wybór ważnych cech w losowym lesie

# Wczytanie bibliotek.
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets
from sklearn.feature_selection import SelectFromModel

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie klasyfikatora losowego lasu.
randomforest = RandomForestClassifier(random_state=0, n_jobs=-1)

# Utworzenie obiektu wybierającego cechy o wadze większej
# niż lub równej podanej wartości progowej.
selector = SelectFromModel(randomforest, threshold=0.3)

# Przygotowanie nowej macierzy cech.
features_important = selector.fit_transform(features, target)

# Wytrenowanie losowego lasu za pomocą najważniejszych cech.
model = randomforest.fit(features_important, target)





14.9. Obsługa niezrównoważonych klas

# Wczytanie bibliotek.
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Zdefiniowanie klasy jako wysoce niezrównoważonej przez usunięcie pierwszych 40 obserwacji.
features = features[40:,:]
target = target[40:]

# Utworzenie wektora docelowego wskazującego, czy klasa obserwacji to 0. W przeciwnym przypadku będzie to klasa 1.
target = np.where((target == 0), 0, 1)

# Utworzenie obiektu klasyfikatora losowego lasu.
randomforest = RandomForestClassifier(
    random_state=0, n_jobs=-1, class_weight="balanced")

# Wytrenowanie modelu.
model = randomforest.fit(features, target)





# Obliczenie wagi dla mniejszej klasy.
110/(2*10)

5.5





# Obliczenie wagi dla większej klasy.
110/(2*100)

0.55





14.10. Kontrolowanie wielkości drzewa

# Wczytanie bibliotek.
from sklearn.tree import DecisionTreeClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora drzewa decyzyjnego.
decisiontree = DecisionTreeClassifier(random_state=0,
                                      max_depth=None,
                                      min_samples_split=2,
                                      min_samples_leaf=1,
                                      min_weight_fraction_leaf=0,
                                      max_leaf_nodes=None,
                                      min_impurity_decrease=0)

# Wytrenowanie modelu.
model = decisiontree.fit(features, target)





14.11. Poprawa wydajności za pomocą wzmocnienia

# Wczytanie bibliotek.
from sklearn.ensemble import AdaBoostClassifier
from sklearn import datasets

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie obiektu klasyfikatora drzewa AdaBoostClassifier.
adaboost = AdaBoostClassifier(random_state=0)

# Wytrenowanie modelu.
model = adaboost.fit(features, target)





14.12. Wytrenowanie modelu XGBoost

# Wczytanie bibliotek.
import xgboost as xgb
from sklearn import datasets, preprocessing
from sklearn.metrics import classification_report
from numpy import argmax

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie zbioru danych.
xgb_train = xgb.DMatrix(features, label=target)

# Zdefiniowanie parametrów.
param = {
    'objective': 'multi:softprob',
    'num_class': 3
}

# Wytrenowanie modelu.
gbm = xgb.train(param, xgb_train)

# Pobranie prognoz.
predictions = argmax(gbm.predict(xgb_train), axis=1)

# Pobranie raportu klasyfikacji.
print(classification_report(target, predictions))

              precision    recall  f1-score   support

           0       1.00      1.00      1.00        50
           1       1.00      0.96      0.98        50
           2       0.96      1.00      0.98        50

    accuracy                           0.99       150
   macro avg       0.99      0.99      0.99       150
weighted avg       0.99      0.99      0.99       150





14.13. Poprawienie wydajności w czasie rzeczywistym za pomocą LightGBM

# Wczytanie bibliotek.
import lightgbm as lgb
from sklearn import datasets, preprocessing
from sklearn.metrics import classification_report
from numpy import argmax

# Wczytanie danych.
iris = datasets.load_iris()
features = iris.data
target = iris.target

# Utworzenie zbioru danych.
lgb_train = lgb.Dataset(features, target)

# Zdefiniowanie parametrów.
params = {
    'objective': 'multiclass',
    'num_class': 3,
    'verbose': -1,
}

# Wytrenowanie modelu.
gbm = lgb.train(params, lgb_train)

# Pobranie prognoz.
predictions = argmax(gbm.predict(features), axis=1)

# Pobranie raportu klasyfikacji.
print(classification_report(target, predictions))

              precision    recall  f1-score   support
           0       1.00      1.00      1.00        50
           1       1.00      1.00      1.00        50
           2       1.00      1.00      1.00        50

    accuracy                           1.00       150
   macro avg       1.00      1.00      1.00       150
weighted avg       1.00      1.00      1.00       150
