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

Обсуждение, новости, материал и сплетни — все здесь https://t.me/CodeLabMLChat
Download Telegram
⚙️ Друзья, привет! Выполняем ДЗ с курса. Итак, че нам нам нужно сделать? Все, о чем мы писали, нам сильно пригодится.

🔗 У нас есть 2 набора данных точек: 🟰x_hw 🟰 и 🟰y_hw🟰

📈 Какие у нас задачи?

⭕️ Визуализировать набор точек: Построить график
для данны
х 🟰x_hw 🟰 и 🟰y_hw🟰.

⭕️ Построить коэффициенты регрессии 🟰w₀, w₁🟰, выполнить пошаговый процесс вычисления коэффициентов линейной регрессии.

⭕️ Рассчитать предсказания в виде 🟰y =w₀ + w₁. * x🟰 на одном графике с точками и визуализировать.


Наши данные:

x_hw = np.array([50, 60, 70, 100])
y_hw = np.array([10, 15, 40, 45])
2🤯1
0️⃣🔗 Итак, ну для начала импортируем библиотеки:

import numpy as np
import matplotlib.pyplot as plt


1️⃣ Теперь объявим массивы наших данных:

x_hw = np.array([50, 60, 70 100]) # независимые переменные (по оси X)

y_hw = np,array([10, 15, 40, 45]) # зависимые переменные (по оси Y)


⚙️ Можем даже визуализировать (ВЫВОД №1) то, что получили, хотя бы для понимания:

import numpy as np
import matplotlib.pyplot as plt

x_hw = np.array([50, 60, 70, 100])
y_hw = np.array([10, 15, 40, 45])

plt.scatter(x_hw, y_hw):
❤‍🔥1🥰1🤯1
2️⃣🔗 Работаем над визуалом наших данных:

plt.scatter(x_hw, y_hw, color='blue', label='Точки данных') # Строит график
plt.xlabel('x_hw') # Эта и строка ниже подписывает оси
plt.ylabel('y_hw')
plt.title('Данные') # Добавляет заголовок
plt.legend() # Показывает обозначение точки данных
plt.grid() # Добавляет сетку
plt.show() # Показывает сам график


3️⃣⚙️ Вычисляем коэффициенты:

n = len(x_hw) # Количество точек данных
x_mean = np.mean(x_hw) # Средние значения для X и Y
y_mean = np.mean(y_hw)


😋 Кароч, какие я могу дать комментарии: Мы взяли и присвоили к переменным x_mean и y_mean функции np.mean (вычисляет среднее значение элементов в массиве). 🔗Теперь берем и прописываем формулу:

w1 = np.sum((x_hw - x_mean) * (y_hw - y_mean)) / np.sum((x_hw - x_mean) ** 2)

w0 = y_mean - w1 * x_mean

# w1 -- Указывает наклон линии
# w0 -- Сдвиг нашей линии

# Вывод: w0 = -22.50, w1 = 0.71
👍2🤯1
4️⃣ Правда немножка остается, строим линию регрессии:

🔗 Функция predict рассчитывает зависимую переменную y для любого значения x (у нас их целых 100). Почему 100? Отвечаю: смотрим две последние строки, np.linspace создает массив из равномерно распределённых значений в диапазоне от 50 до 100 (от min(x_hw) до max(x_hw)) — как раз будет 100 значений по умолчанию. Теперь вопрос: что это за значения и что делает y_line?

‼️ Отвечаю: тут применяем функцию predict — когда мы передаем массив из 100 значений x, она рассчитывает y для каждого x по формуле y = w0 + w1 * x. По итогу мы получаем 100 предсказанных значений. Так почему 100 и зачем это нужно? Эти 100 точек используются для построения гладкой линии регрессии
.
def predict(x):
return w0 + w1 * x

x_line = np.linspace(min(x_hw), max(x_hw))
y_line = predict(x_line)


5️⃣ Визуализация линии регрессии

plt.scatter(x_hw, y_hw, color='blue', label='Точки данных') # исходные точки
plt.plot(x_line, y_line, color='red', label='Линия регрессии') # Сама линия регрессии
plt.xlabel('x_hw')
plt.ylabel('y_hw')
plt.title('Линейная регрессия')
plt.legend()
plt.grid()
plt.show()
🥰3
3
🧑‍💻 Гайс, привет! Сегодня разберем 🔗МЕТРИКИ КАЧЕСТВА🔗. Че это такое вообще? Кароч, обучили модель, и как раз тут выступают метрики качества — это такие показатели, которые нужны для оценки того, насколько хорошо модель справляется с задачей. 🆘 Без метрик качества обучение моделей теряет всякий смысл, так как мы не можем понять, какая модель лучше.

Разберем самые основные метрики качества: 1️⃣ среднеквадратичная ошибка (MSE). 2️⃣ средняя ошибка, 3️⃣ метрика R²

0️⃣⚙️ Так, для начала импортируем датасет (датасет у нас о ценах на дома в Калифорнии):

from sklearn.datasets import fetch_california_housing


1️⃣ Загружаем датасет в переменную (наш датасет кстати состоит из 2 основных частей:

🔗 data — таблица с признаками (фичами, features) — входные
данные для обучения модели.

🔗 target — целевая переменная (как раз то, что и пытаемся предсказать) — у нас это средняя цена дома в районе

california_dataset = fetch_california_housing()


2️⃣ Дальше создаем 2 переменные, как раз для наших новых двух частей — data, target.

‼️ Каждая строка в 🟰features🟰 может представлять район, а столбцы — средний доход в районе / количество комнат / средний возраст построек.

‼️ В то же время y — это массив с целевой переменной (цены на хаты), которые мы и хотим предсказать.

features = california_dataset.data

y = california_dataset.target


3️⃣ Дело за малым, обучаем модель:

reg = LinearRegression().fit(features, y)


🔗 LinearRegression() — представляет собой модель линейной регрессии из импортированной библиотеки 🟰scikit-learn🟰

🔗 Линейная регрессия строит линейную зависимость между признаками X (у нас это features), она как раз ищет коэффициенты w0, w1, ну вы поняли)

🔗 .fit(features, y) — обучаем модель на наших данных

4️⃣ Теперь получаем 2 вектора — наше целевое значение (⁻y) и истинное значение (y)

y_pred = reg.predict(features) # Предсказанные значения

y_true = y # Истинное значение


5️⃣ Этот этап не сильно нужен, просто на нем я хочу пока что закончить и вывести то, что получилось:

print("Форма признаков (features):", features.shape)
print("Форма целевой переменной (y):", y.shape)

print("Первые 5 строк признаков:\n", features[:3])
print("Первые 5 значений целевой переменной:\n", y[:3])

print("Коэффициенты модели:\n", reg.coef_)
print("Свободный член (w0):", reg.intercept_)


Весь код:

from sklearn.datasets import fetch_california_housing
from sklearn.linear_model import LinearRegression

california_dataset = fetch_california_housing()

features = california_dataset.data
y = california_dataset.target

reg = LinearRegression().fit(features, y)

y_pred = reg.predict(features) # Предсказанные значения

y_true = y # Истинное значение


print("Форма признаков (features):", features.shape)
print("Форма целевой переменной (y):", y.shape)

print("Первые 5 строк признаков:\n", features[:3])
print("Первые 5 значений целевой переменной:\n", y[:3])

print("Коэффициенты модели:\n", reg.coef_)
print("Свободный член (w0):", reg.intercept_)
❤‍🔥2👍1🤯1
Друзья, возобновляем мемы каждый день?
Anonymous Poll
82%
да
0%
нет
0%
данет
0%
нетданет
18%
динах
🔗 Гайсы привет, продолжаем воркать:

🧑‍💻 Мы остановились ночью на том, что обучили простенькую модель линейной регрессии, вот вам даже выведу основные строки:

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
🤓1
8️⃣⚙️ Продолжаем:

В комменты выложу формулу 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_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, тем лучше, то метрика качества — коэффициент детерминации () работает иначе: лучшее значение это — 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
🧑‍💻 Когда мы обучаем данные для обучения линейной регрессии, мы можем применить такие приемы как нормализация ил масштабирование.

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 ).

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