sklearn.LabelEncoder, którego nigdy wcześniej nie widziałem

Jeślisklearn.LabelEncoder został zamontowany na zestawie treningowym, może się zepsuć, jeśli napotka nowe wartości, gdy jest używany w zestawie testowym.

Jedynym rozwiązaniem, jakie mogłem wymyślić, jest mapowanie wszystkiego, co nowe w zestawie testowym (tj. Nie należące do żadnej istniejącej klasy) do"<unknown>", a następnie jawnie dodaj odpowiednią klasę doLabelEncoder potem:

# train and test are pandas.DataFrame's and c is whatever column
le = LabelEncoder()
le.fit(train[c])
test[c] = test[c].map(lambda s: '<unknown>' if s not in le.classes_ else s)
le.classes_ = np.append(le.classes_, '<unknown>')
train[c] = le.transform(train[c])
test[c] = le.transform(test[c])

To działa, ale czy jest lepsze rozwiązanie?

Aktualizacja

Jak zauważa @sapo_cosmico w komentarzu, wydaje się, że powyższe nie działa już, biorąc pod uwagę, że zakładam, że zmiana implementacji wLabelEncoder.transform, który teraz wydaje się używaćnp.searchsorted (Nie wiem, czy tak było wcześniej). Więc zamiast dołączać<unknown> klasa doLabelEncoderlista już wyodrębnionych klas, należy ją wstawić w posortowanej kolejności:

import bisect
le_classes = le.classes_.tolist()
bisect.insort_left(le_classes, '<unknown>')
le.classes_ = le_classes

Jednakże, ponieważ wydaje się, że jest to dość niezgrabne, jestem pewien, że jest na to lepsze podejście.

questionAnswers(7)

yourAnswerToTheQuestion