🔬 Вот так выглядит формула для метода min-max normalization (каждый нормализированный элемент признака будет вычисляться по этой формуле)
▫️X — исходное значение признака.
▫️ X min — минимальное значение признака в выборке.
▫️X max — максимальное значение признака в выборке.
▫️X norm— нормализованное значение признака.
▫️X — исходное значение признака.
▫️ X min — минимальное значение признака в выборке.
▫️X max — максимальное значение признака в выборке.
▫️X norm— нормализованное значение признака.
Формула предполагает собой, что мы будем нормализовать данные в диапазон [0,1].
2❤🔥3👍3🥰2🤯1
Всем даров, начнем воркать и разберем такой код
⚙️ Разберем такой код:
🔗 Для начала, импортируем привычные нам библиотеки а также модуль MinMaxScaler()
⚙️ По итогу, мы применяем MinMaxScaler нормализацию и обучаем модель на этих данных.
⚙️ Вывод:
⚙️ Разберем такой код:
from sklearn.preprocessing import MinMaxScaler
import numpy as np
🔗 Для начала, импортируем привычные нам библиотеки а также модуль MinMaxScaler()
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[:8])
transformed_data = MinMaxScaler().fit_transform(raw_data.reshape(-1, 1)).reshape(-1) # Обучаем модель + нормализуем данные
print('MIN-MAX scale датасет: %s' % transformed_data[:8])
⚙️ По итогу, мы применяем MinMaxScaler нормализацию и обучаем модель на этих данных.
⚙️ Вывод:
Сырой датасет: [ 1. 3. 2. 4. 2. 10. 2. 5.]
MIN-MAX scale датасет: [0. 0.08695652 0.04347826 0.13043478 0.04347826 0.39130437
0.04347826 0.17391305]
👍2🤯1🤓1👨💻1
⚙️ Еще один код для понимания того, как происходит нормализация:
⁉️ Кстати, мы применили reshape(-1, 1), что это вообще такое? В нашем случае мы применяем reshape(-1, 1), потому что на вход ожидается двумерный массив.
🔗 Вот еще пример:
⚙️ Здесь мы преобразуем одномерный массив в двумерный:
⁉️ Кстати, мы применили 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
П И Ш Е М К О Д
🧑💻⚙️ Нам нужно будет построить модель, вычислить метрику качества (MSE) для исходных, нормализованных и стандартизованных данных. Выполнить (Min-Max Scaling и Z-core), затем снова вычислить метрику качества и, если она выросла — применить найденную трансформацию ко входным данным перед тем, как подавать а вход модели.
🧑💻⚙️ Нам нужно будет построить модель, вычислить метрику качества (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
▫️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️⃣ Дальше идет такая поебень, с которой я сидел щас разбирался:
⁉️ Что тут происходит?
Разберем первую строчку 🟰
⁉️ Почему 30 в скобках? — Да в целом без разницы, что там в скобках, хоть 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
2️⃣ Друзья, добрый день! Воркаем дальше:
⚙️ Мы вчера написали и разобрали несколько строчек:
⚙️ Теперь выведем, что получается:
🔗 Пару моментов:
⁉️ Что делает flatten?
▫️Исходный массив: [[1, 2, 3], [4, 5, 6]] (форма (2, 3)) (массив просто рандомный, к нашему это не относится). После применения функции flatten массив будет [1, 2, 3, 4, 5, 6] (форма (6,))
▫️Я специально написал сначала flatten, потом reshape для понимания.
▫️А что касаемо нашего вывода (первые строки в начале поста):
⁉️⚙️ Что такое %s? Дак вот, оно заменяет местро в строке на строковое значение типа string. Вот возьмем наш случай: у нас %s подставляет значение переменной в строку.
⚙️ Мы вчера написали и разобрали несколько строчек:
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:
🔗 Вывод метрики качества MSE:
⁉️🔗 Что такое %.4f? Заменяет %.4f на значение переменной, округленное до 4 знаков после запятой.Вот пример:
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
❤🔥2❤2🤯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).
Telegram
CodeLab
П И Ш Е М К О Д
🧑💻⚙️ Нам нужно будет построить модель, вычислить метрику качества (MSE) для исходных, нормализованных и стандартизованных данных. Выполнить (Min-Max Scaling и Z-core), затем снова вычислить метрику качества и, если она выросла — применить…
🧑💻⚙️ Нам нужно будет построить модель, вычислить метрику качества (MSE) для исходных, нормализованных и стандартизованных данных. Выполнить (Min-Max Scaling и Z-core), затем снова вычислить метрику качества и, если она выросла — применить…
❤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()
❤🔥2❤1👍1
На практике гораздо
чаще применяются средняя абсолютная погрешность и средняя квадратиче-
ская погрешность. Они определяются аналогичным образом (тут речь про абсолютные и квадратические погрешности ), за исключени-
ем того, что вместо сумм мы вычисляем средние значения. Таким образом,
средняя абсолютная погрешность — это среднее значение вертикальных
расстояний от точек до прямой, а средняя квадратическая погрешность — это
среднее значение квадратов этих же расстояний.
❤2
🧑💻📈 Выполняем задание Тайлера Дердена: у нас даны точки x и значения в этих точках y. Нужно нормализовать y с помощью z-core и построить график зависимости нормализованных значений от x (для построения графика нужно использовать plt.scatter(x, y_transformed)).
🔗 Импортируем нашу базу (блок кода ниже — это наше ДАНО):
🔗 Так ну че тут, создаем массив из 10 значений от 1 до 10. ‼️ Тут важный момент есть, ведь третьим аргументов мы указываем num = 10, что означает, что на интервале от 1 до 10 будет создано 10 точек. Если мы третий аргумент не ставим (он не обязательный кстати), то значений будет 50 (по умолчанию так).
🔗 Импортируем нашу базу (блок кода ниже — это наше ДАНО):
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 стандартизации):
‼️ Кстати, интересный момент: в конце второй строки сверху пишем в конце reshape(-1). Первый reshape нам нужен в связи с тем, что нам нужен двумерный массив (так требует StandardScaler). ⁉️ Воот, а зачем нам второй reshape?
🔗 Вот так будет выглядеть вывод, если в конце не ставить reshape(-1)
⁉️ Отвечаю на вопрос, зачем нам 'второй' reshape(-1): После того как мы преобразовали одномерный массив в двумерный, мы делаем обратное дейтсвие (чтобы мы могли строить график).
📈 Остается построить график и готово:
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