Может кодировать категориальные данные в наборе поездов, но не в тестовом наборе - PullRequest
0 голосов
/ 13 марта 2020

Мне нужно закодировать категориальные значения в моем тестовом наборе, так или иначе он выдает 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 Ответ

1 голос
/ 13 марта 2020

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

EDIT

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

...