🔗 Гайсы привет, продолжаем воркать:
🧑💻 Мы остановились ночью на том, что обучили простенькую модель линейной регрессии, вот вам даже выведу основные строки:
✅ Сделаю важную пометку и пойдем дальше:
🟰y_true🟰 — это массив истинных значений (это настоящая средняя стоимость жилья). ‼️Важно понимать, что эти данные нам были изначально известны, так как мы загрузили дата сет — 🟰fetch_california_housing()🟰.
6️⃣📈 Теперь продолжаем тему матрик:
🔗 Импортируем функцию для вычисления среднеквадратической ошибки:
7️⃣⚙️ Функцию импортировали, теперь подставляем аргументы (y_true, y_pred):
✅ Что мы получили?
🧑💻 Мы остановились ночью на том, что обучили простенькую модель линейной регрессии, вот вам даже выведу основные строки:
reg = LinearRegression().fit(features, y) # Здесь мы обучили нашу линейную регрессию
y_pred = reg.predict(features) # Предсказанные значения
y_true = y # Истинное значение
✅ Сделаю важную пометку и пойдем дальше:
🟰y_true🟰 — это массив истинных значений (это настоящая средняя стоимость жилья). ‼️Важно понимать, что эти данные нам были изначально известны, так как мы загрузили дата сет — 🟰fetch_california_housing()🟰.
Представьте таблицу с признаками (средний доход, кол-во комнат, возраст сданий и тд), последним столбцом будет цена на жилье — это и есть y_true
6️⃣📈 Теперь продолжаем тему матрик:
🔗 Импортируем функцию для вычисления среднеквадратической ошибки:
from sklearn.metrics import mean_squared_error
7️⃣⚙️ Функцию импортировали, теперь подставляем аргументы (y_true, y_pred):
mean_squared_error(y_true, y_pred)
'''
Вывод:
0.5243209861846072
'''
✅ Что мы получили?
Значение 0.52 означает, что в среднем квадрат разницы между предсказанным и реальным значениями равен 0.52.
❤3❤🔥1🤯1
8️⃣⚙️ Продолжаем:
В комменты выложу формулу MAE (Mean Absolute Error), вам нужно будет ее почекать. Это по сути сумма отклонений истинных значений 🟰y🟰 от предсказаний нашей модели. Метрика принимает только положительные значения и чем ближе они будут к нулю, тем наша модель будет лучше.
🔗 Итак, импортируем 🟰
🔗 (reg.predict(features), y) — Здесь и вычисляется MAE. ‼️ Напоминаю, features — это признаки, входные данные модели (независимые переменные) . y — это целевые значения, которые мы пытаемся предсказать (зависимая переменная).
⁉️ Почему y не передается в predict()?
Функция predict(features) делает прогнозы на основе только входных данных (features) — как раз предсказанные значения и будут сравниваться с истинными. У нас модель ищет зависимость между features (наши признаки) и y (целевое значение). Эти данные изначально разделены.
В комменты выложу формулу MAE (Mean Absolute Error), вам нужно будет ее почекать. Это по сути сумма отклонений истинных значений 🟰y🟰 от предсказаний нашей модели. Метрика принимает только положительные значения и чем ближе они будут к нулю, тем наша модель будет лучше.
В отличие от MSE, где ошибки возводятся в квадрат, в MAE просто берется абсолютное значение разницы между предсказанием и истинным значением.
🔗 Итак, импортируем 🟰
mean_absolute_error🟰 из sklearn.metrics. 🔗 (reg.predict(features), y) — Здесь и вычисляется MAE. ‼️ Напоминаю, features — это признаки, входные данные модели (независимые переменные) . y — это целевые значения, которые мы пытаемся предсказать (зависимая переменная).
from sklearn.metrics import mean_absolute_error
print('MAE = %s' % mean_absolute_error(
reg.predict(features), y)
)
⁉️ Почему y не передается в predict()?
Функция predict(features) делает прогнозы на основе только входных данных (features) — как раз предсказанные значения и будут сравниваться с истинными. У нас модель ищет зависимость между features (наши признаки) и y (целевое значение). Эти данные изначально разделены.
❤🔥3🤯2🤓1
⚠️ Рассмотрим RMSE (Root Mean Square Error) — базовая метрика для определения качества линейной регрессии. Будет у нас, допустим, предсказанное значение -y и мы будем считать квадрат отклонения от фактического значения и среднее по полученным величинам. Если вы ничего не поняли, не переживайте, я тоже. Формулу выложу в комменты, с ней все будет намного понятнее)
from sklearn.metrics import mean_absolute_error
rmse = mean_squared_error(y_true, y_pred)
print('RMSE = %s' % rmse )
❤2🥰1👨💻1
🧑💻 Йоу воссап, знаю что вы спите, поэтому самое время пост выложить, чтобы вы с утра очумели.
📈 Задание Тайлера Дердена:
🗂 Хотя бы начнем писать, импортируем библиотеки:
📐Загружаем дата сет и обучаем модель:
Всем сладких 😴
📈 Задание Тайлера Дердена:
У нас есть 2 набора точек — это y_true (истинные значения), также есть и предсказанные — y_pred
▫️Для каждой точки из y_true надо построить величину ошибки:
e = y - ^y (остаток регрессии)
▫️Надо также возвести ошибки в квадрат e²
▫️Иии построить график ошибок — зависимость e² от e
🗂 Хотя бы начнем писать, импортируем библиотеки:
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt
📐Загружаем дата сет и обучаем модель:
california_dataset = fetch_california_housing()
features = california_dataset.data
y_true = california_dataset.target
reg = LinearRegression().fit(features, y_true)
y_pred = reg.predict(features) # вычисляет предсказанные значения ^y на основе обученной модели.
Всем сладких 😴
❤🔥2🥰1🤯1
🧑💻 День добрый, теперь вычисляем остатки регрессии (следуем нашему ТЗ):
⚙️ Остатки регрессии e — разница между реальными значениями y_true и предсказанными y_pred
⚙️ Теперь квадраты остатков:
⁉️ Зач это надо? Мы таким образом убираем отрицательные значения. чтобы ошибки (а точнее их значения) можно было сравнить.
✅ Теперь строим график:
Результат сверху ⬆️⬆️⬆️
⚙️ Остатки регрессии e — разница между реальными значениями y_true и предсказанными y_pred
e = y_true - y_pred
⚙️ Теперь квадраты остатков:
⁉️ Зач это надо? Мы таким образом убираем отрицательные значения. чтобы ошибки (а точнее их значения) можно было сравнить.
e_sq = e ** 2 # Остатки возводим в квадрат
✅ Теперь строим график:
plt.scatter(e, e_sq, color = 'blue', alpha = 0.5)
plt.xlabel('Остатки регрессии (e)')
plt.ylabel('Квадрат ошибки (e^2)')
plt.title('График зависимости e^2 от e')
plt.grid(True)
plt.show()
Результат сверху ⬆️⬆️⬆️
❤🔥2👍2🤯2👨💻2🤓1
🧑💻Всем ку, можно добавить в наш код еще вывод значений в дополнении к графику и как раз весь код выложу:
from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
import numpy as np
import matplotlib.pyplot as plt
california_dataset = fetch_california_housing()
features = california_dataset.data
y_true = california_dataset.target
reg = LinearRegression().fit(features, y_true)
y_pred = reg.predict(features) # вычисляет предсказанные значения ^y на основе обученной модели.
print("y_true (истинные значения):", y_true[:20])
print("y_pred (предсказанные значения):", y_pred[:20])
e = y_true - y_pred
e_sq = e ** 2 # Остатки возводим в квадрат
plt.scatter(e, e_sq, color = 'blue', alpha = 0.5)
plt.xlabel('Остатки регрессии (e)')
plt.ylabel('Квадрат ошибки (e^2)')
plt.title('График зависимости e^2 от e')
plt.grid(True)
plt.show()
❤3🤯1👨💻1
🧑💻 Друзья, привет! Продолжаем воркать! Следующая метрика — R²
Если RMSE и MAE похожи, то R² явно отличается. Первые два работают так, что чем ближе их значения к 0, тем лучше, то метрика качества — коэффициент детерминации (R²) работает иначе: лучшее значение это — 1, чем меньше, тем хуже (отрицательные — модель плохая)
Берем наш датасет с жильем в Калифорнии и тестим:
Если RMSE и MAE похожи, то R² явно отличается. Первые два работают так, что чем ближе их значения к 0, тем лучше, то метрика качества — коэффициент детерминации (R²) работает иначе: лучшее значение это — 1, чем меньше, тем хуже (отрицательные — модель плохая)
Берем наш датасет с жильем в Калифорнии и тестим:
from sklearn.metrics import r2_score
print('r2_score = %s', r2_score(y_true, y_pred))
❤1🤓1
🧑💻 С метриками пока закончим, будем двигаться дальше. 📊 Поговорим про трансформацию входных данных для линейной регрессии (масштаб данных, распределение данных (Гауссовское и Пуассоновское). ⁉️В чем суть? Чтобы удовлетворить условие алгоритма, нам необходимо преобразовать или трансформировать данные. В случае, если этого не будет, входные данные будут некорректны.
Также стоит упомянуть о требованиях к правильной подготовке входных данных:
Фраза «Garbage In = Garbage Out» означает, что если данные собраны кое-как, то и результат получится кое-как
Трансформацию можно применять как к фичам, так и к переменным
Также стоит упомянуть о требованиях к правильной подготовке входных данных:
▫️Остатки регрессии (разница между истинными значениями y_true и предсказанными значениями y_pred должны иметь нормальное (Гауссово) распределение
▫️Все признаки (фичи) должны быть примерно в одном масштабе. Это особенно важно для линейных моделей, так как признаки с большими значениями могут доминировать над другими при расчётах.
❤3👍1🤓1👨💻1
🧑💻 Когда мы обучаем данные для обучения линейной регрессии, мы можем применить такие приемы как нормализация ил масштабирование.
⁉️ В чем суть? Данные вроде бы линейны, но несколько точек являются вбросами, как раз то самое "Garbage In, Garbage Out". Обучим линейную регрессию на этом датасете.
import numpy as np
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
x = np.linspace(1, 10, num = 10).reshape(-1, 1)
y = [1.5, 2.5, 3, 4.5, 10, 6.7, 7, 8.5, 14, 7]
reg = LinearRegression().fit(x, y)
y_pred = reg.predict(x)
print(r2_score(y, y_pred))
plt.plot(x, y_pred, color="red", label="Предсказания")
plt.xlabel("X")
plt.ylabel("Y")
plt.scatter(x, y)
plt.show()
# Вывод: 0.60817003246828
⁉️ В чем суть? Данные вроде бы линейны, но несколько точек являются вбросами, как раз то самое "Garbage In, Garbage Out". Обучим линейную регрессию на этом датасете.
❤🔥1👍1🥰1
🧑💻 Что мы увидели? Результат дает нам понять, что данные y имеют значительный разброс и выбросы (Это видно значению 0.608 < 1 ).
Теперь жесточайше трансформируем наши точки с помощью функции логарифмирования:
⚙️ Вопрос зач? А затем, что функция логарифма помогает сжимать большие значения, чем больше значение, тем сильнее оно сжимается: log(1000) = 3
‼️ Сверху — то, что было (большой разброс), снизу — (разброс меньше)
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score
reg = LinearRegression().fit(x, y)
y_pred = reg.predict(x)
print(r2_score(y, y_pred))
Теперь жесточайше трансформируем наши точки с помощью функции логарифмирования:
y_transformed = np.log(y)
⚙️ Вопрос зач? А затем, что функция логарифма помогает сжимать большие значения, чем больше значение, тем сильнее оно сжимается: log(1000) = 3
‼️ Сверху — то, что было (большой разброс), снизу — (разброс меньше)
❤🔥1👍1🤯1
🧑💻 Так, это я дополняю код и готовую линию регрессии для логарифмически преобразованных данных.
import numpy as np
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
x = np.linspace(1, 10, num=10).reshape(-1, 1)
y = [1.5, 2.5, 3, 4.5, 10, 6.7, 7, 8.5, 14, 7]
y_transformed = np.log(y)
reg = LinearRegression().fit(x, y_transformed)
y_pred_transformed = reg.predict(x)
plt.scatter(x, y_transformed, color="blue")
plt.plot(x, y_pred_transformed, color="red")
plt.xlabel("X")
plt.ylabel("log(Y)")
plt.title("Логарифмически преобразованные данные и линия регрессии")
plt.legend()
plt.show()
❤2🤯2🤓1👨💻1
🧑💻 Еще есть такая тема как np.sqrt(y) — квадратный корень. ⁉️Че он делает?Уменьшает большие значения более мягко. Подходит для случаев, когда значения распределены неравномерно, но нет экстремальных выбросов.
import numpy as np
from matplotlib import pyplot as plt
from sklearn.linear_model import LinearRegression
x = np.linspace(1, 10, num=10).reshape(-1, 1)
y = [1.5, 2.5, 3, 4.5, 10, 6.7, 7, 8.5, 14, 7]
y_transformed = np.sqrt(y)
reg = LinearRegression().fit(x, y_transformed)
y_pred_transformed = reg.predict(x)
plt.scatter(x, y_transformed, label="Данные (sqrt(y))", color="blue")
plt.plot(x, y_pred_transformed, label="Линия регрессии", color="red")
plt.xlabel("X")
plt.ylabel("sqrt(Y)")
plt.title("Квадратнокоренные данные и линия регрессии")
plt.legend()
plt.show()
❤🔥2👍2🥰2
🧑💻 Так, друзья, продолжаем воркать! Сегодня будем 'смягчать' данные для нашей линейной регрессии.⚙️ Вчера, напомню вам, мы рассматривали такой прием как — извлечение корня np.sqrt().
📈 Ща рассмотрим некоторые моменты, которые вам нужно пояснить:
📈 Ща рассмотрим некоторые моменты, которые вам нужно пояснить:
◻️Все эти преобразования данных относятся к МАСШТАБИРОВАНИЮ — это прием, который меняет масштаб данных (меняется диапазон значений). А вот методы масштабирования разные, мы их и рассматриваем.
▫️Первый, что мы рассмотрели — это ЛОГАРИФМИЗАЦИЯ (у нас есть выбросы данных, а логарифмизация помогает их исправить)
y_transformed = log (y)
▫️Второй — это квадратный корень (также уменьшает влияние выбросов). Логарифм и корень не делают данные "нормальными", но помогают уменьшить
y_transformed = sqrt (y)
▫️Третий — это СТАНДАРТИЗАЦИЯ (Z - SCORE). Смысл в том, чтобы привести данные к стандартному виду (среднее - 0, отклонение - 1). Z-score не исправляет скошенность данных! Он только центрирует и масштабирует. Его мы как раз и разберем:
▫️И четвертый — НОРМАЛИЗАЦИЯ (Min-Max scaling). Цель такого метода — это привести данные к диапазону [0, 1]
❤🔥3👍1🥰1🤯1
import numpy as np
from matplotlib import pyplot as plt
from sklearn.preprocessing import StandardScaler
from sklearn.linear_model import LinearRegression
# Исходные данные
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)
# Массив индексов (X) для регрессии
x = np.arange(len(raw_data)).reshape(-1, 1) # Индексы как признаки
# Стандартизация данных
scaler = StandardScaler()
transformed_data = scaler.fit_transform(raw_data.reshape(-1, 1)).reshape(-1)
# Обучаем регрессию на исходных данных
reg_raw = LinearRegression().fit(x, raw_data)
y_pred_raw = reg_raw.predict(x)
# Обучаем регрессию на стандартизированных данных
reg_transformed = LinearRegression().fit(x, transformed_data)
y_pred_transformed = reg_transformed.predict(x)
plt.figure(figsize=(14, 6))
# Исходные данные
plt.subplot(1, 2, 1)
plt.scatter(x, raw_data, color='blue', label='Исходные данные')
plt.plot(x, y_pred_raw, color='red', label='Линейная регрессия')
plt.title('Исходные данные и регрессия')
plt.xlabel('Индекс')
plt.ylabel('Значение')
plt.legend()
# Стандартизированные данные
plt.subplot(1, 2, 2)
plt.scatter(x, transformed_data, color='green', label='Z-трансформированные данные')
plt.plot(x, y_pred_transformed, color='orange', label='Линейная регрессия')
plt.title('Стандартизированные данные и регрессия')
plt.xlabel('Индекс')
plt.ylabel('Z-значение')
plt.legend()
plt.show()
⚙️ Разберем новые строки:
0️⃣ Импортируем библиотеку для стандартизации данных (Z - score)
StandardScaler: Для стандартизации данных (Z-score)
1️⃣ Можем еще добавить dtype=np.float32 в конец нашей строчки создания массива.
raw_data = np.array([
1., 3., 2., 4., 2., 10., 2., 5., 2., 2., 1., 7., 5., 2., 5., 16.,
10., 3., 24.
])
2️⃣ Создаем массив индексов x от 0 до 18 (количество элементов в raw_data)
x = np.arange(len(raw_data)).reshape(-1, 1)
3️⃣ Создаем объект для стандартизации:
StandardScaler():
4️⃣ Вычисляем среднее и стандартное отклонение, а затем применяет Z-score преобразование
transformed_data = scaler.fit_transform(raw_data.reshape(-1, 1)).reshape(-1)
⚙️ fit_transform() — вычисляем среднее и стандартное отклонение, а затем применяет Z-score преобразование
⚙️ reshape(-1, 1) — преобразует raw_data в двумерный массив (это требуется для нашей библиотеки StandardScaler)
⚙️ reshape(-1) — преобразует результат обратно в одномерный массив (это надо затем, что StandardScaler ожидает на вход двумерный массив (строка — данные) столбец — фича).✅ Дак вот, после того, как объект StandardScaler обработал данные, он возвращает двумерный массив. Затем мы переводим в одномерный массив для удобства.
5️⃣ Обучаем линейную регрессию на исходных данных:
reg_raw = LinearRegression().fit(x, raw_data)
y_pred_raw = reg_raw.predict(x)
⚙️ y_pred_raw = reg_raw.predict(x) — предсказание значений для индексов x
6️⃣ Обучаем линейную регрессию на стандартизированных данных:
reg_transformed = LinearRegression().fit(x, transformed_data)
y_pred_transformed = reg_transformed.predict(x)
❤🔥2🥰2👍1🤯1👀1
Что делает метод reshape(-1, 1)?
Anonymous Quiz
0%
a) Преобразует массив в одномерный
86%
b) Преобразует массив в двумерный с одним столбцом
0%
c) Удаляет последний элемент массива
14%
d) Транспонирует массив
❤1🤯1
Какая функция используется для создания графика в Matplotlib?
Anonymous Quiz
0%
a) plt.scatter()
57%
b) plt.plot()
14%
c) plt.bar()
29%
d) plt.hist()
❤1🤯1
❤1🤯1
Что делает метод fit() в LinearRegression?
Anonymous Quiz
29%
a) Предсказывает значения
43%
b) Обучает модель на данных
29%
c) Преобразует данные
0%
d) Удаляет выбросы
🤯2❤1❤🔥1👍1