Я работаю с этим набором данных: https://www.kaggle.com/gabisato/league-of-legends-ranked-games/data
Я использую столбец 'win' в качестве своей цели, преобразовав данные в 2 категориальных вектора с одним горячим вектором; одна представляет победу команды 1, а другая представляет победу команды 2. Они хранятся в моих массивах trainY (600,1,1) и testY (56,1,1) numpy.
Я хочу использовать остальные 88 столбцов в качестве предикторов для результата матча. В результате мой trainX равен (600,88), а мой testX - (56,88). (Одна вещь, о которой я только что подумал, но не уверен в ее достоинствах: могу ли / должен ли я создать вектор длины 1 для каждой из этих функций, т.е. должен ли мой массив быть (600,1,1,1,1 .... .1) ???)
В классе по нейронным сетям, в котором я сейчас нахожусь, мы в основном использовали линейные, сверточные, объединяющие и выпадающие слои с макушки головы. Я работаю с керасом и попытался создать модель, используя несколько случайных слоев в качестве отправной точки:
#Define model
model = Sequential()
model.add(Conv1D(filters=5, kernel_size=2, padding='same', activation='relu',input_shape=(88,1)))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=10, kernel_size=2, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=2))
model.add(Conv1D(filters=15, kernel_size=3, padding='same', activation='relu'))
model.add(MaxPooling1D(pool_size=3))
model.add(Conv1D(filters=30, kernel_size=3, padding='same', activation='relu'))
model.add(Conv1D(filters=30, kernel_size=3, padding='same', activation='relu'))
model.add(Flatten())
model.add(Dense(units=2, activation='softmax'))
model.summary()
model.compile(loss='binary_crossentropy', optimizer='Adam', metrics=['accuracy'])
Модель прекрасно компилируется, но я сталкиваюсь с проблемой ввода, в которой отсутствует измерение.
ValueError: Input 0 of layer sequential_30 is incompatible with the layer: expected ndim=3, found ndim=2. Full shape received: [None, 88]
Я также читал в Интернете, что свертка в первую очередь полезна для обработки изображений и временных данных, что в первую очередь ставит меня под сомнение в их использовании. Моя проблема в том, что мы только когда-либо рассматривали примеры, связанные с распознаванием / маркировкой изображений в моем классе, так что я действительно растерялся относительно того, как подойти к моей идее. Могу ли я применить сверточные слои к моим данным? Если да, то как мне реализовать это дополнительное измерение, которое, по словам Кераса, мне нужно? Если бы мне не приходилось использовать сверточные слои, какой подход вы бы порекомендовали с точки зрения моей многоуровневой обработки или даже предварительной обработки данных? Все рекомендации с радостью приветствуются, и я не столько ищу код, сколько концептуально, как лучше всего подходить к построению нейронной сети на таких данных.
Вот мой код соответствия модели:
hist = model.fit(trainX, trainY, epochs = 10, batch_size=16,validation_data=(testX,testY))
Поскольку это может быть полезно, я также добавлю код, который использовал для разделения данных:
#Dataframe to numpy array
challenger = challenger_df.to_numpy()
#Convert original labels of 1 and 2 to 0 and 1
challenger[:,0]=challenger[:,0]-1
#Define labels
LabelMeaning=['0=Team 1', '1=Team 2']
#preprocess features for network
scaler = MinMaxScaler(feature_range=(0,1))
for i in range(88):
challenger[:,i+1]=scaler.fit_transform((challenger[:,i+1]).reshape(-1,1)).reshape(1,-1)
#Separate into train and test
train = challenger[:600]
test = challenger[600:]
print(np.shape(train))
print(np.shape(test))
print()
#Separate into X and Y
trainX = train[:,1:]
trainY = train[:,0]
testX = test[:,1:]
testY = test[:,0]
#check shapes for discrepancies
print(np.shape(trainX))
print(np.shape(trainY))
print()
print(np.shape(testX))
print(np.shape(testY))
print()
#Convert labels to one-hot vectors
trainY=np_utils.to_categorical(trainY)
testY=np_utils.to_categorical(testY)
print(np.shape(trainY))
print(np.shape(testY))