🔹 Часть 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 причин:
- Мало данных. 20 строк — не магия, а гадание.
- Плохие признаки. Модель не волшебник. Дай ей инфу.
- Не тот алгоритм. Попробуй другую модель: RandomForest, DecisionTree, XGBoost.
- Переобучение. Научилась идеально угадывать на обучающих — и мажет в жизни.
- Данные не обработаны. Категориальные переменные не закодированы, скейлинг пропущен и т.д.
🧪 Задача 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-пути
✅ Данные собрали
✅ Пропуски убрали
✅ Всё нормализовали
✅ Модель выбрали и обучили
✅ Метрики проверили
✅ Поняли, где тупим — и улучшили