Завтра будет объяснение, а пока думайте🤯 🧠
def func(a, b=[]): b.append(a) return b print(func(1)) print(func(2)) print(func(3, [])) print(func(4))
def func(a, b=[]): b.append(a) return b print(func(1)) print(func(2)) print(func(3, [])) print(func(4))
Anonymous Quiz
10%
[1] [2] [3] [4]
60%
[1] [1, 2] [3] [1, 2, 4]
20%
[1] [2] [3] [4]
10%
[1] [2] [3] [3, 4]
🔵 Регрессия — важная часть машинного обучения. Она состоит из обучения алгоритма с помеченными данными и его использования для прогнозирования будущих (немаркированных) данных.🔵 Помеченные данные — это данные, поставляемые с метками, которые
в случае регрессии являются числами. Например, числа могут быть ценами на дома.🔵 В наборе данных признаки — это свойства, которые мы используем для прогнозирования метки. Так, если мы хотим спрогнозировать цены на
жилье, характеристики — это все, что описывает дом и что может определить цену, например размер, количество комнат, качество ближайшей школы, уровень преступности в районе, возраст дома и расстояние до шоссе.🔵 Метод линейной регрессии для прогнозирования состоит в присвоении веса каждому из признаков и суммировании весов, умноженных на соответствующие признаки, плюс смещение.🔵 Графически можно представить алгоритм линейной регрессии как попытку провести прямую как можно ближе к набору точек.🔵 Работа алгоритма линейной регрессии заключается в том, что он начинает со случайной прямой, а затем медленно приближает ее к каждой из неправильно классифицированных точек, пытаясь классифицировать
их правильно🔵 Полиномиальная регрессия — это общий случай линейной регрессии, в которой для моделирования данных мы используем кривые вместо прямых. Это особенно полезно, когда набор данных нелинейный.🔵 Регрессия имеет множество применений, включая системы рекомендаций, электронную коммерцию и здравоохранение
Please open Telegram to view this post
VIEW IN TELEGRAM
Всем доброй ночи!
👨💻 Это все можно рассчитать с помощью пары формул, но мы делаем с помощью кода:
0⃣ 🗂 Библиотеки:
1⃣ 📊 Теперь наши данные, сделаем их в виде словаря:
2⃣ 🤯 Pandas мы импортировали не зря, преобразуем наш словарь в таблицу данных:
3⃣ 📊 Формула для прогноза цены у нас есть, сделаем ее в виде функции:
4⃣ ⚙️ Генерим предсказания:
🧑💻 Итак, тут поподробнее: берем df['Размер (s)'], эта часть строки выбирает столбец 'Размер (s)' из DataFrame df, который содержит информацию о размере каждого дома.
🧑💻 Другая часть строки — .apply(predict_price) применяет функцию predict_price к каждому значению в столбце 'Размер (s)'. Функция predict_price вычисляет прогнозируемую цену дома на основе формулы из условия.
🧑💻 df['Прогноз (p)'] = ... : Создает новый столбец 'Прогноз (p)' в DataFrame df и заполняет его значениями, полученными от применения функции predict_price
🧑💻 Если совсем просто, то мы создали новую переменную для прогнозов и теперь она в нашей таблице df DataFrame
5⃣ 🛍 Вычисляем MAE (средняя абсолютная)
6⃣ 📇 MSE (средняя квадратичная)
7⃣ 🧑💻 Остается визуал:
⚙️ Весь код:
*⃣ Вывод:
🧑💻 Средняя абсолютная погрешность (MAE): 38.0
🧑💻 Средняя квадратическая погрешность (MSE): 1550.0
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
data = {
'Дом': [1, 2, 3, 4, 5],
'Размер (s)': [100, 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)
mae = np.mean(np.abs(df['Вознаграждение (r)'] - df['Прогноз (p)']))
print(f"Средняя абсолютная погрешность (MAE): {mae}")
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()
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)
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
Ждите крутой пост, уже работаю над этим 👨💻 ⬆️
Please open Telegram to view this post
VIEW IN TELEGRAM
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
⚙️ Цель градиентного спуска — найти такие параметры (веса модели), чтобы эта ошибка была минимальной (свести ошибку к нулю).🧠 Представьте, что вы находитесь на вершине горы (наша гора — эта функция потерь), а нам нужно спуститься в низину этой горы, вот низина — это место, где ошибка 0 (или близко к нему), ошибка минимальна. спрыгнуть мы туда не можем, поэтому надо аккуратно спускаться. Маленькими шагами мы спускаемся по горе вниз — это и есть градиентный спуск
🔜 "Насколько в среднем сильно модель промахивается",
и причём большие ошибки штрафуются сильнее, потому что возводим в квадрат.
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(42) # фиксируем "случайность", чтобы каждый раз при запуске были одинаковые данные
x = 2 * np.random.randn(100, 1) + 3
y = 4 + 3 * x + np.random.randn(100, 1)
w = np.random.randn()
b = np.random.randn()
lr = 0.01
epochs = 1000
loss_history = []
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 - y_pred) ** 2).mean()
loss_history.append(loss)
dw = -2 * np.mean(x * (y - y_pred))
db = -2 * np.mean(y - y_pred)
w -= lr * dw
b -= lr * db
📉 Двигаем w и b в сторону уменьшения ошибки, используя градиенты и скорость обучения
if epoch % 10 == 0:
print(f"Эпоха {epoch}, Потеря: {loss:.4f}, w: {w:.4f}, b: {b:.4f}")
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
3 7 3 1 1
Please open Telegram to view this post
VIEW IN TELEGRAM
Тг не хочет брать так много ссылок на 1 пост, поэтому завтра будет 4 пост по навигации для ML, мы слишком далеко улетели ✈️
Please open Telegram to view this post
VIEW IN TELEGRAM
1 3 2
Пользуемся здесь: http://gemini.google.com
Please open Telegram to view this post
VIEW IN TELEGRAM
Gemini
Google Gemini
Meet Gemini, Google’s AI assistant. Get help with writing, planning, brainstorming, and more. Experience the power of generative AI.
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
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
def linear_gradient_descent(X, y, lr=0.1, epoches = 1000):
m = len(y)
w = np.random.randn()
b = np.random.randn()
losses = []
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 в одномерный массив (это просто так удобно) = y_pred - y.reshape(-1)📎 — это типо ошибка, ну вы поняли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
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 # Наши результаты
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 и b), пока ошибка не уменьшится
Please open Telegram to view this post
VIEW IN TELEGRAM