🧑💻 С метриками пока закончим, будем двигаться дальше. 📊 Поговорим про трансформацию входных данных для линейной регрессии (масштаб данных, распределение данных (Гауссовское и Пуассоновское). ⁉️В чем суть? Чтобы удовлетворить условие алгоритма, нам необходимо преобразовать или трансформировать данные. В случае, если этого не будет, входные данные будут некорректны.
Также стоит упомянуть о требованиях к правильной подготовке входных данных:
Фраза «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
🧑💻Итак, чтобы перейти дальше к новому методу (Min - Max Scalling), предлагаю ответить на ключевые вопросы для понимания кода:
0️⃣ Итак, строчка ниже преобразует одномерный массив raw_data в двумерный одним столбцом. Зач это надо? Наш объект StandardScaler() — (это объект стандартизации) ожидает на вход именно двумерный массив, где строка — это наши данные, а столбец это фича (признак)
1️⃣ Че такое StandardScaler? Это наша прошлая тема Z-score стандартизация. ⁉️ В чем суть такой трансформации данных? Данные преобразуются так, чтобы их среднее значение стало 0, а стандартное отклонение — 1. ⁉️ Вопрос тот же — а зач это надо? Таким образом мы уменьшаем выбросы!
‼️ Так, щас важный момент! Вы наверняка видите формулу z - core стандартизации. Ща разберем, что за что отвечает:
🔗 x — это исходное значение
🔗 μ — среднее значение всех данных
🔗 σ — стандартное отклонение всех данных
⚙️ Сначала вычитаем среднее, а потом делим полученный результат на стандартное отклонение
0️⃣ Итак, строчка ниже преобразует одномерный массив raw_data в двумерный одним столбцом. Зач это надо? Наш объект StandardScaler() — (это объект стандартизации) ожидает на вход именно двумерный массив, где строка — это наши данные, а столбец это фича (признак)
raw_data.reshape(-1, 1)?
1️⃣ Че такое StandardScaler? Это наша прошлая тема Z-score стандартизация. ⁉️ В чем суть такой трансформации данных? Данные преобразуются так, чтобы их среднее значение стало 0, а стандартное отклонение — 1. ⁉️ Вопрос тот же — а зач это надо? Таким образом мы уменьшаем выбросы!
‼️ Так, щас важный момент! Вы наверняка видите формулу z - core стандартизации. Ща разберем, что за что отвечает:
🔗 x — это исходное значение
🔗 μ — среднее значение всех данных
🔗 σ — стандартное отклонение всех данных
⚙️ Сначала вычитаем среднее, а потом делим полученный результат на стандартное отклонение
❤2👍2👨💻2🥰1🤓1
Какая функция используется для создания графика в Matplotlib?
Anonymous Quiz
14%
plt.scatter()
86%
plt.plot()
0%
plt.bar()
0%
plt.hist()
❤🔥1❤1
Что делает функция plt.subplot(1, 2, 1)?
Anonymous Quiz
14%
Создает один график
43%
Создает два графика в одной строке и выбирает первый
43%
Создает два графика в одном столбце и выбирает первый
0%
Удаляет первый график
❤🔥1❤1
CodeLab
🧑💻Итак, чтобы перейти дальше к новому методу (Min - Max Scalling), предлагаю ответить на ключевые вопросы для понимания кода: 0️⃣ Итак, строчка ниже преобразует одномерный массив raw_data в двумерный одним столбцом. Зач это надо? Наш объект StandardScaler()…
2️⃣ Почему массив индексов x создается с помощью np.arange(len(raw_data))?
🧑💻Итак, как я уже сказал x — это именно массив индексов (используется как независимый признак для нашей регрессии) . Только в нашем случае индексы представляют собой последовательность чисел от 0 до N-1, где N — количество элементов в
🔗 x — это индексы (независимая переменная)
🔗 raw_data — это значения (зависимая переменная)
✅ Вот пример с реальными данными, а не с заполнением (как было у нас):
🧑💻Итак, как я уже сказал x — это именно массив индексов (используется как независимый признак для нашей регрессии) . Только в нашем случае индексы представляют собой последовательность чисел от 0 до N-1, где N — количество элементов в
🟰raw_data🟰. Это все мы рассматривали в этом посте. ⚙️ Давайте подытожим: Линейная регрессия требует независимую переменную (X) и зависимую переменную (y).🔗 x — это индексы (независимая переменная)
🔗 raw_data — это значения (зависимая переменная)
✅ Вот пример с реальными данными, а не с заполнением (как было у нас):
# независимая переменная
days = np.array([1, 2, 3, 4, 5])
# зависимая переменная
temperature = np.array([20, 22, 21, 23, 24])
# Обучение
model = LinearRegression().fit(days.reshape(-1, 1), temperature)
Telegram
CodeLab
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.…
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.…
🥰3👍2👀2❤1👨💻1
🧑💻 Друзья, вот полный код того, что мы разбирали последние уроки!
import numpy as np # для работы с массивами
from matplotlib import pyplot as plt # для визуализации данных
from sklearn.preprocessing import StandardScaler # для стандартизации данных (Z - score)
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) # атрибут, занимает 4 байта памяти и хранит в себе числа с дробной частью
x = np.arange(len(raw_data)).reshape(-1,1) # создаем массив индексов от 0 до 18 (по кол-ву элементов raw_data)
# reshape(-1, 1) -- преобразует одномерный массив в двумерный
scaler = StandardScaler() # объект стандартизации
transformed_data = scaler.fit_transform(raw_data.reshape(-1, 1)).reshape(-1) # вычисляем среднее и стандартное отклонение, а затем применяем Z-score преобразование
reg_raw = LinearRegression().fit(x, raw_data) # создаем объект линейной регрессии и обучем модель на исходных данных
y_pred_raw = reg_raw.predict(x) # предсказывает значения для индексов X
reg_transformed = LinearRegression().fit(x, transformed_data) # создаем объект линейной регрессии и обучем модель на стандартизированных данных
y_pred_transformed = reg_transformed.predict(x) # предсказывает значения для индексов X
plt.figure(figsize = (14, 6)) # фигура для графиков
plt.subplot(1, 2, 1) # создает 1 график на 1 фигуре с 2 столбцами
plt.scatter(x, raw_data, color = 'blue', label = 'Z трансформация') # строим точки по координатам x и raw_data
plt.plot(x, y_pred_raw, color='orange', label='Линейная регрессия') # Линия регрессии
plt.title('Исходные данные регрессии')
plt.xlabel('индекс')
plt.ylabel('Z значение')
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.tight_layout() # улучшает расположение графиков
plt.show()
❤🔥1🤯1🤓1