Wednesday, April 13, 2022

Introduction to Random Forests in Scikit-Learn (sklearn)

Классификатор случайного леса — это то, что известно как алгоритм ансамбля. Причина этого в том, что он одновременно использует несколько экземпляров другого алгоритма для поиска результата. Помните, что деревья решений склонны к переобучению. Однако вы можете решить эту проблему, просто посадив больше деревьев!

Идея случайного леса — это автоматизированная обработка создания большего количества деревьев решений. Каждое дерево получает голосование с точки зрения того, как классифицировать. Некоторые из этих голосов будут сильно завышены и неточны. Однако при создании сотни деревьев классификация, возвращаемая большинством деревьев, скорее всего, будет наиболее точной. 

Модели машинного обучения имеют некоторые ограничения:

Они не могут работать с отсутствующими данными, и

Они не могут работать с категориальными строковыми данными.











Изучив информацию, возвращаемую методом .info(), вы увидите, что обе эти проблемы существуют в наборе данных. Чтобы иметь возможность использовать этот набор данных для классификации, вам сначала нужно найти способы работы с отсутствующими и категоричными данными. Это именно то, что вы узнаете в следующих двух разделах руководства.

==================================

Мы внедрим класс SimpleImputer из sklearn.impute и numpy.

Мы создалим экземпляр объекта SimpleImputer, ища отсутствующие значения, представленные np.NaN, и попросим Scikit-Learn использовать «среднее» в качестве своей стратегии. Это означает, что любые значения np.NaN будут вменены средним значением столбцов.Затем мы используем метод .fit() и передаем столбец. Наконец, мы используем метод .transform() для передачи вмененных значений в соответствующие столбцы.

====================

(.env) [boris@fedora35server DATARF]$ cat missDataRF1.py

# Loading the Penguins Dataset from Seaborn

import seaborn as sns

import pandas as pd

from sklearn.impute import SimpleImputer

import numpy as np


df = sns.load_dataset('penguins')

print(df.head())

print("Seeing missing data")

print("=========================")

print(df.isnull().sum())


# Create a SimpleImputer Class

imputer = SimpleImputer(missing_values=np.NaN, strategy='mean')


# Fit the columns to the object

columns = ['bill_depth_mm', 'bill_length_mm', 'flipper_length_mm', 'body_mass_g']

imputer=imputer.fit(df[columns])


# Transform the DataFrames column with the fitted data

df[columns]=imputer.transform(df[columns])

print(df.head())

print("Seeing missing data again")

print("=========================")

print(df.isnull().sum())

(.env) [boris@fedora35server DATARF]$ python missDataRF1.py

  species     island  bill_length_mm  ...  flipper_length_mm  body_mass_g     sex

0  Adelie  Torgersen            39.1  ...              181.0       3750.0    Male

1  Adelie  Torgersen            39.5  ...              186.0       3800.0  Female

2  Adelie  Torgersen            40.3  ...              195.0       3250.0  Female

3  Adelie  Torgersen             NaN  ...                NaN          NaN     NaN

4  Adelie  Torgersen            36.7  ...              193.0       3450.0  Female


[5 rows x 7 columns]

Seeing missing data

=========================

species               0

island                0

bill_length_mm        2

bill_depth_mm         2

flipper_length_mm     2

body_mass_g           2

sex                  11

dtype: int64

  species     island  bill_length_mm  ...  flipper_length_mm  body_mass_g     sex

0  Adelie  Torgersen        39.10000  ...         181.000000  3750.000000    Male

1  Adelie  Torgersen        39.50000  ...         186.000000  3800.000000  Female

2  Adelie  Torgersen        40.30000  ...         195.000000  3250.000000  Female

3  Adelie  Torgersen        43.92193  ...         200.915205  4201.754386     NaN

4  Adelie  Torgersen        36.70000  ...         193.000000  3450.000000  Female


[5 rows x 7 columns]

Seeing missing data again

=========================

species               0

island                0

bill_length_mm        0

bill_depth_mm         0

flipper_length_mm     0

body_mass_g           0

sex                  11

dtype: int64















Полная версия кода

(.env) [boris@fedora35server DATARF]$ cat missDataRF.py

# Loading the Penguins Dataset from Seaborn

import seaborn as sns

import pandas as pd

from sklearn.impute import SimpleImputer

import numpy as np

from sklearn.model_selection import train_test_split

from sklearn.ensemble import RandomForestClassifier

import matplotlib.pyplot as plt

from sklearn.tree import plot_tree

from sklearn.preprocessing import OneHotEncoder


df = sns.load_dataset('penguins')

print(df.head())

print("Seeing missing data")

print("=========================")

print(df.isnull().sum())


# Create a SimpleImputer Class

imputer = SimpleImputer(missing_values=np.NaN, strategy='mean')


# Fit the columns to the object

columns = ['bill_depth_mm', 'bill_length_mm', 'flipper_length_mm', 'body_mass_g']

imputer=imputer.fit(df[columns])


# Transform the DataFrames column with the fitted data

df[columns]=imputer.transform(df[columns])

print(df.head())

print("Seeing missing data again")

print("=========================")

print(df.isnull().sum())


#  Dropping missing records in the sex column

df = df.dropna(subset=['sex'])

print(df.isnull().sum())


df['sex int'] = df['sex'].map({'Male': 0, 'Female': 1})

print(df['island'].unique())


# One-hot Encoding the Island Feature

one_hot = OneHotEncoder()

encoded = one_hot.fit_transform(df[['island']])

df[one_hot.categories_[0]] = encoded.toarray()

# Drop unneeded columns

df = df.drop(columns=['island', 'sex'])


# Splitting the data and creating a model

X = df.iloc[:, 1:]

y = df['species']

X_train, X_test, y_train, y_test = train_test_split(X, y, stratify=y, test_size=0.3, random_state=100)

forest = RandomForestClassifier(n_estimators=100, random_state=100)

forest.fit(X_train,y_train)

predictions = forest.predict(X_test)

# Another import

from sklearn import metrics

print("Accuracy:",metrics.accuracy_score(y_test, predictions))

# Plotting results

fig = plt.figure(figsize=(15, 10))

plot_tree(forest.estimators_[0],

          feature_names=X.columns,

          class_names=df['species'].unique(),

          filled=True, rounded=True)

plt.show()





























Reference

No comments:

Post a Comment