МАШИННОЕ ОБУЧЕНИЕ
Полу-контролируемое обучение с кластеризацией 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%.
Несмотря на то, что производительность модели, обученной на центроидах кластера, лучше, чем у модели, обученной на случайных точках данных, улучшение ограничено. Это можно интерпретировать как то, что игровая статистика игроков на одной и той же позиции может сильно отличаться в текущей НБА.
Использованная литература:
Надеюсь, вы найдете эту короткую статью полезной! Ваше здоровье!