我有一个包含以下数据的数据框:
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)
我不明白的是为什么第一种方法“有效”-模型将进行训练和验证,而第二种方法对于验证/训练和损失始终为零?
什么与众不同?