Я работал над нисходящей задачей, зависящей от порядка меток классов классификатора. И по некоторым причинам мне действительно нужно изучить интерфейсы и детали реализации. Вот некоторые детали, о которых вы могли не знать. В этом посте я буду использовать MLPClassifier в качестве примера.

Нецелочисленные метки можно использовать напрямую

Как правило, классификационные метки, подаваемые в нейронные сети, должны быть целыми числами. А со Sklearn LabelEncoder может легко кодировать целевые значения y в значения от 0 до n_classes-1.

from sklearn import preprocessing
le = preprocessing.LabelEncoder()
targets = ["red", "yellow", "blue", "red", "red"]
le.fit(targets)

Затем вы можете использовать кодировщик меток для простого преобразования целей.

le.transform(targets)
>> array([1, 2, 0, 1, 1])

А к исходным меткам классов можно получить доступ через

le.classes_
>> array(['blue', 'red', 'yellow'], dtype='<U6')

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

clf = MLPClassifier(hidden_layer_sizes=256, activation='relu')
labels = [random.choice(["ayes", "nooo00"]) for _ in range(2500)]
x = []
for label in labels:
    if label == "ayes":
        x.append(np.asarray(torch.randn(128, dtype=torch.float) + 5))
    else:
        x.append(np.asarray(torch.randn(128, dtype=torch.float) - 5))
clf.fit(np.asarray(x), np.asarray(labels))

Доступ к меткам класса и заказы?

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

clf.classes_
>> array(['ayes', 'nooo00'], dtype='<U6')

Порядок меток в атрибуте class_ — это порядок, используемый для обучения классификатора. В приведенном выше случае метка «yes» — это метка 0, а «nooo00» — метка 1.

Сопоставленные ярлыки на самом деле сортируются в алфавитном порядке, а не в порядке их появления. И такой порядок сохраняется, если вы используете LabelEncoder для автоматического преобразования меток.

targets = ["red", "yellow", "blue", "red", "red"]
le.fit(targets)
le.classes_
>> array(['blue', 'red', 'yellow'], dtype='<U6')

В приведенном выше примере, несмотря на то, что первая метка, с которой сталкивается LabelEncoder, является «красной», индексу присваивается значение 1 вместо 0.