МАШИННОЕ ОБУЧЕНИЕ

Полу-контролируемое обучение с кластеризацией K-средних

Пример использования частично контролируемого обучения прогнозированию позиций игроков НБА с ограниченными метками данных.

Обучение с учителем и обучение без учителя - две основные задачи в машинном обучении. Модели обучения с учителем используются, когда доступны выходные данные всех экземпляров, тогда как обучение без учителя применяется, когда у нас нет «истинного ярлыка».

Несмотря на то, что исследование обучения без учителя имеет огромный потенциал для будущих исследований, обучение с учителем все еще доминирует в этой области. Однако нередко нам нужно построить модель контролируемого обучения, когда у нас нет достаточного количества маркированных выборок в наших данных.

В таком случае можно принять во внимание полу-контролируемое обучение. Идея состоит в том, чтобы построить модель обучения с учителем, основанную на результатах процесса обучения без учителя.

Я хотел бы привести простой пример.

Вопрос: Можем ли мы классифицировать игроков НБА по их позициям на основе их игровой статистики?

Я собрал статистику игроков НБА по играм в сезоне 2018–2019. Позиции игроков определяются как обычные баскетбольные позиции: разыгрывающий (PG), атакующий защитник (SG), малый форвард (SF), мощный форвард (PF) и центр (C).

Перед процессом моделирования я провел некоторую предварительную обработку набора данных. Сначала удалите игроков, которые играли менее 10 минут за игру. Затем заполните значения NA 0 (например, центральные игроки никогда не бьют 3 указателя).

df_used = df_num.loc[df.MP.astype('float32') >= 10]
df_used.fillna(0,inplace=True)

После предварительной обработки данные выглядят следующим образом:

df_used.head()

Затем я разделил данные на набор для обучения и тестирования.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(df_used, labels_)

Обучение с учителем (указаны позиции всех игроков)

Если указаны все ярлыки (позиции игроков), это простая проблема контролируемой классификации. Я применил простую модель логистической регрессии к набору обучающих данных.

from sklearn.linear_model import LogisticRegression 
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
pipeline = Pipeline([
        ("scaler", StandardScaler()),
        ("log_reg", LogisticRegression()),
    ])
pipeline.fit(X_train, y_train)

Я оценил модель на тестовом наборе данных.

pipeline.score(X_test, y_test)

Эта процедура дает 0,644, что означает, что 64,4% прогнозов верны. Из этого результата мы знаем, что возможности для улучшения классификатора очень велики. Однако в этой статье я не останавливаюсь на развитии классификатора.

Я собираюсь рассказать о ситуации, когда метки данных видны лишь частично.

Полу-контролируемое обучение (даются только 100 позиций игроков)

Если мне разрешено видеть информацию о позиции только 100 игроков в тренировочных данных, как это повлияет на производительность модели? Существует множество стратегий, которые можно применить для выбора 100 игроков в качестве входных данных классификатора.

Первая стратегия - случайный выбор 100 игроков, например первых 100 игроков. Я проверил производительность модели логистической регрессии, обученной только на этом подмножестве.

n_labeled = 100
pipeline.fit(X_train[:n_labeled], y_train[:n_labeled])
pipeline.score(X_test, y_test)

На этот раз я получил только 56,8% точности. Это как и ожидалось, потому что я видел только подмножество настоящих ярлыков.

Однако можем ли мы улучшить производительность, выбрав другое подмножество из 100 меток? Ответ положительный.

Вторая стратегия заключается в применении процедуры обучения без учителя для кластеризации данных во всем наборе обучающих данных и отображения меток представителя каждого кластера. Таким образом, мы можем предположить, что точки данных, которые расположены близко друг к другу в пространстве кластеризации, должны иметь высокий шанс владеть одной и той же меткой.

Другими словами, игроки со схожей игровой статистикой должны играть одинаковую позицию на площадке.

from sklearn.cluster import KMeans
k=100
kmeans = KMeans(n_clusters=k)
X_dist = kmeans.fit_transform(X_train) 
representative_idx = np.argmin(X_dist, axis=0) 
X_representative = X_train.values[representative_idx]

В коде X_dist - это матрица расстояний до центроидов кластера. Репрезентативный_idx - это индекс точек данных, ближайших к центроиду каждого кластера.

После выбора представителей в пространстве признаков мы собрали истинные названия этих точек данных. Здесь мне просто нужно извлечь метки из необработанных данных.

y_representative = [list(y_train)[x] for x in representative_idx]

Однако учтите, что на практике мы не знаем какой-либо истинной метки, поэтому необходимо вручную пометить эти выбранные точки данных.

Давайте проверим производительность модели, обученной на этом подмножестве обучающих данных.

pipeline.fit(X_representative, y_representative)
pipeline.score(X_test, y_test)

У меня точность 59,6%! Несмотря на то, что он не сопоставим с моделью, обученной на всем обучающем наборе, он лучше, чем у случайно выбранных 100 точек данных.

Обсуждение

С развитием баскетбола становится все труднее и труднее определять позиции игроков на основе их игровой статистики. Вот почему у нас точность около 60%.

Несмотря на то, что производительность модели, обученной на центроидах кластера, лучше, чем у модели, обученной на случайных точках данных, улучшение ограничено. Это можно интерпретировать как то, что игровая статистика игроков на одной и той же позиции может сильно отличаться в текущей НБА.

Использованная литература:

  1. Практическое машинное обучение с помощью керасов scikit-learn и tensorflow
  2. Баскетбольная справка.

Надеюсь, вы найдете эту короткую статью полезной! Ваше здоровье!