Я работал над нисходящей задачей, зависящей от порядка меток классов классификатора. И по некоторым причинам мне действительно нужно изучить интерфейсы и детали реализации. Вот некоторые детали, о которых вы могли не знать. В этом посте я буду использовать 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.