Пользовательская функция масштабирования удваивает длину (строк) pandas фрейма данных в python 3 - PullRequest
0 голосов
/ 09 июля 2020

Я не уверен, что это вопрос pandas specifici c, но я почти уверен, что он имеет какое-то отношение к функции cat в этом коде. Я относительно новичок в программировании, поэтому мой опыт довольно ограничен.

Я пытаюсь создать класс, который позволит мне выбирать столбцы данных, которые я хочу масштабировать. Пользовательская функция основана на модели Standard Scaler от skLearn. Всякий раз, когда я пытаюсь разделить свои данные на обучающие и тестовые наборы, я получаю сообщение об ошибке, в котором говорится, что длины фреймов данных не совпадают. Когда я проверяю размер фреймов данных перед масштабированием, они имеют одинаковую длину, однако после масштабирования входные данные удваиваются.

Я не уверен, как включить набор данных, поскольку он взят из csv, но у него есть индекс, который представляет собой уникальный идентификатор для каждой записи и четыре столбца:

  1. пол (1 или 2)
  2. возраст
  3. раса ( 1-7 дискретных)
  4. вариантов (0-7 дискретных)

Набор данных содержит около 6000 записей.

Любая помощь будет принята с благодарностью.

#### Creates binary targets and then removes 'options' column to eliminate multicolinearity
targets = np.where(df['options'] > 0, 1, 0)
df['targets'] = targets
df_targets = df.drop([options'], axis=1)

#### Creating Inputs
df_inputs = df_targets.iloc[:,:-1]

#### Scaling Inputs (Custom)
from sklearn.base import BaseEstimator, TransformerMixin
from sklearn.preprocessing import StandardScaler

class CustomScaler(BaseEstimator, TransformerMixin):

    def __init__(self, columns, copy=True, with_mean=True, with_std=True):
        self.scaler = StandardScaler(copy,with_mean,with_std)
        self.columns = columns
        self.mean_ = None
        self.var_ = None

    def fit(self, X, y=None):
        self.scaler.fit(X[self.columns], y)
        self.mean_ = np.mean(X[self.columns])
        self.var_ = np.var(X[self.columns])
        return self

    def transform(self, X, y=None, copy=None):
        init_col_order = X.columns
        X_scaled = pd.DataFrame(self.scaler.transform(X[self.columns]), columns = self.columns)
        X_not_scaled = X.loc[:,~X.columns.isin(self.columns)]
        return pd.concat([X_not_scaled, X_scaled], axis = 1)[init_col_order]

columns_to_omit = ['gender','race']
columns_to_scale = [x for x in df_inputs.columns.values if x not in columns_to_omit]

input_scaler = CustomScaler(columns_to_scale)

input_scaler.fit(df_inputs)

scaled_inputs = input_scaler.transform(df_inputs)

#### Splitting the Data
train_inputs, test_inputs, train_targets, test_targets = train_test_split(scaled_inputs, targets, train_size = 0.8, random_state = 144)

Вот ошибка, которую я получаю:

.............. in train_inputs, test_inputs, train_targets, test_targets = train_test_split ( scaled_inputs, targets, train_size = 0.8, random_state = 42) Файл "/home/sid/anaconda3/lib/python3.7/site-packages/sklearn/model_selection/_split.py", строка 2118, в массивах train_test_split = indexable (* массивы) Файл "/home/sid/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py", строка 248, в indexable check_consistent_length (* result) Файл "/home/sid/anaconda3/lib/python3.7/site-packages/sklearn/utils/validation.py", строка 212, в образцах check_consistent_length ":% r"% [int (l) для длины l]) ValueError: Найдены входные переменные с несовместимым количеством выборок: [12302, 6151]

1 Ответ

0 голосов
/ 09 июля 2020

Правильно ли написана первая строка?

targets = np.where(df['options'] > 0, 1, 0)

Думаю, должно быть что-то другое вместо 1.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...