или "Что такое pandas, sklearn и как с этим жить"
"Jupyter Notebook — это как тетрадь, только магия работает внутри ячеек."
— программист с кофе и 14 открытыми вкладками Stack Overflow
📦 Что нам понадобится?
Перед тем как начать строить модель, нужно собрать инструменты. И нет, отвертки не подойдут. Нам нужны:
- Jupyter Notebook — наша интерактивная лаборатория.
- pandas — библиотека для работы с табличками (в духе Excel, но лучше).
- scikit-learn (sklearn) — мощная библиотека машинного обучения.
- matplotlib/seaborn — графики, визуализация, всё как мы любим.
Запускаем Jupyter Notebook и поехали 🚀
📘 Первая реальная задача: Предсказание оценок студентов
💡 Сценарий:
У нас есть данные: сколько часов студент учился, сколько проспал, сколько играл в Dota — и итоговая оценка. Мы хотим предсказать, сколько баллов он наберёт на экзамене.
🔨 Шаг 1: Подготовим данные
import pandas as pd
# Загружаем данные (или создаём прямо в коде)
data = pd.DataFrame({
"hours_study": [1, 2, 3, 4, 5, 6, 7],
"hours_sleep": [8, 7, 6, 6, 5, 5, 4],
"hours_dota": [5, 4, 3, 2, 2, 1, 0],
"score": [50, 55, 60, 70, 75, 85, 95]
})
# Показываем, что у нас в табличке
data.head()
👉 Комментарий: DataFrame — это как Excel в Python: таблица с колонками. Мы создали мини-опрос студентов и их оценки.
🔍 Шаг 2: Визуализируем данные
import seaborn as sns
import matplotlib.pyplot as plt
# Строим корреляционную матрицу
sns.heatmap(data.corr(), annot=True, cmap="coolwarm")
plt.title("Корреляции между признаками")
plt.show()
👉 Комментарий: Видим, что "учёба" и "оценка" хорошо коррелируют, а "Dota" — наоборот, чем больше Dota, тем меньше баллов 😅
🧠 Шаг 3: Обучим модель
from sklearn.linear_model import LinearRegression
# Признаки (X) и целевая переменная (y)
X = data[["hours_study", "hours_sleep", "hours_dota"]]
y = data["score"]
# Создаём и обучаем модель
model = LinearRegression()
model.fit(X, y)
👉 Комментарий: LinearRegression — простая модель, которая учится находить зависимость вида:
score = a * hours_study + b * hours_sleep + c * hours_dota + d
🤖 Шаг 4: Предсказываем
# Пример нового студента
new_student = pd.DataFrame({
"hours_study": [5],
"hours_sleep": [6],
"hours_dota": [1]
})
# Прогноз
prediction = model.predict(new_student)
print(f"Предсказанная оценка: {prediction[0]:.1f} баллов")
👉 Комментарий: Модель сама рассчитала балл по формуле, которую выучила на прошлых примерах.
🔁 Ещё 4 примера, чтобы закрепить 🔥
🧾 Пример 2: Предсказание зарплаты по опыту (лайт версия)
exp_data = pd.DataFrame({
"years_experience": [0.5, 1, 2, 3, 4, 5],
"salary_k": [30, 35, 45, 55, 65, 75]
})
X = exp_data[["years_experience"]]
y = exp_data["salary_k"]
model = LinearRegression()
model.fit(X, y)
print(f"Прогноз зарплаты при 2.5 годах опыта: {model.predict([[2.5]])[0]:.1f} тыс руб.")
👉 Комментарий: Чем больше опыта, тем выше з/п. Модель это легко схватывает.
📦 Пример 3: Классификация — поступит ли студент
from sklearn.linear_model import LogisticRegression
admit_data = pd.DataFrame({
"GPA": [2.5, 3.0, 3.5, 3.8, 4.0, 4.2],
"Passed": [0, 0, 1, 1, 1, 1]
})
X = admit_data[["GPA"]]
y = admit_data["Passed"]
model = LogisticRegression()
model.fit(X, y)
# Прогноз для студента с GPA 3.3
print("Поступит" if model.predict([[3.3]])[0] == 1 else "Не поступит")
👉 Комментарий: Это уже классификация, а не регрессия. Модель решает: 0 или 1 — поступит или нет.
💬 Пример 4: Предсказание отзыва — положительный или негативный
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB
reviews = ["отличный фильм", "ужасный фильм", "неплохой, но затянутый", "прекрасно!", "скучно"]
labels = [1, 0, 1, 1, 0]
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(reviews)
model = MultinomialNB()
model.fit(X, labels)
test_review = vectorizer.transform(["фильм был отличный"])
print("Положительный отзыв" if model.predict(test_review)[0] == 1 else "Негативный отзыв")
👉 Комментарий: Учим модель "понимать" текст. CountVectorizer превращает слова в числа.
⚡ Пример 5: Определение кредитного риска (mini-продуктовый кейс)
risk_data = pd.DataFrame({
"age": [25, 45, 35, 50, 23],
"salary": [30000, 80000, 50000, 120000, 25000],
"debt": [0, 1, 0, 1, 1],
"approved": [1, 0, 1, 0, 0]
})
X = risk_data[["age", "salary", "debt"]]
y = risk_data["approved"]
model = LogisticRegression()
model.fit(X, y)
new_applicant = [[30, 60000, 0]]
print("Кредит одобрен" if model.predict(new_applicant)[0] == 1 else "Отказ")
👉 Комментарий: Уже ближе к реальному продукту: модель смотрит на профиль клиента и принимает решение.
🧮 А что под капотом?
Все эти модели:
- Ищут закономерности в данных
- Строят математическую модель
- Предсказывают результат для новых случаев
И это всё можно делать с помощью sklearn и pandas — без матана и боли.
🎯 Выводы
- Вы уже можете строить модели!
- Jupyter + pandas + sklearn = ваш новый лучший друг
- Всё, что нужно — немного данных, логика и пара строчек кода
- ML — это не сложно. Это структурированное здравомыслие
⏭ Что дальше?
Часть 3 "От очистки до прогноза — весь путь данных. Чистим, нормализуем, тренируем. Метрики качества и «что делать, если модель тупит»"