Контролируемое машинное обучение

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

Классификация. Проблема классификации возникает, когда выходная переменная представляет собой категорию, например «красный» или «синий», «заболевание» или «отсутствие заболевания».

Регрессия. Проблема регрессии возникает, когда выходная переменная представляет собой реальное значение, например «доллары» или «вес».

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

K-ближайшие соседи — один из самых простых, но важных алгоритмов классификации в машинном обучении. Он относится к области контролируемого обучения и находит интенсивное применение в распознавании образов и интеллектуальном анализе данных. KNN можно использовать как для задач классификации, так и для задач прогнозирования регрессии. KNN относится к семейству алгоритмов обучения с учителем. Неформально это означает, что нам дан помеченный набор данных, состоящий из обучающих наблюдений (x, y), и мы хотели бы зафиксировать взаимосвязь между x и y. Говоря более формально, наша цель состоит в том, чтобы изучить функцию h: X→Y, чтобы при невидимом наблюдении x функция h(x) могла уверенно предсказывать соответствующий результат y.

Работа
Шаг 1: вычисление расстояния между новой точкой данных для каждого обучающего примера.
Шаг 2: для вычислений будут использоваться меры расстояния, такие как евклидово расстояние, расстояние Хэмминга или манхэттенское расстояние.
Шаг 3. Модель выбирает в базе данных K записей, ближайших к новой точке данных. .
Шаг 4. Затем он голосует большинством, т. е. наиболее распространенным классом/меткой среди этих K записей будет класс новой точки данных.

Библиотеки

NumPy для выполнения многомерной операции.

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

Seaborn и Matplotlib используются для построения графиков и визуализации данных.

Scikit используется для предварительной обработки с помощью LabelEncoder, кластеризации K-средних, оценки модели и матрицы путаницы.

Scipy вычисляет расстояние между каждой парой двух наборов входных данных.

# Importing all the important Libraries
import pandas as pd
from sklearn.preprocessing import LabelEncoder
from sklearn.model_selection import train_test_split
import matplotlib.pyplot as plt
import seaborn as sns
from pandas.plotting import parallel_coordinates
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import confusion_matrix, accuracy_score, classification_report
from sklearn.model_selection import cross_val_score
%matplotlib inline

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

Набор данных доступен по адресу https://bit.ly/3kXTdox.

Набор данных радужной оболочки состоит из 150 записей с 6 столбцами, такими как «Id», «SepalLengthCm», «SepalWidthCm», «PetalLengthCm», «PetalWidthCm» и «Species», представляющие виды цветка ириса в соответствии с атрибутами чашелистика и лепестка.

Набор данных состоит из 50 образцов каждого из трех видов ириса (Iris setosa, Iris virginica и Iris versicolor).

# Importing the dataset
data = pd.read_csv('Iris.csv')
# Shape
print('Shape:', data.shape)
# Dataset Preview
print(data.head())
# Data Count
print(data.groupby('Species').size())

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

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

# Pie chart
labels = ['Iris-setosa', 'Iris-versicolor', 'Iris-virginica']
sizes = [(df['Species'] == 'Iris-setosa').sum(),
         (df['Species'] == 'Iris-versicolor').sum(),
         (df['Species'] == 'Iris-virginica').sum()]
# colors
colors = ['#ff9999', '#66b3ff', '#99ff99', '#ffcc99']
fig1, ax1 = plt.subplots()
patches, texts, autotexts = ax1.pie(sizes, colors=colors, labels=labels, autopct='%1.1f%%', startangle=90)
for text in texts:
    text.set_color('black')
for autotext in autotexts:
    autotext.set_color('black')
# Equal aspect ratio ensures that pie is drawn as a circle
ax1.axis('equal')
plt.tight_layout()
plt.savefig('piechart.png')
plt.show()

Кривые Эндрюса. Кривые Эндрюса предполагают использование атрибутов образцов в качестве коэффициентов для ряда Фурье.

# Andrews Curves
plt.figure(figsize=(10, 5))
andrews_curves(df.drop("Id", axis=1), "Species")
plt.title('Andrews Curves Plot', fontsize=5, fontweight='bold')
plt.xlabel('Features', fontsize=5)
plt.ylabel('Features values', fontsize=10)
plt.legend(loc=1, prop={'size': 10}, frameon=True, shadow=True, facecolor="white", edgecolor="black")
plt.savefig('andrewscurves.png')
plt.show()

Параллельное построение. Параллельные координаты отображают каждый объект в отдельном столбце, а затем рисуют линии, соединяющие объекты для каждой выборки данных.

# Parallel Coordinates
plt.figure(figsize=(10, 5))
parallel_coordinates(df.drop("Id", axis=1), "Species")
plt.title('Parallel Coordinates Plot', fontsize=5, fontweight='bold')
plt.xlabel('Features', fontsize=5)
plt.ylabel('Features values', fontsize=10)
plt.legend(loc=1, prop={'size': 10}, frameon=True, shadow=True, facecolor="white", edgecolor="black")
plt.savefig('parallelcoordinates.png')
plt.show()

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

# Pairplot
plt.figure()
sns.pairplot(df.drop("Id", axis=1), hue="Species", height=3, markers=["o", "s", "D"])
plt.title('Pairplot', fontsize=5, fontweight='bold')
plt.savefig('pairplot.png')
plt.show()

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

# Pairgrid
plt.figure()
sns.pairplot(df.drop("Id", axis=1), hue="Species", height=7, diag_kind="kde")
plt.title('Pairplot', fontsize=5, fontweight='bold')
plt.savefig('pairgrid.png')
plt.show()

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

# Heatmap
plt.figure()
sns.heatmap(df.corr(), annot=True)
plt.title('Heatmap', fontsize=5, fontweight='bold')
plt.savefig('heatmap.png')
plt.show()

Разделить набор данных

Как мы видим, набор данных содержит шесть столбцов: Id, SepalLengthCm, SepalWidthCm, PetalLengthCm, PetalWidthCm и Species. Фактические функции описаны в столбцах 1–4. Последний столбец содержит метки образцов. Во-первых, нам нужно разделить данные на два массива: X (функции) и y (метки).

# Split Data
feature_columns = ['SepalLengthCm', 'SepalWidthCm', 'PetalLengthCm', 'PetalWidthCm']
X = data[feature_columns].values
y = data['Species'].values

Кодирование

KNeighborsClassifier не принимает строковые метки. Нам нужно использовать LabelEncoder, чтобы преобразовать их в числа. Iris-setosa соответствует 0, Iris-versicolor соответствует 1 и Iris-virginica соответствует 2.

encoder = LabelEncoder()
y = encoder.fit_transform(y)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

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

# KNN Classification
classifier = KNeighborsClassifier(n_neighbors=3)
# Fitting the model
classifier.fit(X_train, y_train)
# Predicting the Test set results
y_pred = classifier.predict(X_test)
cm = confusion_matrix(y_test, y_pred)
print('\nConfusion Matrix\n', cm)
# Output
Confusion Matrix
 [[16  0  0]
 [ 0 17  1]
 [ 0  0 11]]

Оценка

Точность, полученная с помощью классификатора KNN, составляет 97,78%. Оптимальное количество требуемых соседей равно 7.

# Accuracy
print('\nClassification Report\n', classification_report(y_test, y_pred))
accuracy = accuracy_score(y_test, y_pred) * 100
print('KNN Accuracy:', str(round(accuracy, 2)) + '%')
# Output
Classification Report
               precision    recall  f1-score   support
0       1.00      1.00      1.00        16
           1       1.00      0.94      0.97        18
           2       0.92      1.00      0.96        11
accuracy                           0.98        45
   macro avg       0.97      0.98      0.98        45
weighted avg       0.98      0.98      0.98        45
KNN Accuracy: 97.78%

Поиск оптимального значения K

# Creating list of K for KNN
k_list = list(range(1, 50, 2))
# Creating list of cv scores
cv_scores = []
# Perform 10-fold cross validation
for k in k_list:
    knn = KNeighborsClassifier(n_neighbors=k)
    scores = cross_val_score(knn, X_train, y_train, cv=10, scoring='accuracy')
    cv_scores.append(scores.mean())
# Changing to mis-classification error
MSE = [1 - x for x in cv_scores]
# Finding best k
best_k = k_list[MSE.index(min(MSE))]
print("The optimal number of neighbors is %d." % best_k)
# Transform to df for easier plotting
cm_df = pd.DataFrame(cm,
                     index=['setosa', 'versicolor', 'virginica'],
                     columns=['setosa', 'versicolor', 'virginica'])
sns.heatmap(cm_df, annot=True)
plt.title('Accuracy:{0:.4f}'.format(accuracy_score(y_label, y_pred)))
plt.ylabel('Actual label')
plt.xlabel('Predicted label')
plt.savefig('confusionMatrix.png')
plt.show()

Рекомендации

  1. https://numpy.org/
  2. https://pandas.pydata.org/
  3. https://matplotlib.org/
  4. https://seaborn.pydata.org/
  5. https://scikit-learn.org/
  6. https://www.scipy.org/