Функция ручной нормализации занимает слишком много времени для выполнения

Я пытаюсь реализовать функцию нормализации вручную, а не использовать метод обучения scikit. Причина в том, что мне нужно определить максимальные и минимальные параметры вручную, а обучение scikit не позволяет это изменение.

Я успешно реализовал это, чтобы нормализовать значения от 0 до 1. Но это занимает очень много времени.

Вопрос: Есть ли другой эффективный способ сделать это? Как сделать так, чтобы это выполнялось быстрее.

Ниже показан мой код:

scaled_train_data = scale(train_data)

def scale(data):
    for index, row in data.iterrows():
        X_std = (data.loc[index, "Close"] - 10) / (2000 - 10)
        data.loc[index, "Close"] = X_std

    return data

2000 и 10 — это атрибуты, которые я определил вручную, а не брал минимальное и максимальное значение набора данных.

Заранее спасибо.


person Suleka_28    schedule 17.10.2018    source источник


Ответы (2)


Почему петля? Вы можете просто использовать

train_data['close'] = (train_data['close'] - 10)/(2000 - 10) 

использовать векторизованные функции numpy. Конечно, вы также можете поместить это в функцию, если хотите.

В качестве альтернативы, если вы хотите изменить масштаб до линейного диапазона, вы можете использовать http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MinMaxScaler.html. Преимущество этого заключается в том, что вы можете сохранить его, а затем таким же образом масштабировать тестовые данные.

person Jondiedoop    schedule 17.10.2018
comment
Спасибо, это сработало. Проблема с MinMAxScaler заключается в том, что я не хочу получать минимум и максимум в столбце данных. Я хочу поставить ручное обобщенное значение. scikit Learn автоматически берет минимум и максимум столбца и нормализует его. Поправьте меня если я ошибаюсь. Вот почему я подумал сделать это вручную - person Suleka_28; 17.10.2018
comment
Ну, вы можете добавить диапазон, до которого хотите масштабироваться, например: sklearn.preprocessing.MinMaxScaler(feature_range=(-1, 3)). Я не знаю, как вы выбрали числа 2000 и 10, но если вы выбрали их для масштабирования до определенного диапазона, вы можете использовать эту опцию. Насколько мне известно, вы не можете их ввести (вероятно, потому, что это уже однострочный код, как указано выше). - person Jondiedoop; 17.10.2018

Используйте матрицу numpy. Вы также можете установить минимум и максимум вручную.

import numpy as np
data = np.array(df)
_min = np.min(data, axis=0)
_max = np.max(data, axis=0)
normed_data = (data - _min) / (_max - _min)
person BAKE ZQ    schedule 17.10.2018
comment
цикл for и вычисление X_std каждого столбца по отдельности делает это очень долго. - person BAKE ZQ; 17.10.2018