Вопрос или проблема
Я пытаюсь построить классификационную модель. Признаки являются чисто булевыми (не бинарными) и находятся в csv-файле, как 1,0,1,..
Результат — это int
в диапазоне (0, 128).
Я подумал, имеет ли смысл не тратить ресурсы на операции с плавающей запятой, так как данных с плавающей запятой нет? Какие модели (из Keras, если возможно), типы слоев и активации лучше подходят для этой задачи?
Я пробую этот способ, и результаты не лучше случайных на ~2 миллионах образцов:
from sklearn.model_selection import train_test_split
from keras.utils import to_categorical
from keras.models import Sequential
from keras.layers import Dense
X = np.loadtxt("001_X.csv", dtype=bool)
y = np.loadtxt("001_y.csv", dtype=int)
(X_train, X_test, y_train, y_test) = train_test_split(X, y, shuffle=True, train_size=0.9)
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
model = Sequential()
model.add(Dense(1000, input_dim=128, activation="relu"))
... и т.д....
model.add(Dense(128, activation='softmax'))
model.compile(loss="categorical_crossentropy", optimizer="adam", metrics="accuracy")
model.fit(X_train, y_train, epochs=50, callbacks=[callback], batch_size=100)
Что еще я могу улучшить для повышения точности?
Большинство архитектур полагаются на операции с плавающей запятой, так как процесс оптимизации требует работы с континуумом значений. Если вы хотите решить задачу для параметров, которые могут принимать только дискретные значения, то это не дифференцируемая задача, и вы не можете использовать градиентный спуск для оптимизации сети для вашей задачи.
После быстрого поиска кажется, что некоторые люди работали над созданием Дифференцируемых логических схем, которые позволяют обучать комбинации логических элементов для обработки булевых входов: https://github.com/Felix-Petersen/difflogic. Но это не так уж и популярно.
Если ваша сеть ничему не обучается, вам может понадобиться изменить вашу сеть или попытаться получить некоторые сведения о вашей проблеме, чтобы помочь процессу обучения.
Так как у вас много меток для предсказания, я предложу несколько основных вещей, которые могут улучшить результат или повысить интерпретируемость:
(X_train, X_test, y_train, y_test) = train_test_split(X, y, shuffle=True, train_size=0.8, stratify = y)
Используйте стратификацию. Это обеспечит равное количество меток в обучающей и тестовой выборках.
Попробуйте сбалансировать ваши данные с помощью upsampling
или downsampling
.
Ответ или решение
Классификационная задача с использованием булевых признаков: выбор модели, слоев и активации
Ваша задача по построению классификационной модели с использованием только булевых признаков представляет собой уникальную и интересную задачу. Поскольку ваши данные имеют фиксированное количество признаков (0 или 1), важно правильно выбрать архитектуру и методы обучения для достижения максимальной эффективности.
1. Выбор модели
Для задач с булевыми данными рекомендуется рассмотреть простые модели. Модели, которые могут хорошо работать с булевыми признаками:
- Logistic Regression – хорошая отправная точка и часто дает довольно разумные результаты на простых данных.
- Decision Trees – могут эффективно моделировать нелинейные зависимости.
- Random Forests – более стабильные и производительные, чем одиночные деревья решений.
Если вы хотите использовать нейронные сети, то вы можете рассмотреть использование простых архитектур.
2. Архитектура нейронной сети
Ваша текущая модель, использующая 1000 нейронов в первом скрытом слое, может быть слишком сложной и избыточной для вашей задачи, особенно если ваши данные разбросаны. Простые архитектуры могут дать лучшие результаты:
model = Sequential()
model.add(Dense(256, input_dim=X.shape[1], activation='relu')) # Уменьшение числа нейронов
model.add(Dense(128, activation='relu')) # Добавление второго скрытого слоя
model.add(Dense(128, activation='softmax')) # Выходной слой для 128 классов
3. Активация
Использование relu
в скрытых слоях – это правильный выбор, поскольку эта активация помогает нейронной сети обучаться быстрее. Однако выходной слой следует изменить: если ваши метки представляют собой категории от 0 до 128, то используйте:
- Softmax для многоклассовой классификации.
4. Подход к обучению
Учитывая, что у вас около 2 миллионов образцов, помните о следующих моментах:
- Стратификация: Убедитесь, что вы используете параметр
stratify
вtrain_test_split
, чтобы гарантировать равное представительство классов в обучающей и тестовой выборках.
(X_train, X_test, y_train, y_test) = train_test_split(X, y, shuffle=True, train_size=0.9, stratify=y)
- Балансировка классов: Если ваши классы сильно несбалансированы, рассмотрите возможность использования методов
upsampling
илиdownsampling
.
5. Оптимизация и улучшения
Обратите внимание на следующие аспекты, чтобы улучшить производительность модели:
- Регуляризация: Используйте методы регуляризации, такие как Dropout, чтобы избежать переобучения.
from keras.layers import Dropout
model.add(Dropout(0.5)) # 50% вероятности отключения
- Подбор гиперпараметров: Экспериментируйте с количеством слоев, количеством нейронов, размером батча и количеством эпох. Используйте метод кросс-валидации для оценки.
- Изменение функции потерь: Если ваши классы несбалансированы, рассмотрите
SparseCategoricalCrossentropy
.
Заключение
Использование булевых признаков в нейронных сетях требует особого подхода. Ваша модель должна быть достаточно простой, чтобы избежать переобучения, но достаточно мощной, чтобы уловить нужные зависимости. Эксперименты с различными архитектурами и подходами к обучению помогут вам добиться успешного результата.
Надеюсь, эти рекомендации помогут вам улучшить вашу классификационную модель! Если у вас есть дополнительные вопросы или требуется дальнейшая помощь, не стесняйтесь обращаться.