Найти в Дзене
Анастасия Софт

🧠 Машинное обучение для обычных людей. 🔹 Часть 3. От очистки до прогноза — весь путь данных. Чистим, нормализуем, тренируем.

Оглавление

🔹 Часть 3. От очистки до прогноза — весь путь данных. Чистим, нормализуем, тренируем. Метрики качества и «что делать, если модель тупит»

или «Как спасти модель, когда она тупит»

"Грязные данные — грязный прогноз. Чистые данные — чистый... ну, почти."

— дата-сайентист, у которого опять не сошлась метрика

🧼 1. Всё начинается с грязи

Как бы это ни звучало, но данные всегда приходят грязными. Где-то пропущены значения, где-то в одной колонке и числа, и текст, а где-то вместо «муж» — «М», «мужчина», «чел», и всё это в одной таблице.

🧪 Задача 1: Очистка данных студентов

Данные:

import pandas as pd
import numpy as np

# Имитация "реальных" данных
data = pd.DataFrame({
"Name": ["Анна", "Борис", "Вася", "Гена", "Даша"],
"Hours_Study": [5, np.nan, 3, 4, 'пять'],
"Score": [90, 85, np.nan, 70, 75]
})

print(data)

🛠 Очистка:

# 1. Преобразуем 'пять' в число (если можем)
data["Hours_Study"] = pd.to_numeric(data["Hours_Study"], errors="coerce")

# 2. Заполним пропуски средним значением
data["Hours_Study"].fillna(data["Hours_Study"].mean(), inplace=True)
data["Score"].fillna(data["Score"].mean(), inplace=True)

print(data)

👉 Комментарий: errors="coerce" превращает всё нечисловое в NaN, а потом мы эти NaN заменяем средним. Просто, но эффективно.

📏 2. Нормализация и масштабирование

Модели любят, когда все признаки — примерно одного масштаба. Если один столбец — зарплаты в рублях (до миллиона), а другой — возраст (в годах), модель перекосит.

🧪 Задача 2: Масштабируем данные для модели

from sklearn.preprocessing import StandardScaler

df = pd.DataFrame({
"Age": [18, 25, 30, 45],
"Salary": [20000, 35000, 50000, 80000]
})

scaler = StandardScaler()
scaled = scaler.fit_transform(df)

# Вернём в DataFrame
scaled_df = pd.DataFrame(scaled, columns=df.columns)
print(scaled_df)

👉 Комментарий: Теперь у каждого признака — среднее 0 и стандартное отклонение 1. Модель скажет вам спасибо.

🧠 3. Обучение модели и предсказание

🧪 Задача 3: Предсказываем баллы по данным студентов

from sklearn.linear_model import LinearRegression

X = data[["Hours_Study"]]
y = data["Score"]

model = LinearRegression()
model.fit(X, y)

# Прогноз
prediction = model.predict([[4]])
print(f"Предсказанная оценка при 4 часах учёбы: {prediction[0]:.1f}")

👉 Комментарий: Мы прошли полный путь: очистили, масштабировали, обучили — и получили предсказание.

📉 4. Метрики качества: насколько модель хороша?

Модель предсказала 78, а на деле было 90. Хорошо ли это?

🧪 Задача 4: Считаем метрики

from sklearn.metrics import mean_absolute_error, mean_squared_error, r2_score

# Реальные и предсказанные оценки
y_true = [90, 85, 80, 75]
y_pred = [88, 84, 82, 74]

mae = mean_absolute_error(y_true, y_pred)
mse = mean_squared_error(y_true, y_pred)
r2 = r2_score(y_true, y_pred)

print(f"MAE: {mae:.2f}")
print(f"MSE: {mse:.2f}")
print(f"R²: {r2:.2f}")

👉 Комментарий:

  • MAE — средняя ошибка. Ниже — лучше.
  • MSE — то же, но квадраты. Ещё сильнее наказывает за ошибки.
  • R² (коэффициент детерминации) — показывает, насколько модель вообще объясняет данные. От 0 до 1 (а иногда и в минус 🙃).

🛠️ 5. Когда модель тупит — что делать?

Вот топ-5 причин:

  1. Мало данных. 20 строк — не магия, а гадание.
  2. Плохие признаки. Модель не волшебник. Дай ей инфу.
  3. Не тот алгоритм. Попробуй другую модель: RandomForest, DecisionTree, XGBoost.
  4. Переобучение. Научилась идеально угадывать на обучающих — и мажет в жизни.
  5. Данные не обработаны. Категориальные переменные не закодированы, скейлинг пропущен и т.д.

🧪 Задача 5: Сравнение моделей

from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestRegressor

# Берём те же данные студентов
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

# Линейная модель
lr = LinearRegression()
lr.fit(X_train, y_train)
lr_pred = lr.predict(X_test)

# Random Forest
rf = RandomForestRegressor()
rf.fit(X_train, y_train)
rf_pred = rf.predict(X_test)

# Сравним MAE
print("MAE (Linear):", mean_absolute_error(y_test, lr_pred))
print("MAE (Random Forest):", mean_absolute_error(y_test, rf_pred))

👉 Комментарий: Иногда простая модель работает отлично, иногда — лучше ансамбли. Всегда сравнивайте.

🧾 Итог: чеклист data science-пути

✅ Данные собрали

✅ Пропуски убрали

✅ Всё нормализовали

✅ Модель выбрали и обучили

✅ Метрики проверили

✅ Поняли, где тупим — и улучшили

⏭ Часть 4. Нейросети, но без боли. TensorFlow, Keras