Как выбрать или оптимизировать метки, чтобы получить лучшие результаты мультиклассовой классификации? - PullRequest
4 голосов
/ 20 июня 2020

Недавно я работал над проектом Kaggle «Prudential Life Insurance Assessment», где конкуренты говорят об изменении этикеток, чтобы получить более точные метрики. c.

В этом конкретном соревновании цель была 8 классов (1-8), но один из парней использует разные ярлыки (-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0) или другой пример они используют [-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0] вместо [1,2,3,4,5,6,7,8].

Мне было интересно, как придумать эти магические c числа?

Я готов получить любые идеи / уловки / предложения по выполнению таких преобразований. Мы высоко ценим вводимые данные!

Пример кода

# imports
import numpy as np
import pandas as pd
import seaborn as sns
import xgboost as xgb
from sklearn import metrics
from sklearn.model_selection import train_test_split

# data
df = sns.load_dataset('iris')
df['species'] = pd.factorize(df['species'])[0]
df = df.sample(frac=1,random_state=100)

# train test split
X = df.drop('species',axis=1)
y = df['species']
Xtrain,  Xtest, ytrain, ytest = train_test_split(X,y,stratify=y,random_state=100)

# modelling
model = xgb.XGBClassifier(objective='multi:softprob', random_state=100)
model.fit(Xtrain, ytrain)
preds = model.predict(Xtest)
kappa = metrics.cohen_kappa_score(ytest, preds, weights='quadratic')

print(kappa)

Мои мысли

  • Есть буквально бесконечные числа, которые могут принимать метки, как преобразовать * От 1023 * до [x-y]?

  • Должны ли мы просто случайным образом выбрать 8 чисел и проверить каппа для всех из них. Это кажется самой иррациональной мыслью и, вероятно, никогда не сработает.

  • Есть ли для этого какой-то метод градиентного спуска? Может быть, нет, просто идея.

Ссылки

1 Ответ

3 голосов
/ 25 июня 2020

Самая первая ссылка в вашем вопросе фактически содержит ответ:

# Жестко запрограммированные значения были получены путем оптимизации оценки CV с использованием имитации отжига

Также позже Комментарии автора:

Сначала я оптимизировал параметры один за другим, но затем я переключился на их оптимизацию одновременно путем комбинации поиска по сетке и имитации отжига. Я не уверен, что нашел глобальный максимум оценки CV, даже после экспериментов с различными настройками имитации отжига. Возможно, вам помогут алгоритмы geneti c.

Решение второй ссылки имеет те же значения, потому что (вероятно) автор скопировал их из первого решения (см. В своих комментариях):

Вдохновлено: https://www.kaggle.com/mariopasquato/prudential-life-insurance-assessment/linear-model/code

Проще говоря - вы можете просто рассматривать эти значения, как если бы они были метапараметрами вашего алгоритма обучения (ну, они ). Таким образом, вы можете определить функцию F(metaparameters) так, чтобы для вычисления одного ее значения вы выполняли полное обучение на своем обучающем наборе и выводили потери на проверочном наборе (или лучше просто использовать n-кратную перекрестную проверку и использовать потерю CV). Затем ваша задача сводится к оптимизации функции F таким образом, чтобы найти лучший набор метапараметров, используя любой метод оптимизации, который вам нравится - например, автор первого решения утверждает, что они использовали поиск по сетке и имитировали отжиг.

Small пример без мета-настройки для самой оптимизации:

import numpy as np
cnt = 0
def use_a_function_which_calls_training_and_computes_cv_instead_of_this(x):
    global cnt
    cnt += 1
    return ((x - np.array([-1.6, 0.7, 0.3, 3.15, 4.53, 6.5, 6.77, 9.0]))**2).sum()

my_best_guess_for_the_initial_parameters = np.array([1.,2.,3.,4.,5.,6.,7.,8.])
optimization_results = scipy.optimize.basinhopping(
    use_a_function_which_calls_training_and_computes_cv_instead_of_this,
    my_best_guess_for_the_initial_parameters,
    niter=100)
print("Times function was called: {0}".format(cnt))
print(optimization_results.x)

Пример вывода:

Times function was called: 3080
[-1.6         0.7         0.3         3.15        4.52999999  6.5
  6.77        8.99999999]

Возможно, вы захотите поэкспериментировать с параметрами самой оптимизации, возможно, даже напишите ваш настраиваемый оптимизатор и / или обратный вызов для выполнения шагов. Но также возможно, что даже параметры по умолчанию будут работать для вас хоть в какой-то степени. Если у вас слишком много времени на одно вычисление функции, вы можете, например, попытаться выполнить начальную оптимизацию с меньшим подмножеством ваших полных данных, et c.

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