3975
.pdfМИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования
«Нижегородский государственный архитектурно-строительный университет»
Д. И. Кислицын
Машинное обучение и анализ данных
Учебно-методическое пособие
по выполнению лабораторных работ для обучающихся по дисциплине «Машинное обучение и анализ данных»
по направлению подготовки 09.04.02 Информационные системы и технологии, профиль «Искусственный интеллект в системах и сетях передачи данных»
Нижний Новгород
2022
МИНОБРНАУКИ РОССИИ Федеральное государственное бюджетное образовательное учреждение высшего образования
«Нижегородский государственный архитектурно-строительный университет»
Д. И. Кислицын
Машинное обучение и анализ данных
Учебно-методическое пособие
по выполнению лабораторных работ для обучающихся по дисциплине «Машинное обучение и анализ данных»
по направлению подготовки 09.04.02 Информационные системы и технологии, профиль «Искусственный интеллект в системах и сетях передачи данных»
Нижний Новгород ННГАСУ
2022
2
УДК 681.3 (075)
Кислицын Д. И. Машинное обучение и анализ данных : учебнометодическое пособие / Д. И. Кислицын; Нижегородский государственный архитектурно-строительный университет. – Нижний Новгород : ННГАСУ, 2022. - 13 с. - Текст : электронный.
Предназначено для обучающихся в ННГАСУ по дисциплине «Машинное обучение и анализ данных» по направлению подготовки 09.04.02 Информационные системы и технологии, профиль «Искусственный интеллект в системах и сетях передачи данных».
Д. И. Кислицын, 2022ННГАСУ, 2022
3
|
Содержание |
Лабораторная работа №1 |
.................................................................................. 5 |
Лабораторная работа №2 .................................................................................. |
7 |
Лабораторная работа №3 .................................................................................. |
9 |
4
Лабораторная работа №1
Выработка навыков в использовании статистических методов вмашинном
обучении
1.Войти в учетную запись google и создать рабочий блокнот в Google Collab.
2.Произвести импорт библиотек, необходимых для проведения экспериментов.
import numpy as np
import pandas as pd
import seaborn as sns.
3.Прочитать исходные данные из файла csv
df=pd.read_csv('Excel.csv')
df.head()
4.Оценить типы данных и их статистические характеристики
df.dtypes
df.describe()
5.Построим график распределения данных
sns.kdeplot(data=df,x='Height',shade=True) sns.kdeplot(data=df,x='Weight',shade=True)
6.Оценим размер данных
df.shape
7.Разделим данные
X = df.iloc[:,:-1] y = df.iloc[:,-1]
8.Добавим модули для построения модели линейной регрессии
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
9. Разделим данные на обучающую и тестовую выборки и отобразим их
размеры
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.1, r andom_state=0)
print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)
10.Создадим линейную регрессию
5
LinReg = LinearRegression()
LinReg.fit(X_train,y_train)
11.Отобразим коэффициенты модели.
LinReg.coef_, LinReg.intercept_
12.Выведем оценку коэффициента R2 модели машинного обучения
print("Оценка модели машинного обучения: {:.2f}".format(LinReg.score(X_tes
t,y_test)))
Индивидуальное задание: Построить модель линейной регрессии взяв данныеу
преподавателя.
6
Лабораторная работа №2
Введение в кластеризацию. Основные методы кластеризации. Понижение размерности и отбор признаков. Матричные разложения.
Типы кластерных структур. ЕМ – алгоритм и метод k-средних
1.Войти в учетную запись google и создать рабочий блокнот в Google Collab.
2.Произвести импорт библиотек, необходимых для
проведенияэкспериментов.
import numpy as np import pandas as pd
import matplotlib.pyplot as plt plt.style.use('ggplot')
from sklearn.manifold import TSNE
from sklearn.datasets import load_digits
3. Чтобы проиллюстрировать идею кластеризации рассмотрим следующий пример. Предположим. что у вас есть большая коллекция картинок. Вам надо определить классы этих картинок. Но вы не знаете на сколько классов имеет смысл разделить эти картинки. Попробуем применить t-SNE чтобы понять это загрузим картинки цифр
digit = load_digits() img = digit.images img.shape plt.imshow(img[0]);
img[0]
4.Применим t-SNE и визуализируем получившееся разбиение
X = img.reshape(-1, 64)
tsne = TSNE(n_components=2, perplexity=30)tsne.fit(X) Z = tsne.embedding_
Z.shape
plt.scatter(Z[:, 0], Z[:, 1], c='b');
5. Визуализируем получившееся разбиение с учетом знания цифр на
картинках
7
y = digit.target plt.scatter(Z[:, 0], Z[:, 1], c=y);
6. Чтобы проиллюстрировать последнее рассмотрим предыдущий пример с изображениями цифр. Мы будет случайно определять начальное расположение центроидов. Посмотрим как будет меняться финальное разбиение и насколько оно будет соответствовать реальному делению на классы.
# Применение k-means
from sklearn.cluster import KMeans
kmeans = KMeans(n_clusters=10, init='random', n_init=10, random_state=10)
# применяем - обучаем kmeans.fit(X)
#метки кластеров labels = kmeans.labels_ labels.shape
#визуализируем получившееся разбиение с учетом знания цифр на картинках#
и сравним с разбиением на кластеры, полученным с помощью k-means fig, ax = plt.subplots(nrows=1, ncols=2, figsize=(12,5)) ax[0].scatter(Z[:, 0], Z[:, 1], c=y)
ax[1].scatter(Z[:, 0], Z[:, 1], c=labels) ax[0].set_title('Истинное разбиение') ax[1].set_title('Разбиение k-means') fig.show()
Индивидуальное задание: Построить разбиение на кластеры взяв данные у
преподавателя.
8
Лабораторная работа 3.
Сверточные ИНС – дальнейшее развитие ИНС.
Базовая версия программы, которая реализует обучение нейронной сети для распознавания предметов одежды.
from tensorflow.keras.datasets import fashion_mnist from tensorflow.keras.models import Sequential from tensorflow.keras.layers import Dense, Dropout from tensorflow.keras import utils
import numpy as np
# Загружаем данные
(x_train, y_train), (x_test, y_test) = fashion_mnist.load_data()
# Список с названиями классов
classes = ['футболка', 'брюки', 'свитер', 'платье', 'пальто', 'туфли', 'рубашка', 'кроссовки', 'сумка', 'ботинки']
#Преобразование размерности изображений x_train = x_train.reshape(60000, 784) x_test = x_test.reshape(10000, 784)
#Нормализация данных
x_train = x_train / 255 x_test = x_test / 255
# Преобразуем метки в категории
y_train = utils.to_categorical(y_train, 10) y_test = utils.to_categorical(y_test, 10)
#Создаем последовательную модель model = Sequential()
#Добавляем уровни сети
model.add(Dense(800, input_dim=784, activation="relu")) model.add(Dense(10, activation="softmax"))
# Компилируем модель model.compile(loss="categorical_crossentropy", optimizer="SGD",
metrics=["accuracy"])
print(model.summary())
# Обучаем сеть
history = model.fit(x_train, y_train, batch_size=200,epochs=100,
validation_split=0.2,verbose=1)
# Оцениваем качество обучения сети на тестовых данных scores = model.evaluate(x_test, y_test, verbose=1)
print("Доля верных ответов на тестовых данных, в процентах:", round(scores[1] * 100, 4))
Запишите долю верных ответов работы сети после обучения на тестовых данных. Она выводится следующим образом:
Доля верных ответов на тестовых данных, в процентах: 86.87
9
Проанализируйте долю верных ответов на проверочном наборе данных в процессе обучения. Она указывается после заголовка "val_acc". Вот фрагмент вывода обучения нейронной сети (эпохи с 11 по 89 удалены для сокращения места):
Train on 48000 samples, validate on 12000 samples |
|
|
Epoch 1/100 |
|
|
48000/48000 |
[==============================] - 2s 37us/sample - loss: 1.1875 |
- |
acc: 0.6657 |
- val_loss: 0.8279 - val_acc: 0.7548 |
|
Epoch 2/100 |
|
|
48000/48000 |
[==============================] - 1s 21us/sample - loss: 0.7540 |
- |
acc: 0.7721 |
- val_loss: 0.6858 - val_acc: 0.7850 |
|
Epoch 3/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.6573 |
- |
acc: 0.7947 |
- val_loss: 0.6244 - val_acc: 0.8001 |
|
Epoch 4/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.6061 |
- |
acc: 0.8084 |
- val_loss: 0.5850 - val_acc: 0.8112 |
|
Epoch 5/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.5729 |
- |
acc: 0.8158 |
- val_loss: 0.5609 - val_acc: 0.8153 |
|
Epoch 6/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.5491 |
- |
acc: 0.8212 |
- val_loss: 0.5447 - val_acc: 0.8175 |
|
Epoch 7/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.5304 |
- |
acc: 0.8255 |
- val_loss: 0.5242 - val_acc: 0.8238 |
|
Epoch 8/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.5159 |
- |
acc: 0.8289 |
- val_loss: 0.5133 - val_acc: 0.8267 |
|
Epoch 9/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.5037 |
- |
acc: 0.8328 |
- val_loss: 0.5026 - val_acc: 0.8287 |
|
Epoch 10/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.4933 |
- |
acc: 0.8355 |
- val_loss: 0.4942 - val_acc: 0.8294 |
|
... |
|
|
Epoch 90/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.3249 |
- |
acc: 0.8881 |
- val_loss: 0.3607 - val_acc: 0.8731 |
|
Epoch 91/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.3244 |
- |
acc: 0.8871 |
- val_loss: 0.3592 - val_acc: 0.8745 |
|
Epoch 92/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.3228 |
- |
acc: 0.8884 |
- val_loss: 0.3581 - val_acc: 0.8756 |
|
Epoch 93/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.3222 |
- |
acc: 0.8890 - val_loss: 0.3612 - val_acc: 0.8743 |
|
|
Epoch 94/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.3210 |
- |
acc: 0.8889 - val_loss: 0.3588 - val_acc: 0.8743 |
|
|
Epoch 95/100 |
|
|
48000/48000 |
[==============================] - 1s 19us/sample - loss: 0.3203 |
- |
acc: 0.8888 - val_loss: 0.3577 - val_acc: 0.8742 |
|
|
Epoch 96/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.3192 |
- |
acc: 0.8896 - val_loss: 0.3585 - val_acc: 0.8739 |
|
|
Epoch 97/100 |
|
|
48000/48000 |
[==============================] - 1s 20us/sample - loss: 0.3183 |
- |
acc: 0.8899 - val_loss: 0.3566 - val_acc: 0.8764 Epoch 98/100
10