Классификатор случайного леса — это то, что известно как алгоритм ансамбля. Причина этого в том, что он одновременно использует несколько экземпляров другого алгоритма для поиска результата. Помните, что деревья решений склонны к переобучению. Однако вы можете решить эту проблему, просто посадив больше деревьев!
Идея случайного леса — это автоматизированная обработка создания большего количества деревьев решений. Каждое дерево получает голосование с точки зрения того, как классифицировать. Некоторые из этих голосов будут сильно завышены и неточны. Однако при создании сотни деревьев классификация, возвращаемая большинством деревьев, скорее всего, будет наиболее точной.
Модели машинного обучения имеют некоторые ограничения:
Они не могут работать с отсутствующими данными, и
Они не могут работать с категориальными строковыми данными.
Изучив информацию, возвращаемую методом .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