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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
🧑‍💻 Гайс, всем привет! Заебал я вас уже Z-core стандартизацией, но выбора у вас, увы, нет! Хочу просто показать, чем мы все это время занимались...

📊 Эти гистограммы идеально показывают распределение значений в наших массивах данных. Каждый столбик показывает количество значений, которые попадают в определенный диапазон.

📈 Первый график (исходные данные — raw_data)

▫️Столбец около 0 показывает, сколько значений в raw_data близко к 0.

▫️Столбец около 5 показывает, сколько значений в raw_data близко к 5.

📕Красная пунктирная линия обозначает среднее значение исходных данных.

📉 Второй график (стандартизированные данные — transformed_data):

▫️Столбец около -1 показывает, сколько значений в transformed_data имеют Z-score около -1.

▫️Столбец около 0 показывает, сколько значений в transformed_data близко к среднему значению (0).

▫️Столбец около 1 показывает, сколько значений в transformed_data имеют Z-score около 1.

📙 Оранжевые штриховые линии обозначают ±1 стандартное отклонение от среднего значения.
❤‍🔥2🤓2👨‍💻2👀2👍1
Среднее значение (μ) — это 'главное' значение распределения данных (Это наша красная пунктирная линия).

⚙️ Для стандартизированных данных среднее значение всегда равно 0, так как Z-score преобразование приводит данные к нулевому среднему значению.

📈 Центр гистограммы: ⬇️

⚙️ Среднее значение указывает на центр гистограммы. Если данные симметричны, то большинство значений будут расположены вокруг среднего значения.

📉 Расположение бинов: ⬇️

⚙️ Бины на гистограмме будут расположены относительно среднего значения. Например, у нас есть бин от -1 до 0, он будет находиться слева от среднего значения (0), а бин от 0 до 1 будет находиться справа от среднего значения.
1🥰1🤓1
🧑‍💻 Друзья, привет! Если вы думали, что постов сегодня не будет, то зря, сегодня я вашу голову еще подзаебу!

В прошлом посте, дада, тот, что сверху, мы говорили про Среднее значение и где оно на вот этих гистограммах.

⚙️ Теперь, стандартное отклонение (σ) — это мера рассеяния данных. Оно показывает, насколько сильно значения отличаются от среднего значения.

⚙️ Для стандартизированных данных стандартное отклонение всегда равно 1.

🔗 Стандартное отклонение определяет ширину гистограммы. ‼️Чем больше стандартное отклонение, тем шире будет гистограмма, так как значения будут более рассеяны.
Бины (столбцы на гистограмме, показывающие сколько значений попадает в соответствующий интервал) на гистограмме будут расположены относительно стандартного отклонения. Например, бин от -1 до 0 будет содержать значения, которые находятся в пределах одного стандартного отклонения от среднего значения.
3🤯3🤓3
🟰 П О Д В Е Д Е М И Т О Г И 🟰

Зачем мы это все делали? Вопрос хороший, го попробуем на него ответить:


📊 Разбирали мы Z-score нормализацию, суть была в том, чтобы преобразовать данные таким образом, чтобы они имели среднее значение 0 и стандартное отклонение 1

⚙️ Какие же цели мы преследовали?

‼️ Во первых, это приведение к единому масштабу. Разные признаки могут иметь разные единицы измерения и диапазоны значений. Z-score стандартизация, в свою очередь, приводит все признаки к одному масштабу, что позволяет сравнивать их на равных условиях.

🔗 Во вторых, это улучшение работы алгоритмов машинного обучения, потому что некоторые алгоритмы работают лучше, когда данные находятся в одном масштабе.

🔗 Ну, и в третьих, мы вот запрогали гистограмму и поняли где у нас выбросы. Да даже на обычной линейной регрессии можно явно увидеть выбросы данных.
❤‍🔥3👨‍💻3👍2🤯2🤓2
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