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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
Завтра будет крутецкий пост, ждите 💤
Please open Telegram to view this post
VIEW IN TELEGRAM
211
🔵Регрессия — важная часть машинного обучения. Она состоит из обучения алгоритма с помеченными данными и его использования для прогнозирования будущих (немаркированных) данных.

🔵Помеченные данные — это данные, поставляемые с метками, которые
в случае регрессии являются числами. Например, числа могут быть ценами на дома.

🔵В наборе данных признаки — это свойства, которые мы используем для прогнозирования метки. Так, если мы хотим спрогнозировать цены на
жилье, характеристики — это все, что описывает дом и что может определить цену, например размер, количество комнат, качество ближайшей школы, уровень преступности в районе, возраст дома и расстояние до шоссе.

🔵Метод линейной регрессии для прогнозирования состоит в присвоении веса каждому из признаков и суммировании весов, умноженных на соответствующие признаки, плюс смещение.

🔵 Графически можно представить алгоритм линейной регрессии как попытку провести прямую как можно ближе к набору точек.

🔵Работа алгоритма линейной регрессии заключается в том, что он начинает со случайной прямой, а затем медленно приближает ее к каждой из неправильно классифицированных точек, пытаясь классифицировать
их правильно

🔵 Полиномиальная регрессия — это общий случай линейной регрессии, в которой для моделирования данных мы используем кривые вместо прямых. Это особенно полезно, когда набор данных нелинейный.

🔵 Регрессия имеет множество применений, включая системы рекомендаций, электронную коммерцию и здравоохранение
Please open Telegram to view this post
VIEW IN TELEGRAM
321
Всем доброй ночи!

👨‍💻 Это все можно рассчитать с помощью пары формул, но мы делаем с помощью кода:

0⃣🗂 Библиотеки:

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd


1⃣📊 Теперь наши данные, сделаем их в виде словаря:

data = {
'Дом': [1, 2, 3, 4, 5],
'Размер (s)': [100, 200, 250, 325],
'Вознаграждение (r)': [200, 475, 400, 520, 735]
}


2⃣🤯 Pandas мы импортировали не зря, преобразуем наш словарь в таблицу данных:

df = pd.DataFrame(data)


3⃣📊 Формула для прогноза цены у нас есть, сделаем ее в виде функции:

def predict_price(size):
return 2 * size + 50


4⃣⚙️ Генерим предсказания:

df['Прогноз (p)'] = df['Размер (s)'].apply(predict_price)


🧑‍💻 Итак, тут поподробнее: берем df['Размер (s)'], эта часть строки выбирает столбец 'Размер (s)' из DataFrame df, который содержит информацию о размере каждого дома.

🧑‍💻 Другая часть строки — .apply(predict_price) применяет функцию predict_price к каждому значению в столбце 'Размер (s)'. Функция predict_price вычисляет прогнозируемую цену дома на основе формулы из условия.

🧑‍💻 df['Прогноз (p)'] = ... : Создает новый столбец 'Прогноз (p)' в DataFrame df и заполняет его значениями, полученными от применения функции predict_price

🧑‍💻 Если совсем просто, то мы создали новую переменную для прогнозов и теперь она в нашей таблице df DataFrame

5⃣🛍 Вычисляем MAE (средняя абсолютная)

mae = np.mean(np.abs(df['Вознаграждение (r)'] - df['Прогноз (p)']))

print(f"Средняя абсолютная погрешность (MAE): {mae}")


6⃣📇 MSE (средняя квадратичная)

mse = np.mean((df['Вознаграждение (r)'] - df['Прогноз (p)']) ** 2)

print(f"Средняя квадратическая погрешность (MSE): {mse}")


7⃣🧑‍💻 Остается визуал:

plt.figure(figsize=(10, 6))
plt.plot(df['Дом'], df['Вознаграждение (r)'], label='Фактические значения', marker='o')
plt.plot(df['Дом'], df['Прогноз (p)'], label='Прогнозы', marker='x')
plt.xlabel('Дом')
plt.ylabel('Цена')
plt.title('Фактические и прогнозируемые цены домов')
plt.legend()
plt.grid(True)
plt.show()


⚙️ Весь код:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

data = {
'Дом': [1, 2, 3, 4, 5],
'Размер (s)': [100, 200, 200, 250, 325],
'Вознаграждение (r)': [200, 475, 400, 520, 735]
}

df = pd.DataFrame(data)

def predict_price(size):
return 2 * size + 50

df['Прогноз (p)'] = df['Размер (s)'].apply(predict_price)

df['Прогноз (p)'] = df['Размер (s)'].apply(predict_price)

#MAE
mae = np.mean(np.abs(df['Вознаграждение (r)'] - df['Прогноз (p)']))
print(f"Средняя абсолютная погрешность (MAE): {mae}")

#MSE
mse = np.mean((df['Вознаграждение (r)'] - df['Прогноз (p)']) ** 2)
print(f"Средняя квадратическая погрешность (MSE): {mse}")

plt.figure(figsize=(10, 6))
plt.plot(df['Дом'], df['Вознаграждение (r)'], label='Фактические значения', marker='o')
plt.plot(df['Дом'], df['Прогноз (p)'], label='Прогнозы', marker='x')
plt.xlabel('Дом')
plt.ylabel('Цена')
plt.title('Фактические и прогнозируемые цены домов')
plt.legend()
plt.grid(True)
plt.show()

print(df)


*⃣ Вывод:

🧑‍💻 Средняя абсолютная погрешность (MAE): 38.0

🧑‍💻 Средняя квадратическая погрешность (MSE): 1550.0
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
4331
6421
Ждите крутой пост, уже работаю над этим 👨‍💻⬆️
Please open Telegram to view this post
VIEW IN TELEGRAM
522
📱 Функции случайных чисел в NumPy

np.random.rand() ➡️ Рандом от 0 до 1 (равномерное)
np.random.randn()
➡️ Нормальное распределение (среднее 0)
np.random.randint(a, b)
➡️ Целое число от a до b (не включая b)
np.random.uniform(a, b)
➡️ Вещественное число от a до b
Please open Telegram to view this post
VIEW IN TELEGRAM
611
🔤🔤🌹🌷 1️⃣

👨‍💻Всем ку, я как то упоминал про градиентный спуск когда мы писали нейронку, но тема очень важная и раскрыть ее за пару строчек не получится. Поэтому будем говорить про градиентный спуск.

0⃣ В чем суть

📈 Рассмотрим на линейной регрессии, ее суть, как вы помните — это предсказания. Естественно, она будет ошибаться (особенно в начале), как раз для этого придумали
🪷0️⃣🔤🔤🔤 🔤🔤🔤🔤🌷🔤🔤🔤 (или ФУНКЦИЮ ПОТЕРЬ) — она покажет насколько наши данные далеки от предсказания (проще говоря, насколько сильно мы ошиблись)

⚙️ Цель градиентного спуска — найти такие параметры (веса модели), чтобы эта ошибка была минимальной (свести ошибку к нулю).

🧠 Представьте, что вы находитесь на вершине горы (наша гора — эта функция потерь), а нам нужно спуститься в низину этой горы, вот низина — это место, где ошибка 0 (или близко к нему), ошибка минимальна. спрыгнуть мы туда не можем, поэтому надо аккуратно спускаться. Маленькими шагами мы спускаемся по горе вниз — это и есть градиентный спуск


1⃣ Как собственно он работает

📱 θ = θ − α ⋅ ∇ J (θ) — для самых любознательных, формула градиентного спуска

📊 Итак, будем проще: θ вот эта штука в начале (называется 'тета') это вектор параметров модели (например, веса в линейной регрессии или нейросети)

🔵 Если вы не поняли зачем она нужна, вспомним формулу линейной регрессии, θ (тета) будет играть следующую роль:

🟰y = θ₁ * x + θ₀🟰 — это тоже самое что и 🟰y = w * x + b,🟰, просто другая запись). ‼️ Важно знать одно — θ это искомые параметры модели, которые мы изначально не знаем, мы их будем инициализировать (создавать случайные числа) и затем их оптимизировать с помощью градиентного спуска. Бинго! Вы теперь знаете как работает градиентный спуск‼️

🧑‍💻 Возвращаемся к формуле: θ = θ − α ⋅ ∇ J (θ, тету (θ) мы выяснили, что насчет других букАв

🔵α — learning rate (скорость обучения), число типа 0.01 или 0.001

🔵∇ J (θ) — градиент функции потерь по параметрам, т.е. насколько сильно и в каком направлении нужно менять веса, чтобы ошибка уменьшилась

🔵 J(θ) — сама функция потерь (например, MSE — среднеквадратичная ошибка), формулу я вам такую не вставлю, можете погуглить формулу MSE, но там ниче сложного нет. ‼️ Можете смотреть на формулу и читать, что я сейчас пишу:

🛍 MSE — средняя ошибка, средней она называется не просто так по приколу. Суть формулы в том, что мы из настоящих значений (y_true) будем вычитать предсказанные (y_pred), то, что мы получили возводим в квадрат и получаем значение, которое показывает, насколько мы ошиблись, (y_true - y_pred)² вот как раз то, о чем я и говорил. 📊 Складываем ошибки всех примеров и делим на количество ошибок.

🔜 "Насколько в среднем сильно модель промахивается",
и причём большие ошибки штрафуются сильнее, потому что возводим в квадрат.


🧑‍💻 Возвращаемся к J(θ) — она нам и покажет, насколько мы ошиблись. Теперь, самое главное поскольку это функция потерь, нам нужно ее минимизировать. ‼️ Только давайте вместо θ подставим w (нам так тупо будет привычнее).

📊 Допустим, у нас есть простая модель:

🟰 y_pred = w * x 🟰

🗂 Тогда, функция потерь MSE (наши цель как раз таки минимизировать ее) будет следующей:

🟰 J(w) = (y − w * x)² 🟰

📊 Теперь считаем градиент (или производную) по w:

🟰 dJ / dw = −2x * (y − wx) 🟰

📂 Производную посчитали, теперь обновляем веса, вот тут и пригодится формула θ = θ − α ⋅ ∇ J (θ), которую разобрали в начале. Эта формула ничто иное как w = w − α * dJ / dw, теперь подставляем:

🟰 w = w − α * ( − 2x (y − wx)) или w = w + 2αx (y − wx) 🟰

‼️ Вот и вся суть, будет у нас ошибка 0.8, а нам хочется поближе к 0, берем, считаем производную и обновляем веса.

🛍 На днях сделаю продолжение, разберем досконально код, чтобы невозможно было не понять.
Please open Telegram to view this post
VIEW IN TELEGRAM
4321
👨‍💻⚙️ Изменил визуал к Навигации и еще к двум другим постам в закрепе, чекайте
Please open Telegram to view this post
VIEW IN TELEGRAM
4221
Вы хоть немного понимаете о чем я вам говорю?
Anonymous Poll
47%
Да 🧑‍💻
29%
Нет 💀
24%
Да(нет) 🤝
4
🧑‍💻🧑‍💻 Сегодня пост
Please open Telegram to view this post
VIEW IN TELEGRAM
5211
📱 Не забывайте советовать друзьям этот канал, контент должен пойти в массы
Please open Telegram to view this post
VIEW IN TELEGRAM
531
🔤🔤🌹🌷 2️⃣

👨‍💻 Итак, друзья добрый вечер! Вот здесь мы начали разбирать Градиентный спуск, пост получился очень насыщенным, поэтому за 1 частью бегом туда ⬆️

0⃣🗂 Импортируем библиотеки (базово):

import numpy as np
import matplotlib.pyplot as plt


1⃣📇 Дальше сгенерим данные:

np.random.seed(42) # фиксируем "случайность", чтобы каждый раз при запуске были одинаковые данные
x = 2 * np.random.randn(100, 1) + 3
y = 4 + 3 * x + np.random.randn(100, 1)


2⃣📊 Инициализируем веса, задаем скорость обучения и количество эпох (это итерации обучения нашей модельки):

w = np.random.randn()
b = np.random.randn()


📊 Что касаемо скорости обучения? Хороший вопрос, скорость мы выставили небольшую — всего 0.01. Я вам кину в комменты картиночку, а пока что объясню:

⚙️ Помните я говорил про сравнение с вершиной горы? Дак вот, представьте, что гора максимально ровная и гладкая, если мы захотим спуститься, проблем не возникнет, одна низшая точка и будет глобальным минимумом. С какой бы точки горы мы не спустились, мы спустились бы к этому глобальному минимуму. Все что я сейчас сказал относится к
🔤🔤🔤🔤🌼 🔤🔤🔤🔤🌷🔤🔤🔤 выпуклой функции, (пример — MSE и другие несложные модели)

Что же насчет невыпуклой функции?
🔤🔤🔤🔤🔤🔤🔤🔤🔤🌼 🔤🔤🔤🔤🌷🔤🔤🔤🔤Берем тот же пример с горой. На этот раз гора имеет холмы, ямы, долины и другие штуки, которые нам будут мешать спуститься. Ладно еще мы, прикиньте наша модель попадает в какой нибудь локальный минимум и наивно думает, что функция потерь минимальная) 🔜 Как вы уже поняли, невыпуклая функция в градиентном спуске это чисто для нейронок и всяких сложных прелестей ML. Для таких сложных моделей классического градиентного спуска не хватит, придется углубляться.

lr = 0.01
epochs = 1000


3⃣📊 Итак, куда-то нужно сохранять ошибки:

loss_history = []


4⃣📂 Теперь главный цикл, здесь будем обучать модель:

for epoch in range(epochs):
y_pred = w * x + b
loss = ((y - y_pred) ** 2).mean()
loss_history.append(loss)


🧠 Разберем построчно:

🧑‍💻 Каждая итерация этого цикла — это одна эпоха. Проходим всем данным, делаем предсказания, считаем ошибку и корректируем параметры.

for epoch in range(epochs):


🧑‍💻 Уравнение прямой, которое мы уже рассматривали:

    y_pred = w * x + b


🧑‍💻 Дальше loss — это среднеквадратичное отклонение между предсказаниями y_pred и истинными y.

    loss = ((y - y_pred) ** 2).mean()


🧑‍💻 Создали несколько строчек назад пустой список 📎loss_history📎, так вот на каждой итерации будем добавлять туда текущую ошибку (Вывод в дальнейшем позволит оценить, как моделька изменялась):

    loss_history.append(loss)


5⃣📉 Теперь градиенты:

    dw = -2 * np.mean(x * (y - y_pred))
db = -2 * np.mean(y - y_pred)



👨‍💻 Производную мы разбирали в прошлом посте, но там было немного попроще, пока что оценивайте код, будет 3 пост, где я разберу производные для данной модели:

🧑‍💻 x * (y - y_pred) — это разница между реальным и предсказанным (насколько модель ошиблась), Каждый входной x влияет на ошибку предсказания — если x большой и ошибка большая.

🧑‍💻 -2 это как раз из производной функции потерь (y - 2_pred)²

🧑‍💻 dw говорит, насколько и в какую сторону нужно изменить w, чтобы уменьшить ошибку

🧑‍💻 db — то же для b

6⃣ Обновляем параметры:

    w -= lr * dw
b -= lr * db


📉 Двигаем w и b в сторону уменьшения ошибки, используя градиенты и скорость обучения


7⃣ Каждые 10 эпох мы будем выводить промежуточный результат:

    if epoch % 10 == 0:
print(f"Эпоха {epoch}, Потеря: {loss:.4f}, w: {w:.4f}, b: {b:.4f}")


8⃣ 📁 Визуал:

plt.scatter(x, y, label="ТРУ данные")
plt.plot(x, w * x + b, color='red', label="Линия регрессии")
plt.plot(loss_history)
plt.xlabel("Эпоха")
plt.ylabel("Ошибка")
plt.title("Градиентный спуск: уменьшение ошибки")
Please open Telegram to view this post
VIEW IN TELEGRAM
37311
61
👨‍💻🧑‍💻 Обновил навигацию по ML, читайте на здоровье:

📇 Machine learning

📊 Machine learning 2

📊 Machine learning 3
Please open Telegram to view this post
VIEW IN TELEGRAM
4221
Тг не хочет брать так много ссылок на 1 пост, поэтому завтра будет 4 пост по навигации для ML, мы слишком далеко улетели ✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
132
👑
Please open Telegram to view this post
VIEW IN TELEGRAM
311
👨‍💻⚙️ Теперь Gemini 2.5 Pro теперь доступна бесплатно для всех пользователей с аккаунтом Google.

🧠 Ранее доступ к ней был ограничен подписчиками Gemini Advanced с тарифом Google One AI Premium за $19,99 в месяц. ​

Пользуемся здесь: http://gemini.google.com
Please open Telegram to view this post
VIEW IN TELEGRAM
321
🔤🔤🌹🌷 3️⃣

👨‍💻 Продолжаем разбирать градиентный спуск, часть 3 и на этот раз мы будем практиковаться. И нет, это не просто практика, одним кодом мы затронем все пройденное: трансформацию данных (Возьмем Z-core), MSE, MAE, R², Градиентный спуск, Линейная и Полиномиальная регрессии. Ну тогда давайте начинать:

0⃣🗂 Импортируем библиотеки:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import StandardScaler, PolynomialFeatures
from sklearn.metrics import mean_squared_error, r2_score, mean_absolute_error


1⃣📇 Дальше генерим данные:

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


2⃣📊 Объявляем объект стандартизации и обучаем данные с учетом трансформирования (то есть, трансформация + обучение):

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)


2⃣🤯 Инициализируем веса, задаем скорость обучения, количество эпох, объявляем функцию и m (пригодится для формулы — это количество примеров в выборке):

def linear_gradient_descent(X, y, lr=0.1, epoches = 1000):
m = len(y)
w = np.random.randn()
b = np.random.randn()
losses = []


3⃣⚙️ Теперь цикл градиентного спуска:

    for _ in range(epoches):
y_pred = w * X.reshape(-1) + b # Предсказания
L = y_pred - y.reshape(-1) # (Loss)


🧑‍💻 📎y_pred = w * X.reshape(-1) + b📎 — кароч это наша предсказанная линиия,

🧑‍💻 📎X.reshape(-1)📎 — превращает X в одномерный массив (это просто так удобно)

🧑‍💻 📎error = y_pred - y.reshape(-1)📎 — это типо ошибка, ну вы поняли

4⃣🛍 Считаем градиенты для обновления весов, обновляем веса и возвращаем вес и смещение (w, b):

        dw = (2/m) * np.sum(L * X.reshape(-1))  # Градиент для w
db = (2/m) * np.sum(L) # Градиент для b

w -= lr * dw # Обновляем w
b -= lr * db # Обновляем b

return w, b


5⃣💳Обучаем линейную регрессию с градиентным спуском и получаем предсказания модели:

        w -= lr * dw  
b -= lr * db
losses.append(mean_squared_error(y, y_pred))
return w, b, losses

w, b, losses = linear_gradient_descent(X_scaled, y) # Обучение
y_pred_lin = w * X_scaled + b # Наши результаты


6⃣✍️ Визуал:

print("Линейная регрессия")
print("w:", w)
print("b:", b)
print("MSE:", mean_squared_error(y, y_pred_lin))
print("MAE:", mean_absolute_error(y, y_pred_lin))
print("R²:", r2_score(y, y_pred_lin))

plt.figure(figsize = (12, 5))


plt.subplot(1, 2, 1)
plt.scatter(X, y, color='black', label='Данные')
plt.plot(X, y_pred_lin, color='blue', label='Линейная регрессия')
plt.xlabel("X")
plt.ylabel("y")
plt.legend()
plt.title("Линейная регрессия")


plt.subplot(1, 2, 2)
plt.plot(range(len(losses)), losses, color='red', label="MSE")
plt.xlabel("Итерации")
plt.ylabel("Ошибка (MSE)")
plt.legend()
plt.title("График обучения градиентного спуска")

plt.show()


📱Что насчет вывода?

🧑‍💻 w: 1.639897299913427

🧑‍💻b: 6.820004100101897

🧑‍💻MSE: 0.8065845639670531

🧑‍💻MAE: 0.7010426719637758

🧑‍💻R²: 0.7692735413614223

⬇️ Графики в комментах ⬇️

⚙️Также стоит упомянуть сами формулы и реализацию градиентного спуска, о нем речь все-таки... В общем, смотрите:

🟰 MSE = 1/m * ∑ * (y_pred - y)² 🟰при этом, y_pred = wX + b 🟰

🟰 ∂L/ ∂w = 2/m * ∑ * (y_pred - y) * X 🟰 Касаемо частных производных (это мы градиенты считали) 🟰

🟰 ∂L/ ∂b = 2/m * ∑ * (y_pred - y) 🟰

🟰 w = w - α * ∂L/ ∂w 🟰где α - learning rate (скорость обучения)

🟰 b = b - α * ∂L/ ∂b 🟰

🔗 Код корректирует эти шаги (корректирует w и b), пока ошибка не уменьшится
Please open Telegram to view this post
VIEW IN TELEGRAM
5211
722
🧑‍💻 Подписичники, скоро балдейший пост
Please open Telegram to view this post
VIEW IN TELEGRAM
1222