Programování v Pythonu: Zpřístupnění strojového učení pomocí algoritmu náhodných lesů

Autor: John Paul Mueller, Luca Massaron

Random Forest je algoritmus klasifikace a regrese vyvinutý Leem Breimanem a Adele Cutlerovou, který používá velké množství modelů rozhodovacích stromů k poskytnutí přesných předpovědí snížením zkreslení i rozptylu odhadů. Když agregujete mnoho modelů dohromady a vytvoříte jednu předpověď, výsledek je soubor modelů. Random Forest není jen model souboru, je to také jednoduchý a efektivní algoritmus, který lze použít jako hotový algoritmus. Zpřístupňuje strojové učení neexistujícím odborníkům. Algoritmus Random Forest používá k provedení svých předpovědí tyto kroky:



jaké léky způsobují váčky pod očima
  1. Vytvořte velké množství rozhodovacích stromů, z nichž každý se liší od ostatních, na základě různých podmnožin pozorování a proměnných.
  2. Bootstrap datovou sadu pozorování pro každý strom (vzorkováno z původních dat s náhradou). Stejné pozorování se může ve stejné datové sadě objevit několikrát.
  3. Náhodně vyberte a použijte pouze část proměnných pro každý strom.
  4. Odhadněte výkon pro každý strom pomocí pozorování vyloučených vzorkováním (Out Of Bag nebo OOB, odhad).
  5. Získejte konečnou predikci, která je průměrem pro regresní odhady nebo nejčastější třídou pro predikci, poté, co byly všechny stromy přizpůsobeny a použity pro predikci.

Pomocí těchto kroků můžete snížit zkreslení, protože rozhodovací stromy dobře zapadají do dat a tím, že se spoléhají na složité rozdělení, mohou aproximovat i ty nejsložitější vztahy mezi prediktory a předpovězeným výsledkem. Rozhodovací stromy mohou vytvářet velkou rozptyl odhadů, ale tuto odchylku snížíte průměrováním mnoha stromů. Hlučné předpovědi mají kvůli rozptylu tendenci distribuovat rovnoměrně nad a pod správnou hodnotu, kterou chcete předpovědět - a při průměrování dohromady mají tendenci se navzájem rušit, což ve výsledku vede ke správnější průměrné předpovědi.

Leo Breiman odvodil myšlenku Random Forest od techniky pytlování. Scikit-learn má pytlovací třídu pro regresi (BaggingRegressor) a klasifikaci (BaggingClassifier), kterou můžete použít s jakýmkoli jiným prediktorem, který si raději vyberete z modulů Scikit-learn. The max_samples a max_features Parametry vám umožňují rozhodnout o poměru případů a proměnných k vzorkování (nikoli bootstrapovaných, ale vzorkovaných, takže případ můžete použít pouze jednou) pro sestavení každého modelu souboru. The n_estimators Parametr určuje celkový počet modelů v souboru. Zde je příklad, který načte ručně psanou číslici datové sady (používá se pro demonstrace později s jinými algoritmy souboru) a poté se hodí do modelu pomocí pytlů:

max_features

Zde je křížově ověřená přesnost baggingu aplikovaného na ručně psanou datovou sadu:



min_samples_leaf

V pytlování, stejně jako v Random Forest, platí, že čím více modelů v souboru, tím lépe. Hrozí vám malé riziko nadměrného vybavení, protože každý model se liší od ostatních a chyby mají tendenci se šířit kolem skutečné hodnoty. Přidání dalších modelů pouze zvyšuje stabilitu výsledku.

Další charakteristikou algoritmu je, že umožňuje odhad proměnné důležitosti při zohlednění přítomnosti všech ostatních prediktorů. Tímto způsobem můžete určit, která funkce je důležitá pro předpovídání cíle vzhledem k sadě funkcí, které máte; také můžete použít odhad důležitosti jako vodítko pro výběr proměnné.

Na rozdíl od jednotlivých rozhodovacích stromů nemůžete Random Forest snadno vizualizovat nebo porozumět, takže funguje jako černá skříňka (černá skříňka je transformace, která neodhaluje její vnitřní fungování; vše, co vidíte, jsou její vstupy a výstupy) . Vzhledem k jeho neprůhlednosti je odhad důležitosti jediným způsobem, jak pochopit, jak algoritmus funguje s ohledem na funkce.



Odhad důležitosti v náhodném lese je získán přímým způsobem. Po sestavení každého stromu kód postupně naplní každou proměnnou nevyžádanými daty a příklad zaznamená, o kolik se prediktivní síla sníží. Pokud je proměnná důležitá, její přeplnění příležitostnými daty poškodí předpověď; jinak jsou předpovědi téměř nezměněny a proměnná je považována za nedůležitou.

Práce s klasifikátorem Random Forest

Příklad klasifikátoru Random Forest stále používá dříve načtenou datovou sadu číslic:

max_features

Křížově ověřená přesnost hlášená tímto kódem pro Random Forest je vylepšení oproti metodě pytlování:

auto

Pouhé nastavení počtu odhadů je dostatečné pro většinu problémů, se kterými se setkáte, a správné nastavení je otázkou použití nejvyššího možného počtu vzhledem k časovým a zdrojovým omezením hostitelského počítače. Můžete to prokázat výpočtem a nakreslením ověřovací křivky pro algoritmus.

epinefrin vs. norepinefrin
sqrt

Obrázek níže ukazuje výsledky poskytnuté předchozím kódem. Čím více odhadů, tím lepší výsledky. V určitém okamžiku se však zisk stává skutečně minimálním.

Náhodná datová věda Forest Python

Ověření dopadu počtu odhadů na Random Forest.

Práce s regresorem Random Forest

RandomForestRegressor funguje podobným způsobem jako Random Forest pro klasifikaci a používá přesně stejné parametry:

log2

Zde je výsledná křížově validovaná střední kvadratická chyba:

min_samples_leaf

Náhodný les používá rozhodovací stromy. Rozhodovací stromy https://www.dummies.com/programming/big-data/data-science/how-to-create-classification-and-regression-trees-in-python-for-data-science/ segmentovat datovou sadu do malé oddíly, nazývané listy, při odhadu regresních hodnot. Random Forest vytvoří průměr hodnot z každého listu k vytvoření predikce. Použití tohoto postupu způsobí, že extrémní a vysoké hodnoty zmizí z předpovědí z důvodu průměrování použitého pro každý list lesa, což produkuje dumpingové hodnoty namísto mnohem vyšších nebo mnohem nižších hodnot.

Optimalizace náhodného lesa

Modely Random Forest jsou hotové algoritmy, které mohou fungovat docela dobře bez optimalizace nebo obav z přeplnění. (Čím více odhadů použijete, tím lepší bude výstup, v závislosti na vašich zdrojích.) Výkon můžete vždy zlepšit odstraněním nadbytečných a méně informativních proměnných, opravením minimální velikosti listu a definováním počtu vzorků, které zabrání tomu, aby v vzorek. Následující příklad ukazuje, jak provádět tyto úkoly:

from sklearn.datasets import load_digits digit = load_digits() X, y = digit.data, digit.target from sklearn.ensemble import BaggingClassifier from sklearn.tree import DecisionTreeClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold tree_classifier = DecisionTreeClassifier(random_state=0) crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) bagging = BaggingClassifier(tree_classifier, max_samples=0.7, max_features=0.7, n_estimators=300) scores = np.mean(cross_val_score(bagging, X, y, scoring='accuracy', cv=crossvalidation)) print ('Accuracy: %.3f' % scores)

Pomocí ručně psané číslice datové sady a prvního výchozího klasifikátoru můžete optimalizovat obojí

Accuracy: 0.967
a
X, y = digit.data, digit.target from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) RF_cls = RandomForestClassifier(n_estimators=300, random_state=1) score = np.mean(cross_val_score(RF_cls, X, y, scoring='accuracy', cv=crossvalidation)) print('Accuracy: %.3f' % score)
. Při optimalizaci
Accuracy: 0.977
používáte předem nakonfigurované možnosti (
from sklearn.model_selection import validation_curve param_range = [10, 50, 100, 200, 300, 500, 800, 1000, 1500] crossvalidation = KFold(n_splits=3, shuffle=True, random_state=1) RF_cls = RandomForestClassifier(n_estimators=300, random_state=0) train_scores, test_scores = validation_curve(RF_cls, X, y, 'n_estimators', param_range=param_range, cv=crossvalidation, scoring='accuracy') mean_test_scores = np.mean(test_scores, axis=1) import matplotlib.pyplot as plt plt.plot(param_range, mean_test_scores, 'bD-.', label='CV score') plt.grid() plt.xlabel('Number of estimators') plt.ylabel('accuracy') plt.legend(loc='lower right', numpoints= 1) plt.show()
pro všechny funkce,
X, y = boston.data, boston.target from sklearn.ensemble import RandomForestRegressor from sklearn.model_selection import cross_val_score from sklearn.model_selection import KFold RF_rg = RandomForestRegressor (n_estimators=300, random_state=1) crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) score = np.mean(cross_val_score(RF_rg, X, y, scoring='neg_mean_squared_error', cv=crossvalidation)) print('Mean squared error: %.3f' % abs(score))
nebo
Mean squared error: 12.028
funkce použité pro počet funkcí) a integrujete je pomocí malých čísel funkcí a hodnota 1/3 funkcí. Výběr správného počtu funkcí ke vzorkování má tendenci snižovat počet případů, kdy jsou korelované a podobné proměnné vybrány společně, čímž se zvyšuje prediktivní výkonnost.

Existuje statistický důvod k optimalizaci

from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import KFold X, y = digit.data, digit.target crossvalidation = KFold(n_splits=5, shuffle=True, random_state=1) RF_cls = RandomForestClassifier(random_state=1) scorer = 'accuracy'
. Použití listů s několika případy často odpovídá přetížení velmi specifických kombinací dat. Abyste dosáhli minimální statistické jistoty, že datové vzorce odpovídají skutečným a obecným pravidlům, musíte mít alespoň 30 pozorování:

from sklearn.model_selection import GridSearchCV max_features = [X.shape[1]//3, 'sqrt', 'log2', 'auto'] min_samples_leaf = [1, 10, 30] n_estimators = [50, 100, 300] search_grid = {'n_estimators':n_estimators, 'max_features': max_features, 'min_samples_leaf': min_samples_leaf} search_func = GridSearchCV(estimator=RF_cls, param_grid=search_grid, scoring=scorer, cv=crossvalidation) search_func.fit(X, y) best_params = search_func.best_params_ best_score = search_func.best_score_ print('Best parameters: %s' % best_params) print('Best accuracy: %.3f' % best_score)

Poté se nahlásí nejlepší parametry a nejlepší přesnost, přičemž se zdůrazňuje, že parametry, na které je třeba reagovat, je počet stromů:

Best parameters: {'max_features': 'sqrt', 'min_samples_leaf': 1, 'n_estimators': 100} Best accuracy: 0.978