«Вы когда-нибудь слышали о наборе данных цветов ириса? Это один из самых известных наборов данных в мире машинного обучения и науки о данных, и не зря. Он состоит из 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. Предварительно обработайте данные
На этапе предварительной обработки вы обычно выполняете ряд операций с необработанными данными, чтобы подготовить их к дальнейшему анализу или моделированию. Конкретные шаги, которые вы предпримете, будут зависеть от ваших целей и характеристик ваших данных, но некоторые общие задачи включают в себя:
- Очистка данных: это включает в себя исправление ошибок или отсутствующих значений, а также удаление дубликатов или ненужной информации.
- Нормализация или масштабирование данных. Возможно, вы захотите масштабировать числовые данные, чтобы они были в одном масштабе, или для обработки выбросов.
- Кодирование категориальных данных. Если у вас есть категориальные данные (данные, которые можно разделить на фиксированное количество категорий), вам может потребоваться закодировать их как числовые данные, чтобы их можно было использовать в модели машинного обучения.
- Разделение данных. Вы можете разделить данные на обучающий набор, проверочный набор и тестовый набор, чтобы оценить производительность вашей модели.
- Уменьшение размерности: если у вас есть большое количество функций, вы можете уменьшить количество измерений, выбрав подмножество наиболее важных функций или используя такие методы, как анализ основных компонентов (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. Визуализация данных
Визуализация данных — это процесс создания визуальных представлений данных для получения информации и лучшего понимания данных. Это можно сделать с помощью различных инструментов и методов, таких как графики, диаграммы и карты.
Существует множество причин для использования визуализации данных, в том числе:
- Выявление закономерностей и тенденций. Визуализация данных может помочь выявить тенденции и закономерности, которые могут быть незаметны в необработанных данных.
- Передача данных. Визуализация данных может упростить представление данных другим, поскольку позволяет передавать сложную информацию в более легком для восприятия формате.
- Сравнение данных. Визуализации могут помочь вам сравнить различные наборы данных или переменные и увидеть, как они соотносятся друг с другом.
- Выявление выбросов. Визуализации могут помочь вам определить необычные или неожиданные точки данных, которые могут быть полезны для выявления ошибок или аномалий в данных.
# 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. Удачного кодирования!
Пожалуйста, не стесняйтесь связаться со мной, если вам нужна дополнительная информация.