Здесь следует отметить несколько моментов.
Во-первых, нормализация 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
и использовать ее вместо того, чтобы делать это вручную, по разным причинам:
- Меньше шансов ошибиться, поскольку вам приходится меньше печатать.
sklearn
будет, по крайней мере, столь же эффективным с точки зрения вычислений, а часто и более. - Вы должны использовать те же параметры масштабирования, что и при обучении тестовым данным, чтобы избежать утечки информации тестовых данных. (В большинстве реальных применений это маловероятно, но это хорошая практика.) При использовании
sklearn
вам не нужно хранить min / max / mean / SD et c. от масштабирования обучающих данных для последующего повторного использования на тестовых данных. Вместо этого вы можете просто использовать scaler.fit_transform(X_train)
и scaler.transform(X_test)
. - Если вы хотите позже изменить масштабирование, вы можете использовать
scaler.inverse_transform(data)
.
Я уверен Есть и другие причины, но это основные, которые приходят на ум.