У меня есть фрейм данных со следующими данными:
gender gender_count name vectorized indexised ends_a
18948 1 308 macel [1.0, 0.0, 1.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0] [12, 0, 2, 4, 11, nan, nan, nan, nan, nan, nan, nan, nan, nan, nan] 0
Я использую два подхода для токенизации слов:
количество букв в словаре a-z
:
char_dict = [(key,value) for key, value in enumerate(string.ascii_lowercase)]
def vectorize(text, dictionary=char_dict):
vector = np.zeros(len(dictionary))
for i, word in dictionary:
num = 0
for w in text:
if w == word:
num += 1
if num:
vector[i] = num
return vector
индекс положения букв в словаре a-z
:
def indexise(name):
#longest word len: 15
name = name.lower()
word = [string.ascii_lowercase.index(x) for x in name]
for x in range(15-len(word)):
word.append(np.nan)
return word
Как подсказывает @hobbs ниже, если я заменю пустые буквы в этом подходе с np.nan
на -2
, выводне равно нулю, но очень близко к нулю, тогда как первый подход с той же моделью дает точность 0,72 (в 20 раз лучше):
Log-loss (cost function):
training (min: 5.469, max: 5.777, cur: 5.470)
validation (min: 7.109, max: 7.452, cur: 7.445)
Accuracy:
training (min: 0.023, max: 0.119, cur: 0.025)
validation (min: 0.027, max: 0.137, cur: 0.031)
Я использую одну и ту же модель в обоих подходах, единственное, что отличается, это input_dim
.
model = Sequential()
model.add(Dense(32, input_dim=26, activation='relu'))
model.add(Dense(1, activation='relu'))
model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy'])
model.fit(X1, Y1, epochs=50, batch_size=1000, validation_split=.2, callbacks=[PlotLossesKeras()], verbose=False)
Что я не понимаю, так это то, почему первый подход «работает» - модель будет обучаться и проверять, а второй подход всегда равен нулю для проверки / обучения и потери?
Что делает такую большую разницу?