Как нормализовать данные в кадре данных в диапазоне [0,1]? - PullRequest
0 голосов
/ 07 апреля 2020

Я пытаюсь реализовать статью, в которой используется набор данных о диабете индейцев PIMA. Это набор данных после вменения пропущенных значений:

Preg    Glucose     BP     SkinThickness    Insulin     BMI    Pedigree Age Outcome
0   1   148.0   72.000000   35.00000    155.548223  33.600000   0.627   50  1
1   1   85.0    66.000000   29.00000    155.548223  26.600000   0.351   31  0
2   1   183.0   64.000000   29.15342    155.548223  23.300000   0.672   32  1
3   1   89.0    66.000000   23.00000    94.000000   28.100000   0.167   21  0
4   0   137.0   40.000000   35.00000    168.000000  43.100000   2.288   33  1
5   1   116.0   74.000000   29.15342    155.548223  25.600000   0.201   30  0

Описание:

df.describe()
      Preg       Glucose        BP        SkinThickness  Insulin     BMI    Pedigree    Age
count768.000000 768.000000  768.000000  768.000000  768.000000  768.000000  768.000000  768.000000
mean0.855469    121.686763  72.405184   29.153420   155.548223  32.457464   0.471876    33.240885
std 0.351857    30.435949   12.096346   8.790942    85.021108   6.875151    0.331329    11.760232
min 0.000000    44.000000   24.000000   7.000000    14.000000   18.200000   0.078000    21.000000
25% 1.000000    99.750000   64.000000   25.000000   121.500000  27.500000   0.243750    24.000000
50% 1.000000    117.000000  72.202592   29.153420   155.548223  32.400000   0.372500    29.000000
75% 1.000000    140.250000  80.000000   32.000000   155.548223  36.600000   0.626250    41.000000
max 1.000000    199.000000  122.000000  99.000000   846.000000  67.100000   2.420000    81.000000

Описание нормализации из статьи выглядит следующим образом:

В рамках нашей предварительной обработки данных исходные значения данных масштабируются таким образом, чтобы они попадали в небольшой заданный диапазон значений [0,1], выполняя нормализацию набора данных. Это улучшит скорость и уменьшит сложность во время выполнения. Используя Z-показатель, мы нормализуем наш набор значений V, чтобы получить новый набор нормализованных значений V 'с помощью приведенного ниже уравнения: V' = VY / Z, где V '= новое нормализованное значение, V = предыдущее значение, Y = среднее значение и Z = стандартное отклонение

 z=scipy.stats.zscore(df)

Но когда я пытаюсь запустить приведенный выше код, я получаю отрицательные значения и значения больше единицы, т.е. не в диапазоне [0,1].

Ответы [ 3 ]

1 голос
/ 07 апреля 2020

Здесь следует отметить несколько моментов.

Во-первых, нормализация z-счета не приведет к особенностям в диапазоне [0, 1], если входные данные не имеют очень специфических c характеристик.

Во-вторых, как уже отмечали другие, двумя наиболее распространенными способами нормализации данных являются стандартизация и min-max масштабирование .

Настройка данных

import pandas as pd

df = pd.read_csv('https://raw.githubusercontent.com/jbrownlee/Datasets/master/pima-indians-diabetes.data.csv')

# For the purposes of this exercise, we'll just use the alphabet as column names
df.columns = list(string.ascii_lowercase)[:len(df.columns)]

$ print(df.head())

   a    b   c   d    e     f      g   h  i
0  1   85  66  29    0  26.6  0.351  31  0
1  8  183  64   0    0  23.3  0.672  32  1
2  1   89  66  23   94  28.1  0.167  21  0
3  0  137  40  35  168  43.1  2.288  33  1
4  5  116  74   0    0  25.6  0.201  30  0

Стандартизация


# print the minimum and maximum values in the entire dataset with a little formatting
$ print(f"Min: {standardised.min().min():4.3f} Max: {standardised.max().max():4.3f}")

Min: -4.055 Max: 845.307

Как видите, значения далеки от того, чтобы быть в [0, 1]. Обратите внимание, что диапазон результирующих данных от нормализации z-счета будет варьироваться в зависимости от распределения входных данных.

Мин-макс. Масштабирование

min_max = (df - df.values.min()) / (df.values.max() - df.values.min())

# print the minimum and maximum values in the entire dataset with a little formatting
$ print(f"Min: {min_max.min().min():4.3f} Max: {min_max.max().max():4.3f}")

Min: 0.000 Max: 1.000

Здесь мы действительно получаем значения в [ 0, 1].

Обсуждение

Эти и ряд других скейлеров существуют в модуле предварительной обработки sklearn . Я рекомендую прочитать документацию sklearn и использовать ее вместо того, чтобы делать это вручную, по разным причинам:

  1. Меньше шансов ошибиться, поскольку вам приходится меньше печатать.
  2. sklearn будет, по крайней мере, столь же эффективным с точки зрения вычислений, а часто и более.
  3. Вы должны использовать те же параметры масштабирования, что и при обучении тестовым данным, чтобы избежать утечки информации тестовых данных. (В большинстве реальных применений это маловероятно, но это хорошая практика.) При использовании sklearn вам не нужно хранить min / max / mean / SD et c. от масштабирования обучающих данных для последующего повторного использования на тестовых данных. Вместо этого вы можете просто использовать scaler.fit_transform(X_train) и scaler.transform(X_test).
  4. Если вы хотите позже изменить масштабирование, вы можете использовать scaler.inverse_transform(data).

Я уверен Есть и другие причины, но это основные, которые приходят на ум.

0 голосов
/ 07 апреля 2020

Если исходный кадр данных имеет формат df и у него нет недопустимых значений с плавающей запятой, это должно работать

df2 = (df - df.values.min()) / (df.values.max()-df.values.min())
0 голосов
/ 07 апреля 2020

Ваша формула стандартизации не имеет целью поместить значения в диапазон [0, 1].

Если вы хотите нормализовать данные, чтобы сделать их в таком диапазоне, вы можете использовать следующую формулу:

z = (actual_value - min_value_in_database)/(max_value_in_database - min_value_in_database)

И, сэр, вы не обязаны делать это вручную, просто используйте библиотеку sklearn , вы найдете различные методы стандартизации и нормализации в разделе предварительной обработки.

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