CodeLab
145 subscribers
538 photos
20 videos
159 links
Говорим просто о сложном

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
⚙️ Еще один код для понимания того, как происходит нормализация:

⁉️ Кстати, мы применили reshape(-1, 1), что это вообще такое? В нашем случае мы применяем reshape(-1, 1), потому что на вход ожидается двумерный массив.

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


raw_data = np.array([1., 3., 2., 4., 2., 10., 2., 5., 2., 2., 1., 7., 5., 2., 5., 16., 10., 3., 24.], dtype=np.float32) #датасет привычный

print('Исходный датасет: %s' % raw_data)

from sklearn.preprocessing import MinMaxScaler

transformed_data = MinMaxScaler().fit_transform(raw_data.reshape(-1, 1))

transformed_data


🔗 Вот еще пример:

⚙️ Здесь мы преобразуем одномерный массив в двумерный:


import numpy as np

arr = np.array([1, 2, 3, 4, 5, 6])
reshaped_arr = arr.reshape(2, 3)

print(reeshaped_arr)
🤯3👍1🥰1👨‍💻1👀1
❤‍🔥1🤯1🤓1
П И Ш Е М К О Д

🧑‍💻⚙️ Нам нужно будет построить модель, вычислить метрику качества (MSE) для исходных, нормализованных и стандартизованных данных. Выполнить (Min-Max Scaling и Z-core), затем снова вычислить метрику качества и, если она выросла — применить найденную трансформацию ко входным данным перед тем, как подавать а вход модели.
❤‍🔥2🤯1
0️⃣ Импортируем базовые библиотеки:

▫️numpy — для генерации данных

▫️matplotlib.pyplot — визуал

▫️sklearn.preprocessing (MinMaxScaler, StandardScaler) — для нормализации (в диапазон [0, 1]) и стандартизации (Z-core normalization, среднее — 0, стандартное отклонение — 1) , соответственно

▫️LinearRegression — модель линейной регрессии из sklearn.linear_model

▫️MSE — среднеквадратичная ошибка из sklearn.metrics

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
2🤯1
⚙️1️⃣ Дальше идет такая поебень, с которой я сидел щас разбирался:

np.random.seed(42)
X = 2 * np.random.randn(100, 1) + 3
y = 4 + 3 * X + np.random.randn(100, 1)


⁉️ Что тут происходит?

Разберем первую строчку 🟰np.random.seed(30)🟰 — выражение означает, что генератор случайных чисел запускается и генерирует ту же последовательность чисел, что и раньше.

⁉️ Почему 30 в скобках? — Да в целом без разницы, что там в скобках, хоть 1 поставьте. Число в скобках это стартовый ключ генератора, то есть, мы задаем начало последовательности и при повторном запуске числа будут идентичны.

⚙️ Идем дальше, строка — 🟰X = 2 * np.random.randn(100, 1) + 3🟰. Мы создаем массив из 100 элементов (матрица 100 × 1). Каждый элемент базировано распределен по стандартному распределению (среднее значение 0 и стандартное отклонение 1). 👨‍💻 Но, как вы видите, мы сначала умножаем на 2 (это стандартное отклонение), а затем, к каждому элементу прибавляем 3 — это смещает среднее значение распределения до 3, при этом сохраняя стандартное отклонение равным 2.

⚙️ Последняя строка —🟰 y = 4 + 3 * X + np.random.randn(100, 1)🟰 ‼️ Вот тут важный момент — мы умножаем каждый элемент вектора X на 3 и тут создается линейная зависимость между X и y. Также прибавляем 4 (сдвиг всех значений вверх на 4 единицы). В конце добавляем шум (просто случайное отклонение)
1👍1🤯1
👍21🤯1
2️⃣ Друзья, добрый день! Воркаем дальше:

⚙️ Мы вчера написали и разобрали несколько строчек:

np.random.seed(42)
X = 2 * np.random.randn(100, 1) + 3
y = 4 + 3 * X + np.random.randn(100, 1)


⚙️ Теперь выведем, что получается:

print('Исходный датасет X: %s' % X[:5].flatten()) # первые 5 элементов массива X, преобразованные в одномерный массив
print('Целевая переменная y: %s' % y[:5].reshape(-1, 1)) # первые 5 элементов массива y, преобразованные в двумерный массив (столбец)


🔗 Пару моментов:

⁉️ Что делает flatten?

▫️Исходный массив: [[1, 2, 3], [4, 5, 6]] (форма (2, 3)) (массив просто рандомный, к нашему это не относится). После применения функции flatten массив будет [1, 2, 3, 4, 5, 6] (форма (6,))

▫️Я специально написал сначала flatten, потом reshape для понимания.

Flatten: Автоматически преобразует данные в одномерный вектор.

Reshape: Позволяет задать любую форму, но требует указания размеров.


import numpy as np

data = np.array([[1, 2, 3], [4, 5, 6]])

flattened = data.flatten() # [1, 2, 3, 4, 5, 6]

reshaped = data.reshape(6) # [1, 2, 3, 4, 5, 6]


▫️А что касаемо нашего вывода (первые строки в начале поста):

Исходный датасет X: [0.47189467 6.0558107  1.05857812 3.94111923 2.79860657]
Целевая переменная y: [[ 5.87071292]
[21.7874835 ]
[ 7.96166193]
[15.56482486]
[13.32796767]]


⁉️⚙️ Что такое %s? Дак вот, оно заменяет местро в строке на строковое значение типа string. Вот возьмем наш случай: у нас %s подставляет значение переменной в строку.

print('Исходный датасет X: %s' % X[:5].flatten()) 
print('Целевая переменная y: %s' % y[:5].reshape(-1, 1))
1❤‍🔥1
⚙️ Дальше база: обучаем модель и вычисляем метрику качества (MSE) для исходных данных и y:

model = LinearRegression()

model.fit(X, y)
y_pred = model.predict(X)

mse = mean_squared_error(y, y_pred)
print('MSE для исходных данных: %.4f' %mse)


🔗 Вывод метрики качества MSE:

MSE для исходных данных: 0.9591


⁉️🔗 Что такое %.4f? Заменяет %.4f на значение переменной, округленное до 4 знаков после запятой.Вот пример:

name = "knownasgod"
age = 21
print("Имя: %s, Возраст: %d" % (name, age))

#Вывод: Имя: knownasgod, Возраст: 21
❤‍🔥22🤯2
⚙️ Дальше применим Z-core стандартизацию к исходным данным:

scaler_zcore = StandardScaler() #Тут создаем объект
X_zcore = scaler_zcore.fit_transform(X) # тут обучаем и трансформируем данные X


⚙️ Обучаем модель линейной регрессии на стандартизированных данных:

model_zcore = LinearRegression() # Создаем объект линейной регресии
model_zcore.fit(X, y) # обучаем модель на стандартизированных данных и y
y_pred_zcore = model_zcore.predict(X_zcore) # Затем предсказываем


⚙️ Вычисляем метрику качества для стандартизированных данных:

mse_zcore = mean_squared_error(y, y_pred_zcore)
print('MSE для стандартизованных данных (Z-core): %.4f' % mse_zcore)
❤‍🔥2👍1🤓1
⚙️ Применяем MinMaxScaling:

scaler_minmax = MinMaxScaler()
X_minmax = scaler_minmax.fit_transform(X)


⚙️ Обучаем модель:

model_minmax = LinearRegression()
model_minmax.fit(X_minmax, y)
y_pred_minmax = model_minmax.predict(X_minmax)


⚙️ Вычисляем метрику качества для нормализованных данных:

mse_minmax = mean_squared_error(y, y_pred_minmax)
print('MSE для нормализованных данных (Min-Max Scaling): %.4f' %mse_minmax)
1❤‍🔥1
CodeLab
П И Ш Е М К О Д 🧑‍💻⚙️ Нам нужно будет построить модель, вычислить метрику качества (MSE) для исходных, нормализованных и стандартизованных данных. Выполнить (Min-Max Scaling и Z-core), затем снова вычислить метрику качества и, если она выросла — применить…
⚙️ Теперь, как уже писалось вот здесь, нам нужно сравнить метрики качества для двух трансформаций данных.

if mse_minmax < mse:
print('Метрика качества улучшилась после Min-Max Scaling.')
else:
print('Метрика качества не улучшилась после Min-Max Scaling.')
if mse_zcore < mse:
print('Метрика качества улучшилось после Z-core (Standardization).')
else:
print('Метрика качества не улучшилось после Z-core (Standardization).')


⚙️ Дальше идет визуализация графиков один графиков для исходных данных с линейной регрессией, второй для нормализованных данных с линейной регрессией, третий для стандартизованных данных с линейной регрессией):

plt.figure(figsize=(18, 6))

plt.subplot(1, 3, 1)
plt.scatter(X, y, color='blue', label='Исходные данные')
plt.plot(X, y_pred, color='red', label='Линейная регрессия (исходные данные)')
plt.title('Исходные данные и линейная регрессия')
plt.xlabel('X')
plt.ylabel('y')
plt.grid(True)
plt.legend()

# Нормализованные данные (Min-Max Scaling) и линейная регрессия
plt.subplot(1, 3, 2)
plt.scatter(X_minmax, y, color='green', label='Нормализованные данные (Min-Max Scaling)')
plt.plot(X_minmax, y_pred_minmax, color='orange', label='Линейная регрессия (Min-Max Scaling)')
plt.title('Нормализованные данные (Min-Max Scaling) и линейная регрессия')
plt.xlabel('X (нормализованный)')
plt.ylabel('y')
plt.grid(True)
plt.legend()

# Стандартизованные данные (Z-core) и линейная регрессия
plt.subplot(1, 3, 3)
plt.scatter(X_zcore, y, color='purple', label='Стандартизованные данные (Z-core)')
plt.plot(X_zcore, y_pred_zcore, color='magenta', label='Линейная регрессия (Z-core)')
plt.title('Стандартизованные данные (Z-core) и линейная регрессия')
plt.xlabel('X (стандартизованный)')
plt.ylabel('y')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()


⚙️ Вывод:

Исходный датасет X: [0.47189467 6.0558107  1.05857812 3.94111923 2.79860657]
Целевая переменная y: [[ 5.87071292]
[21.7874835 ]
[ 7.96166193]
[15.56482486]
[13.32796767]]
MSE для исходных данных: 0.9591
MSE для стандартизированных данных (Min-Max Scaling): 0.9591
MSE для нормализованных данных (Min-Max Scaling): 0.9591
Метрика качества улучшилась после Min-Max Scaling.
Метрика качества не улучшилось после Z-core (Standardization).
3
⚙️ Полный код:

import numpy as np
from matplotlib import pyplot as plt
from sklearn.preprocessing import MinMaxScaler, StandardScaler
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

np.random.seed(30)
X = 2 * np.random.randn(100, 1) + 3 # Признак X (нормальное распределение со средним 3 и стандартным отклонением 2)
y = 4 + 3 * X + np.random.randn(100, 1) # Целевая переменная y с шумом

print('Исходный датасет X: %s' % X[:5].flatten())
print('Целевая переменная y: %s' % y[:5].reshape(-1, 1))

model = LinearRegression()
model.fit(X, y)
y_pred = model.predict(X)

mse = mean_squared_error(y, y_pred)
print('MSE для исходных данных: %.4f' % mse)

# Применяем Z-core (Standardization)
scaler_zcore = StandardScaler()
X_zcore = scaler_zcore.fit_transform(X)

# Построение модели на стандартизованных данных (Z-core)
model_zcore = LinearRegression()
model_zcore.fit(X_zcore, y)
y_pred_zcore = model_zcore.predict(X_zcore)

# Вычисление метрики качества (MSE) для стандартизованных данных (Z-core)
mse_zcore = mean_squared_error(y, y_pred_zcore)
print('MSE для стандартизованных данных (Z-core): %.4f' % mse_zcore)

# Применяем MinMaxScaling
scaler_minmax = MinMaxScaler()
X_minmax = scaler_minmax.fit_transform(X)

# Построение модели на нормализованных данных (Min-Max Scaling)
model_minmax = LinearRegression()
model_minmax.fit(X_minmax, y)
y_pred_minmax = model_minmax.predict(X_minmax)

# Вычисление метрики качества (MSE) для нормализованных данных (Min-Max Scaling)
mse_minmax = mean_squared_error(y, y_pred_minmax)
print('MSE для нормализованных данных (Min-Max Scaling): %.4f' % mse_minmax)

if mse_minmax < mse:
print('Метрика качества улучшилась после Min-Max Scaling.')
else:
print('Метрика качества не улучшилась после Min-Max Scaling.')

if mse_zcore < mse:
print('Метрика качества улучшилось после Z-core (Standardization).')
else:
print('Метрика качества не улучшилось после Z-core (Standardization).')

plt.figure(figsize=(18, 6))

plt.subplot(1, 3, 1)
plt.scatter(X, y, color='blue', label='Исходные данные')
plt.plot(X, y_pred, color='red', label='Линейная регрессия (исходные данные)')
plt.title('Исходные данные и линейная регрессия')
plt.xlabel('X')
plt.ylabel('y')
plt.grid(True)
plt.legend()

plt.subplot(1, 3, 2)
plt.scatter(X_minmax, y, color='green', label='Нормализованные данные (Min-Max Scaling)')
plt.plot(X_minmax, y_pred_minmax, color='orange', label='Линейная регрессия (Min-Max Scaling)')
plt.title('Нормализованные данные (Min-Max Scaling) и линейная регрессия')
plt.xlabel('X (нормализованный)')
plt.ylabel('y')
plt.grid(True)
plt.legend()

plt.subplot(1, 3, 3)
plt.scatter(X_zcore, y, color='purple', label='Стандартизованные данные (Z-core)')
plt.plot(X_zcore, y_pred_zcore, color='magenta', label='Линейная регрессия (Z-core)')
plt.title('Стандартизованные данные (Z-core) и линейная регрессия')
plt.xlabel('X (стандартизованный)')
plt.ylabel('y')
plt.grid(True)
plt.legend()

plt.tight_layout()
plt.show()
❤‍🔥21👍1
🖕
👍32🤯1🤡1
На практике гораздо
чаще применяются средняя абсолютная погрешность и средняя квадратиче-
ская погрешность
. Они определяются аналогичным образом (тут речь про абсолютные и квадратические погрешности ), за исключени-
ем того, что вместо сумм мы вычисляем средние значения. Таким образом,
средняя абсолютная погрешность — это среднее значение вертикальных
расстояний от точек до прямой, а средняя квадратическая погрешность — это
среднее значение квадратов этих же расстояний.
2
🧑‍💻📈 Выполняем задание Тайлера Дердена: у нас даны точки x и значения в этих точках y. Нужно нормализовать y с помощью z-core и построить график зависимости нормализованных значений от x (для построения графика нужно использовать plt.scatter(x, y_transformed)).

🔗 Импортируем нашу базу (блок кода ниже — это наше ДАНО):

import numpy as np
from matplotlib import pyplot as plt
from sklearn.preprocessing import StadardScaler

x = np.linspace(1, 10, num = 10)
y = np.array(
[1., 3., 4., 2., 10., 5., 5., 2., 5., 10.]
)


🔗 Так ну че тут, создаем массив из 10 значений от 1 до 10. ‼️ Тут важный момент есть, ведь третьим аргументов мы указываем num = 10, что означает, что на интервале от 1 до 10 будет создано 10 точек. Если мы третий аргумент не ставим (он не обязательный кстати), то значений будет 50 (по умолчанию так).
❤‍🔥2🥰1
⚙️ Дальше мы все знаем, ребята мы не глупые, создаем объект нормализации (Z-core стандартизации):

scaler = StandardScaler()

y_transformed = scaler.fit_transform(y.reshape(-1, 1)).reshape(-1)


‼️ Кстати, интересный момент: в конце второй строки сверху пишем в конце reshape(-1). Первый reshape нам нужен в связи с тем, что нам нужен двумерный массив (так требует StandardScaler). ⁉️ Воот, а зачем нам второй reshape?

-1 означает, что NumPy сам определит размерность по этой оси на основе данных и указанного размера по другой оси (в данном случае — 1).


🔗 Вот так будет выглядеть вывод, если в конце не ставить reshape(-1)

y_transformed = scaler.fit_transform(y.reshape(-1, 1))

#Вывод:
array([[-1.24656167],
[-0.57274455],
[-0.23583599],
[-0.90965311],
[ 1.78561537],
[ 0.10107257],
[ 0.10107257],
[-0.90965311],
[ 0.10107257],
[ 1.78561537]])


⁉️ Отвечаю на вопрос, зачем нам 'второй' reshape(-1): После того как мы преобразовали одномерный массив в двумерный, мы делаем обратное дейтсвие (чтобы мы могли строить график).

Также вместо reshape(-1) мы можем использовать flatten()


📈 Остается построить график и готово:

plt.figure(figsize=(8, 6))
plt.scatter(x, y_transformed, color='blue', label='Нормализованные данные')
plt.title('График зависимости нормализованных значений от x')
plt.xlabel('x')
plt.ylabel('y (нормализованный)')
plt.grid(True)
plt.legend()
plt.show()
❤‍🔥1🥰1
🧑‍💻 Всем здарова, пишу на ночь глядя, но ничего, хотя бы начнем!

Мы не раз еще будем возвращаться к Линейной регрессии, но пора бы пойти дальше:

П О Л И Н О М И А Л Ь Н А Я Р Е Г Р Е С С И Я
2🤯2🤓1
🧑‍💻 Всем здарова, начинаем воркать!

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


⚙️ Для начала, попробуем тривиальное преобразование y = x, затем x² и x³. После преобразований, нарисуем график, представляющий собой сумму 0.1x + 2.5x² + 0.5x³ — сложим функции с разными коэффициентами, за работу!

from matplotlib import pyplot as plt
import numpy as np

x =np.linspace(-10, 10, num = 100)

y = x

plt.plot(x, y)
plt.show()


Получили тривиальную зависимость y = x

⚙️ Тривиальное преобразование y = x — это простейшая форма зависимости, где значение y напрямую равно значению x
🥰2👍1🤯1👨‍💻1
📈 Теперь парабола — это вторая степень (или квадратичная зависимость)

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(-10, 10, num = 100)

y = x * x
plt.plot(x, y)
plt.show()


⚙️ Как вы заметили, y здесь не используется, можно его добавить и код будет выглядеть так:

from matplotlib import pyplot as plt
import numpy as np

x = np.linspace(-10, 10, num=100)

y = x * x x^2

plt.plot(x, y)
plt.show()
🥰2❤‍🔥1👍1🤯1🤓1