Что такое мета-признаки (meta-features) в машинном обучении?

Ответ

Мета-признаки (meta-features) — это признаки, которые описывают не сами объекты выборки, а свойства исходных признаков, объектов или датасета в целом. Они извлекаются из данных и добавляются к основным признакам для предоставления модели дополнительного контекста, что часто улучшает её обобщающую способность.

Основные типы мета-признаков:

  1. Статистические по объекту:
    • Среднее, медиана, стандартное отклонение значений признаков для данного объекта.
    • Количество пропущенных значений (NaN) в строке.
    • Количество нулей или выбросов в записи объекта.
  2. Статистические по признаку/датасету (чаще для AutoML):
    • Skewness (скошенность) и kurtosis (эксцесс) распределения признака.
    • Отношение числа объектов к числу признаков.
    • Процент категориальных признаков.
  3. Сложностные (complexity measures):
    • Оценка линейной разделимости классов.
    • Энтропия распределения целевой переменной.
  4. Сгенерированные моделью (model-based):
    • Важнейший тип на практике. Признаки, полученные на выходе других (часто более простых) моделей. Например, предсказания или вероятности от логистической регрессии, случайного леса или градиентного бустинга, обученных на тех же данных, используются как новые мета-признаки для финальной модели (стэкинг).
    • Расстояние до центроидов кластеров, полученных алгоритмом K-Means.

Пример создания мета-признаков (model-based):

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.cluster import KMeans

# Исходные данные
X = pd.DataFrame({'feat1': np.random.randn(100), 'feat2': np.random.randn(100)})
y = (X['feat1'] + X['feat2'] > 0).astype(int)

# 1. Мета-признак: предсказание случайного леса (out-of-fold для избежания leakage)
from sklearn.model_selection import cross_val_predict
rf = RandomForestClassifier(n_estimators=50, random_state=42)
X['meta_rf_pred'] = cross_val_predict(rf, X, y, cv=5, method='predict_proba')[:, 1]

# 2. Мета-признак: расстояние до кластеров
kmeans = KMeans(n_clusters=3, random_state=42).fit(X[['feat1', 'feat2']])
X['meta_cluster_dist'] = kmeans.transform(X[['feat1', 'feat2']]).min(axis=1)

# 3. Мета-признак: статистика по строке
X['meta_row_mean'] = X[['feat1', 'feat2']].mean(axis=1)
X['meta_row_std'] = X[['feat1', 'feat2']].std(axis=1)

print("DataFrame with meta-features:n", X.head())
# Теперь X содержит исходные признаки + 4 новых мета-признака

Применение: Feature engineering, стэкинг (stacking) моделей, автоматическое машинное обучение (AutoML) для характеристики датасетов.

Ответ 18+ 🔞

А, ну это же про мета-признаки, ёпта! Слушай, сейчас разжуёшь, что это за хитрая жопа такая в машинном обучении.

Представь себе: у тебя есть обычные признаки — рост, вес, зарплата. А мета-признаки — это как будто ты про эти признаки начинаешь рассказывать байки. Не про сам объект, а про его признаки, или про всю твою таблицу целиком. Это дополнительный контекст, который ты натягиваешь сверху, и модель от этого часто просто охуевает от счастья и начинает лучше работать. Волнение ебать!

Какие они бывают, эти чудеса?

  1. Статистика по строчке (по объекту):
    • Ну, среднее арифметическое всех цифр в строке. Медиана. Разброс (стандартное отклонение). Берёшь все признаки одного чувака и считаешь по ним статистику — вот тебе и мета-признак.
    • Сколько в его анкете пропусков (NaN). Если дохуя — это уже характеристика!
    • Сколько у него нулей или диких выбросов. Сам от себя охуел, наверное.
  2. Статистика по всему столбцу или датасету (чаще для AutoML, чтобы датасеты сравнивать):
    • Насколько распределение признака перекошено (skewness) или заострено (kurtosis). Пизда рулю, короче.
    • Соотношение, сколько у тебя строк на каждый признак. Или какой процент признаков — категориальные.
  3. Меры сложности датасета:
    • Насколько линейно у тебя классы разделяются. Или какая там энтропия у целевой переменной. Сложновато, но кому-то надо.
  4. Сгенерированные моделью — вот это, бля, самое пиздатое и часто используемое!
    • Вот тут внимание, ебать копать! Берёшь одну модель (пусть даже простую, хуй с горы), обучаешь её на своих данных, и её предсказания (или вероятности) записываешь как новый признак. Потом эту фигню подаёшь в свою основную, финальную модель. Это и есть основа стекинга (stacking), если что.
    • Или, например, кластеризуешь данные через K-Means, и для каждого объекта записываешь, как далеко он до ближайшего центра кластера. И это тоже мета-признак!

Смотри, как это выглядит в коде, на живом примере:

import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.ensemble import RandomForestClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.cluster import KMeans

# Допустим, есть какие-то рандомные данные
X = pd.DataFrame({'feat1': np.random.randn(100), 'feat2': np.random.randn(100)})
y = (X['feat1'] + X['feat2'] > 0).astype(int)

# 1. Мета-признак: предсказание случайного леса (ВАЖНО: out-of-fold, чтобы не было утечки!)
from sklearn.model_selection import cross_val_predict
rf = RandomForestClassifier(n_estimators=50, random_state=42)
X['meta_rf_pred'] = cross_val_predict(rf, X, y, cv=5, method='predict_proba')[:, 1]

# 2. Мета-признак: расстояние до ближайшего кластера
kmeans = KMeans(n_clusters=3, random_state=42).fit(X[['feat1', 'feat2']])
X['meta_cluster_dist'] = kmeans.transform(X[['feat1', 'feat2']]).min(axis=1)

# 3. Мета-признак: простая статистика по строке
X['meta_row_mean'] = X[['feat1', 'feat2']].mean(axis=1)
X['meta_row_std'] = X[['feat1', 'feat2']].std(axis=1)

print("DataFrame with meta-features:n", X.head())
# И вот теперь в X лежат старые два признака и четыре новых, сгенерированных нами мета-признака. Удивление пиздец!

Где это всё впаривают? Да везде, где нужен feature engineering! Стэкинг моделей — это вообще чистый их домен. Или в AutoML, чтобы автоматически понять, с каким датасетом ты имеешь дело. В общем, штука мощная, если применять с умом, а не просто так, чтобы было.