> Как кодировать признак рейтинг от 1 до 5 (Go)

Уровень: senior · Роль: backend · Категория: Технические вопросы

Компании: Автомакон

Стек: Go

> Пример ответа

Короткий ответ

Рейтинг от 1 до 5 - это порядковая категориальная переменная. Для линейных моделей кодируйте как ordinal (1,2,3,4,5) или one-hot, если важна нелинейность. Для tree-based моделей оставьте как есть. В Go при работе с ML-моделями обычно используют числовое представление int8 или float32 и нормализацию при необходимости. Главное - не кодировать как строку и не использовать label encoding для неупорядоченных категорий.

Подробное объяснение

Рейтинг 1-5 имеет естественный порядок, но расстояния между значениями не обязательно равны (разница между 1 и 2 может быть не такой, как между 4 и 5). Это важно учитывать:

  • Ordinal encoding (1,2,3,4,5) - подходит для линейных моделей, если предполагается монотонная зависимость. Модель увидит, что 5 > 1, но будет считать разницу равной 4.
  • One-hot encoding - создаёт 5 бинарных признаков. Позволяет модели выучить произвольную нелинейную зависимость, но увеличивает размерность и теряет порядок.
  • Binary encoding - для 5 значений можно использовать 3 бита (001, 010, 011, 100, 101). Компактнее one-hot, но менее интерпретируемо.
  • Target encoding - замена на среднее целевой переменной по группе. Работает хорошо, но требует аккуратной кросс-валидации для избежания утечек.

Для tree-based моделей (Random Forest, XGBoost) порядковое кодирование оптимально - деревья сами найдут нужные разбиения. Для нейросетей часто используют embedding слой, но для 5 значений это избыточно.

В Go, если вы пишете сервис предсказаний, рейтинг обычно приходит как JSON-число. Храните как int8 (диапазон 1-5) и конвертируйте в float32 перед передачей в модель. Если используете библиотеки типа gorgonia или onnxruntime, убедитесь, что тип данных совпадает с ожидаемым моделью.

На практике

  • Для рекомендательных систем и рейтинговых моделей часто используют ordinal encoding с последующей нормализацией до [0,1] - это сохраняет порядок и масштабирует признак.
  • Если рейтинг - это целевая переменная (например, предсказание оценки), задача становится регрессией или упорядоченной классификацией. Для последней используйте специальные loss-функции (ordinal regression).
  • При работе с пользовательскими данными проверяйте валидность: рейтинг может быть 0 или отсутствовать. Обрабатывайте пропуски отдельно (например, отдельное значение -1 или медиана).
  • В Go для сериализации в ML-форматы (ONNX, TensorFlow) используйте []float32 - это стандарт для большинства рантаймов.

Пример кода

GO
package main
import (
"fmt"
"math"
)
// Rating представляет рейтинг 1-5
type Rating int8
// ToFloat32 конвертирует в float32 для ML-модели
func (r Rating) ToFloat32() float32 {
if r < 1 || r > 5 {
return 0 // или обработать как ошибку
}
return float32(r)
}
// Normalized возвращает значение в диапазоне [0,1]
func (r Rating) Normalized() float32 {
return (float32(r) - 1) / 4
}
// OneHot возвращает one-hot вектор длины 5
func (r Rating) OneHot() []float32 {
if r < 1 || r > 5 {
return make([]float32, 5)
}
result := make([]float32, 5)
result[r-1] = 1.0
return result
}
func main() {
rating := Rating(4)
fmt.Printf("raw: %.1f, normalized: %.2f, one-hot: %v\n",
rating.ToFloat32(), rating.Normalized(), rating.OneHot())
// Проверка на NaN/Inf для безопасности
if math.IsNaN(float64(rating.ToFloat32())) {
panic("invalid rating")
}
}

Как отвечать на собеседовании

Начните с уточнения: для какой модели и задачи? Это покажет системное мышление. Затем кратко перечислите варианты кодирования с trade-off. Обязательно упомяните, что порядковое кодирование подходит для большинства случаев, но one-hot оправдан, если есть основания для нелинейности. Приведите пример из практики: как вы обрабатывали рейтинги в реальном проекте. Если спросят про Go - расскажите про типы данных, валидацию и конвертацию для ONNX/TensorFlow.

Что проверяет интервьюер

  • Понимание разницы между категориальными и порядковыми признаками.
  • Умение выбирать кодирование под конкретную модель.
  • Осознание trade-off между интерпретируемостью, размерностью и качеством.
  • Практические навыки: обработка пропусков, валидация, типы данных.
  • Для senior - способность обосновать выбор и предвидеть проблемы (например, утечка данных при target encoding).

Типичные ошибки

  • Использование label encoding (0,1,2,3,4) для неупорядоченных категорий - здесь не ошибка, но часто путают с one-hot.
  • Применение one-hot для рейтинга без необходимости - раздувает фичи и теряет порядок.
  • Игнорирование пропусков: рейтинг может быть null, и это отдельный сигнал.
  • Нормализация до [0,1] без учёта, что модель может ожидать другой диапазон.
  • В Go - использование int вместо int8 и потеря точности при конвертации в float32.
  • Непроверка границ: рейтинг 0 или 6 ломает one-hot индексацию.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью