Может кодировать категориальные данные в наборе поездов, но не в наборе тестов

Мне нужно закодировать категориальные значения в моем тестовом наборе, каким-то образом он бросает TypeError: argument must be a string or number. Я не знаю, почему это происходит, потому что я могу сделать это со своим поездом. Я имею в виду, что это набор функций для обучения / тестирования, поэтому они точно такие же, что отличает их, конечно, только количество строк. Я не знаю, как это исправить, я пробовал использовать разные LabelEncoder для каждого, но он все равно не исправляет ошибку. Пожалуйста, помогите мне.

Для вашей информации категориальные данные находятся в столбце 8 как в наборе функций для обучения, так и для тестирования.

import pandas as pd
import seaborn as sns
import numpy as np
import matplotlib.pyplot as plt
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder
from sklearn.ensemble import RandomForestRegressor
import scipy.stats as ss

avo_sales = pd.read_csv('avocados.csv')

avo_sales.rename(columns = {'4046':'small PLU sold',
                            '4225':'large PLU sold',
                            '4770':'xlarge PLU sold'},
                 inplace= True)

avo_sales.columns = avo_sales.columns.str.replace(' ','')

x = np.array(avo_sales.drop(['TotalBags','Unnamed:0','year','region','Date'],1))
y = np.array(avo_sales.TotalBags)

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

impC = SimpleImputer(strategy='most_frequent')
X_train[:,8] = impC.fit_transform(X_train[:,8].reshape(-1,1)).ravel()

imp = SimpleImputer(strategy='median')
X_train[:,1:8] = imp.fit_transform(X_train[:,1:8])

le = LabelEncoder()
X_train[:,8] = le.fit_transform(X_train[:,8])
X_test[:,8] = le.fit_transform(X_test[:,8])

1 ответ

Решение

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

РЕДАКТИРОВАТЬ

Когда вы используете fit_transform, например SimpleImputer(strategy='most_frequent') в ваших обучающих данных, вы в основном вычисляете наиболее частое значение, чтобы ввести его в строки, содержащие nan. Это хорошо. Если вы выполняете fit_transform в своем тестовом наборе, то это обман, потому что вы предполагаете, что у вас много экземпляров, из которых вычисляется наиболее частое значение (тогда как вместо этого вы можете прогнозировать только один экземпляр). Правильнее всего ввести недостающие данные, используя наиболее частое значение, которое вы нашли в обучающем наборе. Это делается с помощью только преобразования. Та же логика применяется ко всем остальным fit_transform / transform, которые вы можете найти в sklearn, например, при применении PCA или CountVectorizer.

Другие вопросы по тегам