Если вы используете Pandas для чтения и кодирования ваших данных, категории сортируются (как и sklearn, см. Ниже).
import pandas as pd
import io
txt = """
HR,HBP,Name
0,0,Tommy
0,1,Nolan
0,2,Tommy
1,1,Nolan"""
df = pd.read_csv(io.StringIO(txt), dtype={'Name': 'category'})
print(df)
HR HBP Name
0 0 0 Tommy
1 0 1 Nolan
2 0 2 Tommy
3 1 1 Nolan
Если вы посмотрите на коды, то увидите, что хотя Томми был упомянут первым, его кодировка равна 1, а у Нолана - 0.
print(df.Name.cat.codes)
0 1
1 0
2 1
3 0
dtype: int8
Если вы хотите получить все как словарь:
encoded_categories = dict(enumerate(df.Name.cat.categories))
print(encoded_categories)
{0: 'Nolan', 1: 'Tommy'}
Первоначальный ответ
Вы пометили вопрос с помощью scikit-learn
, поэтому я предполагаю, что вы используете LabelEncoder
с sklearn.preprocessing
. В этом случае значения действительно отсортированы.
Простой пример
from sklearn import preprocessing
le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])
fit
вызывает _encode
, который в случае Python list
или tuple
(или чего-либо, кроме массива) сортирует его перед кодированием. numpy массивы также сортируются с помощью numpy.unique
.
Вы можете проверить это через
print(le.classes_)
>> ['amsterdam' 'paris' 'tokyo']
Так в вашем случае
np.array_equal(le.fit(["healthy", "sick"]).classes_,
le.fit(["sick", "healthy"]).classes_)
>> True
np.array_equal(le.fit(["healthy", "sick"]).classes_,
le.fit(["sick", "healthy", "unknown"]).classes_)
>> False