Анализ и классификация наборов данных грибов в питоне

Введение

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

В этом проекте я использовал следующие классификаторы, чтобы сделать прогноз:

  1. Логистическая регрессия
  2. KNN Логистическая регрессия,
  3. СВМ,
  4. Наивный Байес
  5. Древо решений,
  6. Случайный лесной классификатор

Если вы хотите увидеть оригинальную записную книжку в Kaggle, посетите kaggle-milindsoorya.

Набор данных

Набор данных, используемый в этом проекте, содержит 8124 экземпляра грибов с 23 признаками, такими как форма шляпки, поверхность шляпки, цвет шляпки, синяки, запах и т. д.

вы можете загрузить набор данных с kaggle, если хотите следить за ним локально — mushroom-dataset

Библиотеки и пакеты Python, которые мы будем использовать в этом проекте, а именно:

  • NumPy
  • Панды
  • Сиборн
  • Матплотлиб
  • Графвиз
  • Scikit-learn

Загрузка набора данных

Если вы используете kaggle, то загрузка данных выполняется за вас, вам просто нужно запустить первую ячейку. Если вы обнаружите, что это сбивает с толку, вы можете обратиться к приведенному ниже фрагменту кода.

🎐 В случае kaggle

import os
import pandas as pd # data processing, CSV file I/O (e.g. pd.read_csv)
for dirname, _, filenames in os.walk('/kaggle/input'):
    for filename in filenames:
        print(os.path.join(dirname, filename))
df = pd.read_csv('/kaggle/input/mushroom-classification/mushrooms.csv')
df.head()

🎐 В случае с Google Colab

Если вы используете Google Colab, вы можете либо использовать Google Drive для загрузки данных, либо загрузить данные со своего компьютера, вам просто нужно загрузить набор данных с kaggle, и когда вы запустите код, вы можете загрузить его в colab. Я нахожу последний метод проще, и вы можете сделать это, как показано ниже.

import pandas as pd
from google.colab import files
uploaded = files.upload()
df =  pd.read_csv("./mushrooms.csv")

Функция Pandas read_csv() импортирует файл CSV (в нашем случае «mushrooms.csv») в формат DataFrame.

Импортируйте модули

import pandas as pd
import numpy as np
import os 
import matplotlib.pyplot as plt
import seaborn as sns

Изучение данных

🎈 — Чтобы получить обзор набора данных, мы можем использовать метод .describe().

df.describe()

Метод .describe() даст вам статистику столбцов.

  • count показывает количество ответов.
  • unique показывает количество уникальных категориальных значений.
  • top показывает наиболее часто встречающееся категориальное значение.
  • freq показывает частоту/количество наиболее часто встречающихся категориальных значений.

Вот часть вывода:

🎈 — Чтобы получить имена столбцов, количество значений, типы данных и т. д., мы можем использовать метод info().

# display basic info about data type
df.info()

🎈 — Используя метод value_counts(), мы видим, что набор данных сбалансирован.

# display number of samples on each class
df['class'].value_counts()

// Output
e    4208
p    3916
Name: class, dtype: int64

🎈 — Также убедимся, что нет нулевых значений

# check for null values
df.isnull().sum()

Манипуляция данными

Данные являются категориальными, поэтому мы будем использовать LabelEncoder для преобразования их в порядковые. LabelEncoder преобразует каждое значение в столбце в число.

Этот подход требует, чтобы столбец категории имел тип данных «категория». По умолчанию нечисловой столбец имеет тип данных «объект». Из метода df.info() мы увидели, что наши столбцы имеют тип данных «объект». Поэтому нам придется изменить тип на «категорию», прежде чем использовать этот подход.

df = df.astype('category')
df.dtypes

Теперь, когда мы преобразовали столбцы в тип категории, мы можем использовать LabelEncoder, чтобы преобразовать столбцы в формат, понятный машине.

# Using LabelEncoder to convert catergory values to ordinal
from sklearn.preprocessing import LabelEncoder
labelencoder=LabelEncoder()
for column in df.columns:
    df[column] = labelencoder.fit_transform(df[column])

df.head()

из приведенного выше рисунка видно, что veil-type имеет только одно уникальное значение и, следовательно, ничего не добавляет к данным. Так что смело можем удалить.

df = df.drop(["veil-type"],axis=1)

здесь axis-1 означает, что мы удаляем весь столбец (т.е. по вертикали), если бы это было axis-0, мы бы удаляли всю строку (т.е. по горизонтали).

Подготовка данных

Мы можем использовать метод scikit-learn train_test_split для создания данных обучения и тестирования.

from sklearn.model_selection import train_test_split
# "class" column as numpy array.
y = df["class"].values
# All data except "class" column.
x = df.drop(["class"], axis=1).values
# Split data for train and test.
x_train, x_test, y_train, y_test = train_test_split(x,y,random_state=42,test_size=0.2)

Методы классификации

1. Классификация логистической регрессии

from sklearn.linear_model import LogisticRegression

## lr = LogisticRegression(solver="lbfgs")
lr = LogisticRegression(solver="liblinear")
lr.fit(x_train,y_train)

print("Test Accuracy: {}%".format(round(lr.score(x_test,y_test)*100,2)))

// Output

Test Accuracy: 94.65%

2. Классификация КНН

from sklearn.neighbors import KNeighborsClassifier

best_Kvalue = 0
best_score = 0

for i in range(1,10):
    knn = KNeighborsClassifier(n_neighbors=i)
    knn.fit(x_train,y_train)
    if knn.score(x_test,y_test) > best_score:
        best_score = knn.score(x_train,y_train)
        best_Kvalue = i

print("""Best KNN Value: {}
Test Accuracy: {}%""".format(best_Kvalue, round(best_score*100,2)))

// Output
Test Accuracy: 94.65%

3. Классификация SVM

from sklearn.svm import SVC
svm = SVC(random_state=42, gamma="auto")
svm.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(svm.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 100.0%

4. Наивная байесовская классификация

from sklearn.naive_bayes import GaussianNB
nb = GaussianNB()
nb.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(nb.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 92.18%

5. Классификация дерева решений

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier()
dt.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(dt.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 100.0%

6. Классификация случайного леса

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, random_state=42)
rf.fit(x_train,y_train)
print("Test Accuracy: {}%".format(round(rf.score(x_test,y_test)*100,2)))
// Output
Test Accuracy: 100.0%

Проверка результатов классификации с помощью матрицы путаницы

В этом разделе я проверю результаты с помощью матрицы путаницы в логистической регрессии и классификации KNN.

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

Точность логистической регрессии составила 97,05%, а KNN — 100%.

from sklearn.metrics import confusion_matrix
# Linear Regression
y_pred_lr = lr.predict(x_test)
y_true_lr = y_test
cm = confusion_matrix(y_true_lr, y_pred_lr)
f, ax = plt.subplots(figsize =(5,5))
sns.heatmap(cm,annot = True,linewidths=0.5,linecolor="red",fmt = ".0f",ax=ax)
plt.xlabel("y_pred_lr")
plt.ylabel("y_true_lr")
plt.show()

# Random Forest
y_pred_rf = rf.predict(x_test)
y_true_rf = y_test
cm = confusion_matrix(y_true_rf, y_pred_rf)
f, ax = plt.subplots(figsize =(5,5))
sns.heatmap(cm,annot = True,linewidths=0.5,linecolor="red",fmt = ".0f",ax=ax)
plt.xlabel("y_pred_rf")
plt.ylabel("y_true_rf")
plt.show()

Вывод

Из матрицы путаницы мы увидели, что наши обучающие и тестовые данные сбалансированы.

Большинство методов классификации достигают 100% точности с этим набором данных.

🎃 Вам также может понравиться: -

🔎Ссылки

Присоединяйтесь к FAUN: Сайт💻|Подкаст🎙️|Twitter🐦|Facebook👥 |Instagram📷|Группа Facebook🗣️|Группа Linkedin💬| Slack 📱|Cloud Native Новости📰|Дополнительно.

Если этот пост был полезен, пожалуйста, несколько раз нажмите кнопку аплодисментов 👏 ниже, чтобы выразить свою поддержку автору 👇