Урок машинного обучения

Набор данных о пингвинах архипелага Палмера (Антарктида), по-видимому, является заменой набора данных Iris. Это отличный вводной набор данных для исследования и визуализации данных. Но набор данных по пингвинам имеет разное количество образцов для каждого вида. Можно заметить, что в отличие от набора данных Iris, эти данные содержат разное количество записей для каждого вида.

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

Исследование данных

import numpy as np
import pandas as pd
from io import StringIO
import matplotlib.pyplot as plt
import seaborn as sns
df = sns.load_dataset("penguins")
sns.pairplot(df, hue="species")
figfile = StringIO()
plt.savefig(figfile, format="svg")
plt.show()
print(df.info())

Точечная диаграмма (также известная как точечная диаграмма, точечная диаграмма) использует точки для представления значений двух разных числовых переменных. Положение каждой точки на горизонтальной и вертикальной осях указывает значения для отдельной
точки данных. Диаграммы рассеивания используются для наблюдения взаимосвязей между переменными.
Распространенной модификацией базовой диаграммы рассеяния является добавление третьей переменной. Значения третьей переменной можно закодировать, изменив способ построения точек. Для третьей переменной, которая указывает
категориальные значения (например, географический регион или пол), наиболее распространенным кодированием является цвет точки.
Seaborn позволяет создавать реляционные графики с помощью функции relplot(). Технически функция позволяет создавать не только диаграммы рассеяния.

RangeIndex: 344 entries, 0 to 343
Data columns (total 7 columns):
 #   Column             Non-Null Count  Dtype  
---  ------             --------------  -----  
 0   species            344 non-null    object 
 1   island             344 non-null    object 
 2   bill_length_mm     342 non-null    float64
 3   bill_depth_mm      342 non-null    float64
 4   flipper_length_mm  342 non-null    float64
 5   body_mass_g        342 non-null    float64
 6   sex                333 non-null    object 
dtypes: float64(4), object(3)
memory usage: 18.9+ KB
None
pip install seaborn

или альтернативное исследование данных

#Or alternate
#df = pd.read_csv('../input/palmer-archipelago-antarctica-penguin-
#data/penguins_size.csv')
p2data = "https://raw.githubusercontent.com/allisonhorst/palmerpenguins/master/data-raw/penguins_raw.csv
p2data =  https://raw.githubusercontent.com/rianrajagede/penguin-python/master/Datasets/penguins.csv
df.head()

видовой остров bill_length_mm bill_depth_mm flipper_length_mm body_mass_g пол 0 Адели Торгерсен 39,1 18,7 181,0 3750,0 Самец 1 Адели Торгерсен 39,5 17,4 186,0 3800,0 Самка 2 Адели Торгерсен 40,3 18,0 195,0 3250,0 Самка 3 Адели Торгерсен NaN NaN NaN NaN NaN 4 Адели Торгерсен 36,7 19,3 193,0 3450,0 Женщины

Итак, набор данных состоит из 7 столбцов:

• виды: виды пингвинов (Чинстрап, Адели или Генту).

• culmen_length_mm

• глубина стебля (мм)

• flipper_length_mm: длина плавника (мм)

• body_mass_g: масса тела (г)

• остров: название острова (Дрим, Торгерсен или Биско) в архипелаге Палмера (Антарктида)

• секс: секс пингвинов

Предварительная обработка

Мы должны предварительно обработать данные, иначе мы получим исключение: ValueError: Input содержит NaN, бесконечность или значение, слишком большое для dtype(‘float64’). Итак, мы очищаем эти NaN и альтернативно можем также удалить целевой столбец:

print(df.isnull().sum())
df = df.dropna()
# df = df.drop(df[df['species'] == 'Gentoo'].index)
species               0
island                0
bill_length_mm        2
bill_depth_mm         2
flipper_length_mm     2
body_mass_g           2
sex                  11
dtype: int64

Pandas как df — это популярная библиотека Python, используемая для работы с табличными данными. Он предоставляет универсальный объект dataframe, который может считывать данные из многих популярных форматов, таких как Excel, SQL, CSV и других.
Стиль Pandas

импортировать панд как pd

data = {
«калории»: [420, 380, 390],
«длительность»: [50, 40, 45]
}
#загрузить данные в объект DataFrame :
df = pd.DataFrame(data)
print(df)

Кластер

Чтобы лучше понять, мы хотим сгруппировать данные. «Ковариация» указывает направление линейной зависимости между переменными. С другой стороны, «корреляция» измеряет как силу, так и направление линейной зависимости между двумя переменными.

from sklearn.cluster import KMeans
print("CLUSTERING ON CULMEN LENGTH AND CULMEN DEPTH")
X = df[["bill_length_mm","bill_depth_mm"]]
kmeans = KMeans(n_clusters=3)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)
plt.scatter(X.loc[:,"bill_length_mm"],X.loc[:,"bill_depth_mm"],c=y_kmeans,s=50,cmap="viridis")
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c="black", s=200, alpha=0.5)
plt.show()

График Cluster взят из import matplotlib.pyplot as plt. Базовый вызов pip установит seaborn и, при необходимости, его обязательные зависимости. Можно включить необязательные зависимости, дающие доступ к нескольким расширенным функциям:
pip install seaborn[stats].
Массивы Numpy — хорошая замена спискам Python. Они лучше, чем списки Python. Они обеспечивают более высокую скорость и занимают меньше места в памяти. Начнем с его определения для тех, кто не знает о массивах numpy. Это многомерные матрицы или списки фиксированного размера с похожими элементами.

классифицировать

Точечная диаграмма в начале (парная диаграмма) от Seaborn, которая показывает нам корреляцию по отношению к другим функциям. Этот метод помогает просто выяснить важные признаки, которые в наибольшей степени учитывают классификацию в нашей модели. Теперь я устанавливаю «виды» в качестве целевой переменной y и 3 признака как X для классификации видов:

X = df[["bill_length_mm", "bill_depth_mm","flipper_length_mm"]]
y = df["species"]
print(X.shape)
print(y.shape)
(333, 3)
(333,)

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

Алгоритм использует гиперпараметр для управления силой регуляризации и полностью интегрирует гиперпараметр в апостериорном распределении, применяя гиперприор, выбранный таким образом, чтобы он был приблизительно неинформативным.
Алгоритм Scikit-learn использует сопряженное априорные значения, и из-за этого ограничено использование априорной гаммы, которая требует, чтобы четыре гиперпараметра были выбраны произвольно, чтобы они были небольшими значениями. Кроме того, для этого требуются начальные значения параметров αα и λλ, которые затем обновляются на основе данных.

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

from sklearn import preprocessing
X = preprocessing.scale(X)

#splitting the data
from sklearn.model_selection import train_test_split
X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.4,random_state=13)

# model fitting and prediction
from sklearn.linear_model import LogisticRegression
model = LogisticRegression().fit(X_train, y_train)
pred = model.predict(X_test)
print(pred[1:50])

При использовании набора данных для анализа вы должны проверить свои данные, чтобы убедиться, что они содержат только конечные числа и не содержат значений NaN (не числа). Если вы попытаетесь передать набор данных, содержащий значения NaN или бесконечность, в функцию для анализа, вы получите сообщение об ошибке: ValueError: input содержит nan, бесконечность или значение, слишком большое для dtype(‘float64’).

['Chinstrap' 'Adelie' 'Adelie' 'Gentoo' 'Gentoo' 'Adelie' 'Adelie'
 'Adelie' 'Adelie' 'Gentoo' 'Adelie' 'Adelie' 'Adelie' 'Chinstrap'
 'Gentoo' 'Chinstrap' 'Gentoo' 'Gentoo' 'Gentoo' 'Adelie' 'Adelie'
 'Adelie' 'Chinstrap' 'Gentoo' 'Chinstrap' 'Adelie' 'Adelie' 'Gentoo'
 'Chinstrap' 'Gentoo' 'Chinstrap' 'Adelie' 'Gentoo' 'Gentoo' 'Adelie'
 'Gentoo' 'Chinstrap' 'Adelie' 'Chinstrap' 'Adelie' 'Adelie' 'Gentoo'
 'Adelie' 'Adelie' 'Adelie' 'Gentoo' 'Adelie' 'Gentoo' 'Adelie']

Бенчмаркинг

У нас есть 333 (266) выборок с 3 функциями для классификации с помощью логистической регрессии, но насколько хороша производительность:

# checking performance of model

from sklearn.metrics import classification_report, confusion_matrix, roc_curve, roc_auc_score

print('CONFUSION MATRIX')
print(confusion_matrix(y_test, pred))
print('CLASSIFICATION REPORT\n')
print(classification_report(y_test, pred))

sns.heatmap(confusion_matrix(y_test, pred), annot=True)
plt.show()
CONFUSION MATRIX
[[63  1  0]
 [ 1 28  0]
 [ 0  0 41]]
CLASSIFICATION REPORT

              precision    recall  f1-score   support

      Adelie       0.98      0.98      0.98        64
   Chinstrap       0.97      0.97      0.97        29
      Gentoo       1.00      1.00      1.00        41

    accuracy                           0.99       134
   macro avg       0.98      0.98      0.98       134
weighted avg       0.99      0.99      0.99       134

Оценивать

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

Папуасский пингвин — это вид пингвинов из рода Pygoscelis, наиболее
родственный пингвину Адели и антарктическому пингвину. Как мы видели, каждый пингвин принадлежит к одному из трех следующих видов: Адели,
Генту и Антарктический. См. иллюстрацию выше (и ниже), сначала изображающую в парной корреляционной матрице три разных вида пингвинов. Но Gentoo легко восстановить как почти четкое различие.

Попробуйте на ноутбуке Jupyter: