«Вы когда-нибудь слышали о наборе данных цветов ириса? Это один из самых известных наборов данных в мире машинного обучения и науки о данных, и не зря. Он состоит из 150 записей о цветках ириса, включая информацию об их длине и ширине чашелистиков и лепестков, а также о типе цветка ириса. В этом сообщении блога мы изучим набор данных Iris и узнаем о различных методах и методах, которые мы можем использовать для его анализа и понимания. Независимо от того, являетесь ли вы новичком или опытным специалистом по данным, этот пост предоставит ценную информацию и советы по работе с этим классическим набором данных».

Набор данных Iris flower — это классический набор данных в области машинного обучения и статистического анализа. Он состоит из 150 наблюдений за цветками ириса, включая длину и ширину чашелистиков и лепестков для каждого цветка, а также виды цветка. Набор данных был представлен британским статистиком и биологом Рональдом Фишером в его статье 1936 года «Использование множественных измерений в таксономических задачах».

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

Переменные:

  • sepal_length: длина чашелистика в сантиметрах, используемая в качестве входных данных.
  • sepal_width: Ширина чашелистика в сантиметрах, используемая в качестве входных данных.
  • лепесток_длина: длина лепестка в сантиметрах, используемая в качестве входных данных.
  • лепесток_ширина: ширина лепестка в сантиметрах, используемая в качестве входных данных.
  • класс: Iris Setosa, Versicolor или Virginica, используемые в качестве мишени.

Начнем с импорта необходимых библиотек и загрузки набора данных.

1. Импортируйте необходимые библиотеки

# Import necessary libraries
import numpy as np
import pandas as pd
import pandas_profiling
import tensorflow as tf
import sklearn.metrics as metrics

# for visualization
import matplotlib.pyplot as plt
import seaborn as sns
import datetime as dt
%matplotlib inline

# Import Warnings
import warnings
warnings.simplefilter(action="ignore")

# Setting Configurations:
pd.set_option('display.max_columns', None)
pd.set_option('display.width', 200)
pd.set_option('display.float_format', lambda x: '%.3f' % x)

# for data splitting, transforming and model training
from sklearn.metrics import accuracy_score, precision_score, recall_score, f1_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.preprocessing import MinMaxScaler

2. Загрузите данные

Загрузите набор данных Iris в Pandas DataFrame.

# Load the Iris dataset into a Pandas DataFrame
data = pd.read_csv('/kaggle/input/iris/Iris.csv')
data.head()

data.drop('Id',axis=1,inplace=True) #dropping the Id column as it is unecessary
data.info()

from pandas.api.types import is_numeric_dtype

for col in data.columns:
    if is_numeric_dtype(data[col]):
        print('%s:' % (col))
        print('\t Mean = %.2f' % data[col].mean())
        print('\t Standard deviation = %.2f' % data[col].std())
        print('\t Minimum = %.2f' % data[col].min())
        print('\t Maximum = %.2f' % data[col].max())

3. Предварительно обработайте данные

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

  1. Очистка данных: это включает в себя исправление ошибок или отсутствующих значений, а также удаление дубликатов или ненужной информации.
  2. Нормализация или масштабирование данных. Возможно, вы захотите масштабировать числовые данные, чтобы они были в одном масштабе, или для обработки выбросов.
  3. Кодирование категориальных данных. Если у вас есть категориальные данные (данные, которые можно разделить на фиксированное количество категорий), вам может потребоваться закодировать их как числовые данные, чтобы их можно было использовать в модели машинного обучения.
  4. Разделение данных. Вы можете разделить данные на обучающий набор, проверочный набор и тестовый набор, чтобы оценить производительность вашей модели.
  5. Уменьшение размерности: если у вас есть большое количество функций, вы можете уменьшить количество измерений, выбрав подмножество наиболее важных функций или используя такие методы, как анализ основных компонентов (PCA).

В целом, цель этапа предварительной обработки — привести данные к форме, пригодной для дальнейшего анализа или моделирования.

# Checking for missing values
data.isnull().sum()
duplicates = data[data.duplicated()]
print("Number of duplicates:", len(duplicates))
# Drop duplicates
data = data.drop_duplicates()
# Checking for outliers
data.describe()

# Checking for the data types
data.dtypes
# Checking for the shape of the dataset
data.shape
(147, 5)
# Checking for the correlation
data.corr()

Асимметрия — это мера симметричности распределения значений в столбце. Значение асимметрии, равное 0, означает, что распределение симметрично, в то время как положительное значение означает, что больший вес приходится на левую часть распределения, а отрицательное значение означает, что больший вес приходится на правую сторону.

# Calculate the skewness for all columns
data.skew()
# Checking for the unique values
data.nunique()
SepalLengthCm    35
SepalWidthCm     23
PetalLengthCm    43
PetalWidthCm     22
Species           3
dtype: int64
data.columns
Index(['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm', 'Species'], dtype='object')
# Checking for the value counts
data["Species"].value_counts()
Iris-versicolor    50
Iris-virginica     49
Iris-setosa        48
Name: Species, dtype: int64
# Checking for the value counts
data['Species'].value_counts().plot(kind='bar')
plt.show()

4. Визуализация данных

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

Существует множество причин для использования визуализации данных, в том числе:

  1. Выявление закономерностей и тенденций. Визуализация данных может помочь выявить тенденции и закономерности, которые могут быть незаметны в необработанных данных.
  2. Передача данных. Визуализация данных может упростить представление данных другим, поскольку позволяет передавать сложную информацию в более легком для восприятия формате.
  3. Сравнение данных. Визуализации могут помочь вам сравнить различные наборы данных или переменные и увидеть, как они соотносятся друг с другом.
  4. Выявление выбросов. Визуализации могут помочь вам определить необычные или неожиданные точки данных, которые могут быть полезны для выявления ошибок или аномалий в данных.
# Visualize the whole dataset

sns.pairplot(data,hue="Species")
plt.show()

Существует высокая корреляция между столбцами длины и ширины лепестков в наборе данных Iris. Вид Setosa имеет как малую длину, так и ширину лепестков, тогда как вид Versicolor имеет как среднюю длину, так и ширину лепестков. С другой стороны, виды Virginica имеют как большую длину, так и ширину лепестков. Что касается размеров чашелистиков, у видов Setosa большая ширина чашелистиков и малая длина чашелистиков, у видов Versicolor средние значения обоих размеров чашелистиков, а у видов Virginica малая ширина чашелистиков, но большая длина чашелистиков.

plt.figure(figsize=(7,5))
# Plotting the heatmap
sns.heatmap(data.corr(), annot=True)
plt.show()

Параметры длины чашелистика и ширины чашелистика слегка коррелируют друг с другом.

# Plotting the boxplot
sns.boxplot(x='Species', y='SepalLengthCm', data=data)
plt.show()

sns.boxplot(x='Species', y='SepalWidthCm', data=data)
plt.show()

sns.boxplot(x='Species', y='PetalLengthCm', data=data)
plt.show()

sns.boxplot(x='Species', y='PetalWidthCm', data=data)
plt.show()

Вид Setosa имеет меньшие и менее распространенные черты по сравнению с двумя другими видами. Вид Versicolor распространен в среднем и имеет средние черты. С другой стороны, виды Virginica широко распространены с большим количеством значений и признаков. Средние и медианные значения различных признаков (таких как длина и ширина чашелистиков, длина и ширина лепестков) четко показаны на каждом графике для каждого вида. Это говорит о том, что распределение этих признаков значительно различается между тремя видами.

# Plotting the violinplot
sns.violinplot(x='Species', y='SepalLengthCm', data=data)
plt.show()

sns.violinplot(x='Species', y='SepalWidthCm', data=data)
plt.show()

sns.violinplot(x='Species', y='PetalLengthCm', data=data)
plt.show()

sns.violinplot(x='Species', y='PetalWidthCm', data=data)
plt.show()

# Plotting the swarmplot
sns.swarmplot(x='Species', y='SepalLengthCm', data=data)
plt.show()
sns.swarmplot(x='Species', y='SepalWidthCm', data=data)
plt.show()
sns.swarmplot(x='Species', y='PetalLengthCm', data=data)
plt.show()
sns.swarmplot(x='Species', y='PetalWidthCm', data=data)
plt.show()

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

Distplot можно использовать для понимания формы и распространения распределения переменной. Это может помочь вам ответить на такие вопросы, как:

  • Какова центральная тенденция данных (среднее, медиана, мода)?
  • Каков разброс данных (диапазон, межквартильный диапазон, стандартное отклонение)?
  • Какова форма распределения (симметричная, асимметричная)?
# Plotting the distplot
sns.distplot(data['SepalLengthCm'])
plt.show()

sns.distplot(data['SepalWidthCm'])
plt.show()

sns.distplot(data['PetalLengthCm'])
plt.show()

sns.distplot(data['PetalWidthCm'])
plt.show()

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

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

Вы можете использовать совместный сюжет, чтобы ответить на такие вопросы, как:

  • Есть ли связь между двумя переменными?
  • Какова сила и направление отношений?
  • Есть ли какие-либо необычные или неожиданные точки в данных?
# Plotting the jointplot
sns.jointplot(x='SepalLengthCm', y='SepalWidthCm', data=data)
plt.show()

sns.jointplot(x='SepalLengthCm', y='PetalLengthCm', data=data)
plt.show()

sns.jointplot(x='SepalLengthCm', y='PetalWidthCm', data=data)
plt.show()

sns.jointplot(x='SepalWidthCm', y='PetalLengthCm', data=data)
plt.show()

# Plotting the stripplot
# Create a figure with 4 subplots
fig, ax = plt.subplots(2, 2)

# Plot the first stripplot in the top left subplot
sns.stripplot(x='Species', y='SepalLengthCm', data=data, ax=ax[0, 0])

# Plot the second stripplot in the top right subplot
sns.stripplot(x='Species', y='SepalWidthCm', data=data, ax=ax[0, 1])

# Plot the third stripplot in the bottom left subplot
sns.stripplot(x='Species', y='PetalLengthCm', data=data, ax=ax[1, 0])

# Plot the fourth stripplot in the bottom right subplot
sns.stripplot(x='Species', y='PetalWidthCm', data=data, ax=ax[1, 1])

plt.show()

5. Разделите данные на обучающие и тестовые наборы

Важно выбрать подходящий коэффициент разделения для ваших данных. Обычной практикой является использование разделения 80/20 или 70/30, при этом большая часть идет на тренировочный сет. Однако лучший коэффициент разделения будет зависеть от размера и характеристик вашего набора данных.

train, test = train_test_split(data, test_size = 0.3) # the attribute test_size=0.3 splits the data into 70% and 30% ratio. train=70% and test=30%
print(train.shape)
print(test.shape)
X_train= train[['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']]   # taking the training data features
y_train=train.Species                                                              # output of our training data
X_test= test[['SepalLengthCm','SepalWidthCm','PetalLengthCm','PetalWidthCm']]      # taking test data features
y_test=test.Species                                                               #output value of test data
# Feature Scaling
from sklearn.preprocessing import StandardScaler
sc = StandardScaler()
X_train = sc.fit_transform(X_train)
X_test = sc.transform(X_test)

6. Обучение модели

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

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

from sklearn.linear_model import LogisticRegression# Train a logistic regression model on the training data
model = LogisticRegression()
model.fit(X_train, y_train)
prediction=model.predict(X_test)
print('The accuracy of the Logistic Regression is',metrics.accuracy_score(prediction,y_test))
The accuracy of the Logistic Regression is 0.9555555555555556
# Evaluate the performance of the model on the test data
y_pred = model.predict(X_test)
f1 = f1_score(y_test, y_pred, average='micro')
print("F1 score:", f1)
F1 score: 0.9555555555555556

KNN (K-ближайшие соседи)

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix

classifier = KNeighborsClassifier(n_neighbors=2)
classifier.fit(X_train, y_train)

y_pred = classifier.predict(X_test)

# Summary of the predictions made by the classifier
print(classification_report(y_test, y_pred))
print(confusion_matrix(y_test, y_pred))
# Accuracy score
from sklearn.metrics import accuracy_score
print('accuracy is',accuracy_score(y_pred,y_test))

Метод опорных векторов (SVM)

from sklearn import svm
model = svm.SVC() #select the algorithm
model.fit(X_train, y_train) # train the algorithm with the training data and the training output
prediction=model.predict(X_test) #pass the testing data to the trained algorithm
#check the accuracy of the algorithm. 
print('The accuracy of the SVM is:',metrics.accuracy_score(prediction,y_test))
The accuracy of the SVM is: 0.9777777777777777
# A detailed classification report
from sklearn.metrics import classification_report
print(classification_report(y_test, prediction))

Другие способы и подробное описание проекта вы можете найти в блокноте, который я подготовил на Kaggle.

Заключение

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

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

Пожалуйста, не стесняйтесь связаться со мной, если вам нужна дополнительная информация.