Панды глубокое копирование и scikit выучить мин Макс скалер - PullRequest
0 голосов
/ 05 сентября 2018

Я пытаюсь сделать следующее

df = pd.read_csv('a.csv')
scaler = MinMaxScaler()

df_copy = df.copy(deep=True)

for i in range(1, len(df)):

  df_chunk = df_copy.iloc[i,i+10]

  df_chunk = scaler.fit_transform (df_chunk)

поэтому каждый df_chunk должен быть масштабированным фреймом данных.

Проблема в том, что некоторые не масштабируются правильно.

Если бы я планировал масштабированные точки данных, правильно масштабированный фрейм данных выглядел бы как диапазон чисел, разбросанных между 0 и 1, как бы равномерно. Но фреймы данных, которые я получаю, находятся в двух крайностях, причем первые ~ 80% чисел находятся в диапазоне 0,9, а остальные около диапазона 0,1.

Таким образом, создается впечатление, что первые ~ 80% данных были дважды масштабированы скейлером. Я уже пытался использовать глубокое копирование панд, чтобы решить эту проблему, но, похоже, это не помогает.

Если у вас есть идеи, почему?

Я был бы очень признателен.

1 Ответ

0 голосов
/ 05 сентября 2018

Я не совсем уверен, почему вы хотите применить скалер к фрагментам ваших данных. Если вы опасаетесь, что ваш CSV может быть слишком большим, вы захотите прочитать CSV по фрагментам в операции read_csv и обработать эти фрагменты.

Теперь к вашей проблеме. Вы настраиваете свой скейлер на каждом куске, поэтому вы получаете странные результаты. Либо вам нужно согласовать все данные с помощью вашего масштабатора, либо вам нужно согласовать данные в режиме онлайн, используя метод partial_fit.

Я предоставлю вам оба решения.

Решение № 1: прочитать и заполнить все данные

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

df = pd.read_csv('a.csv')
df_scaled = scaler.fit_transform(df)

Решение № 2: читать csv по кускам и онлайн-поезд

import pandas as pd
from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()

# first read the csv by chunks and update the scaler
for chunk in pd.read_csv('a.csv', chunksize=10):
    scaler.partial_fit(chunk)

# read the csv again by chunks to transform the chunks
for chunk in pd.read_csv('a.csv', chunksize=10):
    transformed = scaler.transform(chunk)
    # not too sure what you want to do after this
    # but you can either print the results of the transformation
    # or write the transformed chunk to a new csv
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...