le.transform () ValueError: y содержит ранее невидимые метки: [1, 2, 3, 4] - PullRequest
0 голосов
/ 17 апреля 2020

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

from sklearn.preprocessing import LabelEncoder
import pickle as cPickle
import numpy as np

df_test = pd.DataFrame({'A': [1, 2, 3, 4],
                   'B': ["Yes", "No", "Yes", "Yes"],
                   'C': ["Yes", "No", "No", "Yes"],
                   'D': ["No", "Yes", "No", "Yes"]})

le = LabelEncoder()
df_test['A'] = le.fit_transform(df_test['A'])
le_dict = dict(zip(le.classes_, le.transform(le.classes_)))
class_name = 'classes_' +'A' + '.npy'
np.save(class_name, le_dict, allow_pickle=True)

print(df_test)
print(le.classes_)

le.classes_ = np.load('classes_A.npy', allow_pickle = True)

print(le.classes_)

df_new = pd.DataFrame({'A': [1, 2, 3, 4],
                   'B': ["Yes", "No", "Yes", "Yes"],
                   'C': ["Yes", "No", "No", "Yes"],
                   'D': ["No", "Yes", "No", "Yes"]})

df_new['A'] = le.transform(df_new['A'])

Это дает мне следующую ошибку:


  File "<ipython-input-42-a1aa630ec7e8>", line 1, in <module>
    df_new['A'] = le.transform(df_new['A'])

  File "/Users/pooja.shah/opt/anaconda3/envs/signals_gcp_py36/lib/python3.6/site-packages/sklearn/preprocessing/label.py", line 257, in transform
    _, y = _encode(y, uniques=self.classes_, encode=True)

  File "/Users/pooja.shah/opt/anaconda3/envs/signals_gcp_py36/lib/python3.6/site-packages/sklearn/preprocessing/label.py", line 110, in _encode
    return _encode_numpy(values, uniques, encode)

  File "/Users/pooja.shah/opt/anaconda3/envs/signals_gcp_py36/lib/python3.6/site-packages/sklearn/preprocessing/label.py", line 49, in _encode_numpy
    % str(diff))

ValueError: y contains previously unseen labels: [1, 2, 3, 4]

Когда я печатаю le.classes_ перед загрузкой из памяти, это выглядит так: array([1, 2, 3, 4])

Но когда я печатаю его после np.load (), это выглядит так: {1: 0, 2: 1, 3: 2, 4: 3}

Вот еще немного информации о le.classes после np.load():

In []: le.classes_
Out[]: array({1: 0, 2: 1, 3: 2, 4: 3}, dtype=object)

In []: type(le.classes_)
Out[]: numpy.ndarray

In []: print(le.classes_)
Out[]: {1: 0, 2: 1, 3: 2, 4: 3}

Я пытаюсь понять, что происходит, как работают эти функции. Я запустил тот же код, но для col.B, и я получаю еще одну ошибку.

from sklearn.preprocessing import LabelEncoder
import pickle as cPickle
import numpy as np

df_test = pd.DataFrame({'A': [1, 2, 3, 4],
                   'B': ["Yes", "No", "Yes", "Yes"],
                   'C': ["Yes", "No", "No", "Yes"],
                   'D': ["No", "Yes", "No", "Yes"]})

le = LabelEncoder()
df_test['B'] = le.fit_transform(df_test['B'])
le_dict = dict(zip(le.classes_, le.transform(le.classes_)))
class_name = 'classes_' +'B' + '.npy'

np.save(class_name, le_dict, allow_pickle=True)

print(df_test)
print(le.classes_)

le.classes_ = np.load('classes_B.npy', allow_pickle = True)

print(le.classes_)

df_new = pd.DataFrame({'A': [1, 2, 3, 4],
                   'B': ["Yes", "No", "Yes", "Yes"],
                   'C': ["Yes", "No", "No", "Yes"],
                   'D': ["No", "Yes", "No", "Yes"]})

df_new['B'] = le.transform(df_new['B'])

Ошибка с этим TypeError: argument must be a string or number.

Вот полный стек:

Traceback (most recent call last):

  File "<ipython-input-71-a0243d411c34>", line 1, in <module>
    df_new['B'] = le.transform(df_new['B'])

  File "/Users/pooja.shah/opt/anaconda3/envs/signals_gcp_py36/lib/python3.6/site-packages/sklearn/preprocessing/label.py", line 257, in transform
    _, y = _encode(y, uniques=self.classes_, encode=True)

  File "/Users/pooja.shah/opt/anaconda3/envs/signals_gcp_py36/lib/python3.6/site-packages/sklearn/preprocessing/label.py", line 107, in _encode
    raise TypeError("argument must be a string or number")

TypeError: argument must be a string or number

Любая помощь приветствуется!

1 Ответ

0 голосов
/ 18 апреля 2020

учитывая, что le.classes_ теперь словарь, вы можете просто сделать:

df_new['A'] = df_new['A'].map(le.classes_)
...