Atsitiktinių miškų klasifikatoriaus pamoka: kaip naudoti medžio algoritmus mokantis mašinoje

Medžių algoritmai yra populiarūs mašininio mokymosi metodai, naudojami prižiūrimų mokymosi problemų sprendimui. Šie algoritmai yra lankstūs ir gali išspręsti bet kokias iškilusias problemas (klasifikaciją ar regresiją).

Medžių algoritmai, nenumatydami mokymo pavyzdžių regionuose, kuriems jie priklauso, paprastai naudoja tęstinių funkcijų vidurkį arba kategorinių požymių režimą . Jie taip pat pateikia prognozes labai tiksliai , stabiliai ir lengvai interpretuojamos .

Medžių algoritmų pavyzdžiai

Yra įvairių medžių algoritmų, kuriuos galite naudoti, pvz

  • Sprendimų medžiai
  • Atsitiktinis miškas
  • Gradiento stiprinimas
  • Maišavimas („Bootstrap Aggregation“)

Taigi kiekvienas duomenų mokslininkas turėtų išmokti šiuos algoritmus ir naudoti juos mašininio mokymosi projektuose.

Šiame straipsnyje sužinosite daugiau apie „Random forest“ algoritmą. Baigę šį straipsnį, turėtumėte mokėti naudoti atsitiktinį miško algoritmą, kad išspręstumėte ir sudarytumėte nuspėjamuosius modelius, susijusius su „scikit-learn“ klasifikavimo problemomis.

Kas yra atsitiktinis miškas?

Atsitiktinis miškas yra vienas iš populiariausių medžių prižiūrimų mokymosi algoritmų. Tai taip pat yra lankstiausia ir patogiausia naudoti.

Algoritmas gali būti naudojamas klasifikavimo ir regresijos problemoms spręsti. Atsitiktinis miškas linkęs sujungti šimtussprendimų medžiaiir tada moko kiekvieną sprendimo medį pagal skirtingą stebėjimų imtį.

Galutinės atsitiktinio miško prognozės padaromos vidutiniškai įvertinant kiekvieno atskiro medžio prognozes.

Atsitiktinių miškų nauda yra daug. Atskiro sprendimo medžiai linkę overfit į mokymo duomenis, bet atsitiktinai miške gali sušvelninti tą problemą vidutiniškai numatymą rezultatus iš skirtingų medžių. Tai suteikia atsitiktiniams miškams didesnį prognozavimo tikslumą nei vienas sprendimų medis.

Atsitiktinis miško algoritmas taip pat gali padėti rasti svarbių duomenų rinkinyje ypatybių . Jis yra Borutos algoritmo, kuris parenka svarbias duomenų rinkinio ypatybes, pagrinde.

Atsitiktinis miškas buvo naudojamas įvairiose programose, pavyzdžiui, teikiant įvairių produktų rekomendacijas klientams el. Prekyboje.

Medicinoje paciento ligai nustatyti gali būti naudojamas atsitiktinis miško algoritmas, analizuojant paciento ligos istoriją.

Bankų sektoriuje taip pat galima lengvai nustatyti, ar klientas yra apgaulingas, ar teisėtas.

Kaip veikia „Random Forest“ algoritmas?

Atsitiktinis miško algoritmas veikia atlikdamas šiuos veiksmus:

1 veiksmas : algoritmas iš pateikto duomenų rinkinio parenka atsitiktinius pavyzdžius.

2 žingsnis: Algoritmas sukurs kiekvieno pasirinkto pavyzdžio sprendimų medį. Tada jis gaus prognozavimo rezultatą iš kiekvieno sukurto sprendimo medžio.

3 žingsnis: Tada bus atliktas kiekvieno numatyto rezultato vertinimas. Klasifikavimo problemai jis naudos režimą , o regresijos problemai - vidurkį .

4 žingsnis : Ir pagaliau algoritmas kaip galutinį prognozavimą parinks labiausiai balsavusį prognozavimo rezultatą.

Atsitiktinis miškas praktikoje

Dabar, kai žinote atsitiktinio miško algoritmo smulkmenas, sukurkime atsitiktinių miškų klasifikatorių.

Mes sukursime atsitiktinį miškų klasifikatorių, naudodami „Pima Indians Diabetes“ duomenų rinkinį. Pima indėnų diabeto duomenų rinkinyje numatyta numatyti diabeto atsiradimą per 5 metus, remiantis pateikiama medicinine informacija. Tai dvejetainės klasifikacijos problema.

Mūsų užduotis yra išanalizuoti ir sukurti „Pima Indian Diabetes“ duomenų rinkinio modelį, siekiant numatyti, ar konkrečiam pacientui yra rizika susirgti diabetu, atsižvelgiant į kitus nepriklausomus veiksnius.

Pirmiausia importuosime svarbius paketus, kuriuos naudosime įkeliant duomenų rinkinį ir sukursime atsitiktinį miško klasifikatorių. Mes naudosime „scikit-learn“ biblioteką norėdami įkelti ir naudoti atsitiktinį miško algoritmą.

# import important packages import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns %matplotlib inline from sklearn.model_selection import train_test_split from sklearn.ensemble import RandomForestClassifier from sklearn.metrics import accuracy_score from sklearn.preprocessing import StandardScaler, MinMaxScaler import pandas_profiling from matplotlib import rcParams import warnings warnings.filterwarnings("ignore") # figure size in inches rcParams["figure.figsize"] = 10, 6 np.random.seed(42)

Duomenų rinkinys

Tada įkelkite duomenų rinkinį iš duomenų katalogo:

# Load dataset data = pd.read_csv("../data/pima_indians_diabetes.csv")

Dabar galime stebėti duomenų rinkinio pavyzdį.

 # show sample of the dataset data.sample(5)

Kaip matote, mūsų duomenų rinkinyje turime skirtingų funkcijų su skaitinėmis reikšmėmis.

Supraskime funkcijų, kurias turime šiame duomenų rinkinyje, sąrašą.

# show columns data.columns

Šiame duomenų rinkinyje yra 8 įvesties ypatybės ir 1 išvesties / tikslinės funkcijos. Manoma, kad trūkstamos vertės yra užkoduotos nulinėmis reikšmėmis. Kintamųjų pavadinimų reikšmė yra tokia (nuo pirmo iki paskutinio požymio):

  • Nėštumo kartų skaičius.
  • Gliukozės koncentracija plazmoje per 2 valandas atliekant geriamojo gliukozės tolerancijos testą.
  • Diastolinis kraujospūdis (mm Hg).
  • Tricepso odos raukšlės storis (mm).
  • 2 valandų insulino serumas (mu U / ml).
  • Kūno masės indeksas (svoris kg / (aukštis m) ^ 2).
  • Cukrinio diabeto kilmės funkcija.
  • Amžius (metai).
  • Klasės kintamasis (0 arba 1).

Tada duomenų rinkinį suskirstėme į nepriklausomas ir tikslines savybes. Mūsų tikslinė šio duomenų rinkinio funkcija vadinama klase.

# split data into input and taget variable(s) X = data.drop("class", axis=1) y = data["class"]

Išankstinis duomenų rinkinio apdorojimas

Before we create a model we need to standardize our independent features by using the standardScaler method from scikit-learn.

# standardize the dataset scaler = StandardScaler() X_scaled = scaler.fit_transform(X)

You can learn more on how and why to standardize your data from this article by clicking here.

Splitting the dataset into Training and Test data

We now split our processed dataset into training and test data. The test data will be 10% of the entire processed dataset.

# split into train and test set X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, stratify=y, test_size=0.10, random_state=42 )

Building the Random Forest Classifier

Now is time to create our random forest classifier and then train it on the train set. We will also pass the number of trees (100) in the forest we want to use through theparameter called n_estimators.

# create the classifier classifier = RandomForestClassifier(n_estimators=100) # Train the model using the training sets classifier.fit(X_train, y_train)

The above output shows different parameter values of the random forest classifier used during the training process on the train data.

After training we can perform prediction on the test data.

# predictin on the test set y_pred = classifier.predict(X_test)

Then we check the accuracy using actual and predicted values from the test data.

# Calculate Model Accuracy print("Accuracy:", accuracy_score(y_test, y_pred))

Accuracy: 0.8051948051948052

Our accuracy is around 80.5% which is good. But we can always make it better.

Identify Important Features

As I said before, we can also check the important features by using the feature_importances_ variable from the random forest algorithm in scikit-learn.

# check Important features feature_importances_df = pd.DataFrame( {"feature": list(X.columns), "importance": classifier.feature_importances_} ).sort_values("importance", ascending=False) # Display feature_importances_df

The figure above shows the relative importance of features and their contribution to the model. We can also visualize these features and their  scores using the seaborn and matplotlib libraries.

# visualize important featuers # Creating a bar plot sns.barplot(x=feature_importances_df.feature, y=feature_importances_df.importance) # Add labels to your plt.xlabel("Feature Importance Score") plt.ylabel("Features") plt.title("Visualizing Important Features") plt.xticks( rotation=45, horizontalalignment="right", fontweight="light", fontsize="x-large" ) plt.show()

From the figure above, you can see the triceps_skinfold_thickness feature has low importance and does not contribute much to the prediction.

This means that we can remove this feature and train our random forest classifier again and then see if it can improve its performance on the test data.

# load data with selected features X = data.drop(["class", "triceps_skinfold_thickness"], axis=1) y = data["class"] # standardize the dataset scaler = StandardScaler() X_scaled = scaler.fit_transform(X) # split into train and test set X_train, X_test, y_train, y_test = train_test_split( X_scaled, y, stratify=y, test_size=0.10, random_state=42 )

We will train the random forest algorithm with the selected processed features from our dataset, perform predictions, and then find the accuracy of the model.

# Create a Random Classifier clf = RandomForestClassifier(n_estimators=100) # Train the model using the training sets clf.fit(X_train, y_train) # prediction on test set y_pred = clf.predict(X_test) # Calculate Model Accuracy, print("Accuracy:", accuracy_score(y_test, y_pred))

Accuracy: 0.8181818181818182

Now the model accuracy has increased from 80.5% to 81.8% after we removed the least important feature called triceps_skinfold_thickness.

This suggests that it is very important to check important features and see if you can remove the least important features to increase your model's performance.

Wrapping up

Medžių algoritmai yra tikrai svarbūs mokytis kiekvienam duomenų mokslininkui. Šiame straipsnyje jūs sužinojote medžių algoritmų pagrindus ir tai, kaip sukurti klasifikavimo modelį naudojant atsitiktinį miško algoritmą.

Taip pat rekomenduoju išbandyti kitų tipų medžių algoritmus, pavyzdžiui, „Extra-trees“ algoritmą.

Šiame straipsnyje naudojamą duomenų rinkinį ir užrašinę galite atsisiųsti iš čia: //github.com/Davisy/Random-Forest-classification-Tutorial

Sveikiname, jūs pasiekėte šio straipsnio pabaigą!

Jei sužinojote ką nors naujo ar patiko skaityti šį straipsnį, pasidalykite juo, kad kiti galėtų jį pamatyti. Iki tol susitiksime kitame įraše! Mane taip pat galima pasiekti „Twitter“ @Davis_McDavid