Масштабирование данных для нейронной сети - PullRequest
2 голосов
/ 20 марта 2020

Я использовал последовательную модель в кератах для категориальной классификации.

данные:

x_train = np.random.random((5000, 20))
y_train = keras.utils.to_categorical(np.random.randint(10, size=(5000, 1)), num_classes=10)
x_test = np.random.random((500, 20))
y_test = keras.utils.to_categorical(np.random.randint(10, size=(500, 1)), num_classes=10)

важно масштабирование функции:

scaler = StandardScaler()
scaler.fit(x_train) 
x_train = scaler.transform(x_train) 
x_test = scaler.transform(x_test) 

модель

model = Sequential()
model.add(Dense(64, activation='relu', input_dim=20))
model.add(Dropout(0.5))
model.add(Dense(64, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(10, activation='softmax'))    

model.compile(loss='categorical_crossentropy',
              optimizer='adam',
              metrics=['accuracy'])

model.fit(x_train, y_train,
          epochs=100,
          batch_size=32)

данные для прогнозирования

z = np.random.random((9999000, 20)) 

Должен ли я масштабировать эти данные? Как масштабировать эти данные?

predictions = model.predict_classes(z)

Как вы видите, обучающие и тестовые образцы - это всего лишь несколько по сравнению с прогнозируемыми данными (z). Использование скейлера с x_train для перемасштабирования x_test кажется нормальным. Тем не менее, использование того же скейлера, на котором установлено только 5000 образцов для изменения масштаба z (9999000 образцов), кажется не совсем подходящим. Существуют ли лучшие практики в области глубокого обучения для решения этой проблемы?

Для классификаторов, не чувствительных к масштабированию объектов, у Линк-случайных лесов такой проблемы нет. Однако для глубокого изучения эта проблема существует.

Редактировать 1.

Данные обучения, показанные здесь, приведены только для примера. В реальной задаче данные обучения не приходят из одинакового (равномерного) распределения вероятностей. Сложно маркировать данные, и данные обучения имеют тенденцию к легкому маркированию. Только образцы легче маркировать.

1 Ответ

4 голосов
/ 20 марта 2020

Тем не менее, использование того же скейлера, в котором имеется только 5000 образцов для изменения масштаба z (9999000 образцов), кажется не в порядке.

Не ясно, почему вы так думаете. Это точно стандартная практика, то есть использование скалера, снабженного данными тренировки, как вы правильно сделали с данными теста:

z_scaled = scaler.transform(z) 
predictions = model.predict_classes(z_scaled)

Количество образцов (500 или 10 ^ 6) не делает любая разница здесь; важно, чтобы все эти данные (x и z) происходили из одного и того же распределения вероятностей. На практике (и для данных, которые все еще могут быть в будущем) это только предполагается (и одна из вещей, на которые нужно обратить внимание после развертывания модели, это точно, если это предположение не выполняется или перестает быть правильным через некоторое время). Но особенно здесь, когда ваши смоделированные данные поступают с точно таким же (равномерным) распределением вероятности, это совершенно правильно.

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