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

Давайте посмотрим, какие особенности означают верную смерть, а какие наиболее приятны в этом наборе данных о характеристиках грибов. И насколько уверенной может быть наша модель? (Скрестив пальцы!)

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

Импортировать соответствующие библиотеки

import pandas as pd
import numpy as np
import seaborn as sns
from sklearn.linear_model import LogisticRegression
from sklearn.cluster import KMeans
from sklearn.preprocessing import LabelEncoder
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

Что ж, в нашем арсенале есть все стрелы, давайте использовать их с умом!

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

Мы будем использовать панды для загрузки данных

data= pd.read_csv('../input/mushrooms.csv')

Итак, хотите взглянуть на размер набора данных? , просто запустите следующую строку:

data.shape

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

EDA: этап исследовательского анализа данных!

После загрузки данных и перед обработкой их в нашей модели давайте сначала просто обработаем их заранее, поскольку мы не являемся экспертами в области охоты за грибами (также известной как «грибы»), и мы не можем сказать, какие атрибуты будут важными, а какие нет. мы фанаты данных, мы можем что-то придумать, верно?

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

#To see the value of veil-type
data['veil-type'].value_counts()
#To drop it's value 
data.drop(['veil-type'],axis = 1)

На данный момент и до моего предела в расчесывании (который технически равен нулю) этой предварительной обработки будет достаточно. Давайте просто разделим наши данные на независимые и зависимые переменные!

y = orig['class']
X = orig.drop(['class'] , axis  = 1)

Итак, мы так близки к обработке данных в двух наших моделях, но вы знаете, что нам еще предстоит сделать последний шаг, вот краткий обзор данных.

X.head()

После этого вы получите что-то вроде этого:

Что ж, мы не должны понимать, если мы не получим желаемый результат, о котором мы не узнаем, пока не попробуем, так что давайте просто продолжим, поэтому наша проблема в этом случае заключается в том, что только малыш может потреблять сырую пищу, так же, как наша модель ребенка может Чтобы не обрабатывать этот ввод, нам придется преобразовать эти категориальные данные в числовые, нам было бы очень сложно, если бы у нас не было LabelEncoder и метода Get_Dummy! (Человек, жизнь хороша!)

Согласно стандартной практике, если наши категориальные данные являются двоичными, например, есть только 2 варианта, мы можем использовать метод 0 и 1 или LabelEncoder. Однако, если существует более двух классификаций, лучше использовать метод get_dummies.

#For all those columns who has 2 attributes!
from sklearn import preprocessing
for cols in X.columns:
    if(len(X[cols].value_counts()) ==2):#Unique values
        le_anima = preprocessing.LabelEncoder()
        X[cols] = le_anima.fit_transform(X[cols])

И для более чем 2 вот код:

X = pd.get_dummies(X)

Пусть начинается самое интересное!

Мы все готовы обработать эти данные в нашей модели.

Как упоминалось ранее, мы будем сравнивать две модели, то есть логистическую регрессию и кластеризацию K-среднего. Как вы думаете, кто победит в этом испытании?

Как мы будем сравнивать эти две модели?

Поскольку логистическая регрессия - это контролируемая форма обучения, в то время как k mean - это неконтролируемая форма, мы можем разделить данные на обучение и тестирование на регрессию, в то время как для кластеризации мы можем кластеризовать все данные (независимые) и проверять результат после кластеризации. через сравнение фактических результатов с прогнозируемыми

Я знаю, что это может показаться очень запутанным, но поверьте мне, после этого не останется никаких сомнений. (Обещать!)

Кластеризация

Давайте возьмем зависимые переменные и разделим их на 2 кластера: съедобные и ядовитые.

kmean_pred = KMeans(n_clusters = 2)
kmean_pred.fit(X)

Готово, жизнь так хороша. А теперь давайте просто спрогнозируем результаты. Я имею в виду, что с помощью наших моделей мы разделим все наши данные на два кластера.

clusters = kmean_pred.predict(X)

Теперь у нас есть прогнозируемые и фактические результаты, давайте просто сравним их, чтобы увидеть результаты:

cluster_result = pd.DataFrame()
cluster_result['cluster'] = clusters
cluster_result['Actual'] = y
cluster_result.head()

Давай просто напечатаем еще раз, чтобы перепроверить!

cluster_result.head(10)

Ну, я сделал это до 60, но все предсказанные кластеры были равны 0, поэтому мне просто нужно было распечатать общее резюме, вот оно:

cluster_result['cluster'].value_counts()

Давайте просто нарисуем это, чтобы проверить, сколько наших грибов было правильно классифицировано!

sns.factorplot(col=’cluster’, x=’Actual’, data=cluster_result, kind=’count’)

Логистическая регрессия

С логистической регрессией справиться сравнительно легче, так как мы можем просто разделить данные на тренировку, протестировать и проверить точность модели. Итак, поехали!

Хотя у нас есть небольшая проблема, которую необходимо решить в первую очередь, поскольку наши зависимые переменные являются категориальными, нам необходимо закодировать их в числовой форме, и как нам это сделать? , спасибо LabelEncoder!

label_enc = LabelEncoder()
y = label_enc.fit_transform(y)

Теперь все готово, давайте разделим данные

train_X, test_X, train_y, test_y = train_test_split(X, y, test_size=0.20)
logreg = LogisticRegression()
logreg.fit(train_X,train_y)

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

kmean_pred.fit(train_X)

Время подготовки окончено, пришло время противостоять. Давайте сохраним прогноз обеих моделей в списке.

k_pred = kmeans.predict(test_X)
log_pred = logreg.predict(test_X)

Давайте просто рассмотрим эти результаты с фактическими результатами.

Теперь мы приближаемся к кульминации, когда мы подсчитаем, сколько прогнозов мы сделали в обеих наших моделях, так что поехали!

result_df = pd.DataFrame()
result_df['k_pred'] = k_pred
result_df['log_pred'] = log_pred
result_df['kmeans_correct'] = result_df['k_pred'] == result_df['test_y']
result_df['logreg_correct'] = result_df['log_pred'] == result_df['test_y']

Почти готово, вот результаты:

fig, ax = plt.subplots(1,2)
plt.subplots_adjust(right=2)
sns.countplot(x=result_df['kmeans_correct'], ax=ax[0]).set_title('K-Means Clustering')
sns.countplot(x=result_df['logreg_correct'], ax=ax[1]).set_title('Logistic Regression')
fig.show()

Что ж, я надеялся, что вам понравился этот бой. Буду очень признателен за несколько аплодисментов, Ура!