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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
Такие дела, друзья )
❤‍🔥2🥰1
П Е Р В Ы М Д Е Л О М С Ю Д А ➡️➡️➡️

🧑‍💻 К Т О Я ?

⚙️ О Ч Е М Э Т О Т К А Н А Л
🤯1🤓1
🌸🔤🔤 🔤🔤 🔤

🧑‍💻 Бро, привет! ⁉️ Кто я такой? Я — такой же обычный человек, как и ты. Из базовых знаний у меня только Русский язык, но этого будет достаточно). Я люблю учиться, поэтому буду рад с тобой поделиться своими знаниями.

🔗 Этот канал — это, по сути, мои 'улучшенные' заметки. Тут я объясняю материал также, как я объясняю его себе — без лишних заморочек, просто и понятно.

⚙️ Даже если ты вообще ничего не понимаешь в теме, у меня есть удобная
навигация, чтобы ты мог быстро найти нужное и разобраться с любым вопросом. Так что давай, бро, пора сворачивать горы!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🥰2🤓2👨‍💻21111
🙄 Давно думал обновить всю инфу, вдруг добавятся еще подписичники
5
🌸🔤🔤🌷 🔤🔤 🔤🔤🔤🔤🌷

⚙️ Как я уже сказал, этот канал — это мои заметки на стероидах. Я буквально разжевываю все темы, которые сам изучаю и выкладываю здесь, ровно поэтому у тебя не составит труда это понять.

⚙️ Этот канал абсолютно для всех. Тут уже собрана внушительная база по решениям заданий со Stepik'a, общая база по Python, огромные разборы тем по алгоритмам, даже есть разборы задач на C. Короче говоря, соскучиться тебе здесь не дам!
Please open Telegram to view this post
VIEW IN TELEGRAM
❤‍🔥22
🔤🔤🔤🔤🔤🔤🌼

📱 НАКОНЕЦ! Мы победили Z-core стандартизацию и двигаемся дальше. На пути у нас min-max normalization.

⚙️ Важный момент: что предыдущий, что нынешний метод — это методы для приведения данных к общему масштабу. ⁉️ А в чем отличия?

⚙️ Ну, во первых, формулы разные (это потом). Во вторых, Z-core стандартизирует данные и приводит их к одному масштабу (притом среднее значение μ=0, стандартное отклонение σ=1). В то время как min-max normalization нормализирует данные а заданный диапазон (по сути также приводит данные к одному масштабу) обычно диапазон [0, 1] или [-1, 1],
Please open Telegram to view this post
VIEW IN TELEGRAM
2👍1🤯1🤓1👨‍💻1
🔬 Вот так выглядит формула для метода min-max normalization (каждый нормализированный элемент признака будет вычисляться по этой формуле)

▫️X — исходное значение признака.

▫️ X min — минимальное значение признака в выборке.

▫️X max — максимальное значение признака в выборке.

▫️X norm— нормализованное значение признака
.

Формула предполагает собой, что мы будем нормализовать данные в диапазон [0,1].
2❤‍🔥3👍3🥰2🤯1
🤯1🤡1🤓1👀1
Всем даров, начнем воркать и разберем такой код

⚙️ Разберем такой код:

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 в контексте машинного обучения — это процесс изменения формы массива без изменения его содержимого. Основная идея состоит в том, чтобы изменить многомерный массив в другую форму, сохраняя при этом общее количество элементов.


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