Онлайн час в Google Meet
Лого на 91. НЕГ „Проф. Константин Гълъбов“

12. клас · Избираем модул · Урок 12

Данни за машинно обучение

Ред = пример, колона = признак, последната колона = етикет. Числови и категорийни признаци, обучаваща и тестова извадка и SQL заявката, която превръща базата в таблица за модел.

Всичко започва от таблица

Миналия час решихте, че задачата ви е класификация или регресия. Каквото и да прави моделът, данните му се свеждат до една таблица — и за ваше щастие вие умеете да правите таблици по-добре от повечето хора, които се занимават с машинно обучение: с SELECT.

broi_ocenkisrednanay_niskaklasvisok_uspeh25.755.511А124.254.011А023.753.511Б025.755.511В1признаци X (вход)етикет y (изход)примери
Един ред е един пример. Колоните преди последната са признаците, последната е етикетът. Таблицата е получена от учебната база с една заявка (по-долу).

Пример (ред)

Един конкретен обект, за който имаме данни: един ученик, един клиент, една книга. Точно един ред на обект — не един ред на оценка.

Признак (feature, колона)

Едно измеримо свойство на примера: брой оценки, средна оценка, клас, дни от последната поръчка.

Етикет (label, целева променлива)

Отговорът, който искаме моделът да научи да дава: „висок успех“ да / не, цената, диагнозата.

Числови и категорийни признаци

ВидПримерКакво може да се прави
Числовсредна оценка 5.25, площ 68 м²сравнява се, събира се, има разстояние
Категориенклас „11А“, район „Център“само равно / различно
Подреденразмер S/M/L, оценка слаб → отличенсравнява се, но разликите не са равни
Двоиченима ли отсъствия: да/не0 или 1

Кодиране на категориите

Повечето алгоритми смятат с числа, а разстояние между „11А“ и „11В“ няма смисъл. Затова категорийният признак се кодира: една колона „клас“ с три стойности става три колони klas_11A, klas_11B, klas_11V с 0 или 1 (one-hot кодиране). Orange го прави сам, когато обяви колоната за категорийна; в SQL го правите с CASE WHEN.

Обучаваща и тестова извадка

Представете си съученик, който е получил контролното предварително и е запаметил отговорите. На това контролно взима шест. Знае ли материала? Ще разберем само ако му дадем друго контролно. С модела е същото: ако го проверим върху редовете, с които е обучен, мерим паметта му, а не способността му да се справя с нови случаи.

всички редове (разбъркани)80% — обучаваща (train)20% test— моделът я вижда само веднъжРазделяте преди всякаква обработка, която гледа цялата таблица.
Обичайното деление е 80/20. Тестовите редове моделът вижда само веднъж — при окончателната оценка.

Обучаваща извадка (train)

Частта, от която моделът се учи. Обикновено 70–80% от примерите.

Тестова извадка (test)

Останалите 20–30%, върху които се измерва колко добре моделът се справя с невиждани примери.

  • Разделянето е случайно. Ако таблицата е подредена по клас и отрежете последните 20%, тестът ще съдържа само 11В.
  • Двете извадки не се пресичат — един ученик е или в едната, или в другата.
  • Разделяте първо, обработвате после: средната стойност за запълване на липси се смята само от обучаващата част.

От базата към таблицата — с една заявка

В базата един ученик е един ред в students, но има много редове в marks. Таблицата за модела иска точно един ред на ученик, затова оценките се агрегират — познатите ви COUNT, AVG, MIN с GROUP BY по обекта. Ето заявката, която направи таблицата от началото на урока (учебната база от приложението):

SELECT
    s.id                                        AS uchenik,
    c.name                                      AS klas,
    COUNT(m.id)                                 AS broi_ocenki,
    ROUND(AVG(m.mark), 2)                       AS sredna,
    MIN(m.mark)                                 AS nay_niska,
    COUNT(DISTINCT m.subject_id)                AS broi_predmeti,
    CASE WHEN s.grade >= 5.00 THEN 1 ELSE 0 END AS visok_uspeh
FROM students s
JOIN classes c      ON c.id = s.class_id
LEFT JOIN marks m   ON m.student_id = s.id
GROUP BY s.id, c.name
ORDER BY s.id;
  • LEFT JOIN, а не JOIN — ученик без оценки също е пример (с broi_ocenki = 0). При него sredna е NULL; ще решите дали да го запълните с COALESCE(AVG(m.mark), 0) или да махнете реда.
  • CASE WHEN прави етикета — 1 или 0 — от колона на базата. Самата grade не е в списъка на признаците.
  • uchenik е идентификатор, не признак — в Orange го обявявате като meta, за да не влезе в модела.

Колко данни са нужни

Точен отговор няма, но има ориентир: колкото по-сложна е закономерността и колкото повече признаци има, толкова повече примери трябват. Учебната база има 9 ученици — това стига да разберете механиката, но не и да обучите нещо смислено. За задача с 4–5 признака и 2 класа искате поне стотици редове. И винаги е по-добре 200 внимателно направени реда, отколкото 20 000 с грешни етикети.

Какво трябва да запомниш

  • Ред = пример (един обект), колона = признак, последната колона = етикет; X и y.
  • Категорийните признаци се кодират с 0/1 колони, не с 1, 2, 3; id не е признак.
  • Таблицата за модел се прави с GROUP BY по обекта и агрегации — една заявка, един ред на обект.
  • Етикетът се прави с CASE WHEN; колоната, от която е направен, не остава сред признаците (изтичане).
  • Разделяте случайно на 80% обучаваща и 20% тестова извадка преди всякаква обработка; тестът се вижда веднъж.