我很好奇,我做了一些实验性的东西,基于 Daniel Möller在 tensorflow 2.0 with keras的这个线程中的评论:
更新:让订单不再重要:
为了使订单不再乱七八糟,我们需要从数据集中删除订单信息。为此,我们首先将其转换为 one-hot 向量,然后我们使用 max() 值再次将维度压缩为 3:
x_no_order = tf.keras.utils.to_categorical(x)
这为我们提供了一个如下所示的 one-hot 向量:
array([[[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 1., 0., 0., 0.]],
[[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 1., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0.]],
[[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 1., 0.]],
[[0., 0., 0., 1., 0., 0., 0.],
[0., 0., 0., 0., 1., 0., 0.],
[0., 0., 0., 0., 0., 1., 0.]],
[[0., 1., 0., 0., 0., 0., 0.],
[0., 0., 0., 0., 0., 1., 0.],
[0., 0., 0., 0., 0., 0., 1.]]], dtype=float32)
从np.max()
那个向量中取出向量给了我们一个向量,它只知道出现了哪些数字,没有关于位置的任何信息,看起来像这样:
x_no_order.max(axis=1)
array([[0., 1., 1., 1., 0., 0., 0.],
[0., 1., 1., 0., 1., 0., 0.],
[0., 1., 0., 0., 1., 1., 0.],
[0., 0., 0., 1., 1., 1., 0.],
[0., 1., 0., 0., 0., 1., 1.]], dtype=float32)
首先创建数据框并创建训练数据
那是一个多类分类任务,所以我使用了分词器(肯定有更好的方法,因为它更适合文本)
import tensorflow as tf
import numpy as np
import pandas as pd
df = pd.DataFrame({
"problems": [[1,2,3], [1,2,4], [1,4,5], [3,4,5], [1,5,6]],
"results": ["A", "A", "C", "C", "A"]
})
x = df['problems']
y = df['results']
tokenizer = tf.keras.preprocessing.text.Tokenizer()
tokenizer.fit_on_texts(y)
y_train = tokenizer.texts_to_sequences(y)
x = np.array([np.array(i,dtype=np.int32) for i in x])
y_train = np.array(y_train, dtype=np.int32)
**然后创建模型**
input_layer = tf.keras.layers.Input(shape=(3))
dense_layer = tf.keras.layers.Dense(6)(input_layer)
dense_layer2 = tf.keras.layers.Dense(20)(dense_layer)
out_layer = tf.keras.layers.Dense(3, activation="softmax")(dense_layer2)
model = tf.keras.Model(inputs=[input_layer], outputs=[out_layer])
model.compile(optimizer="Nadam", loss="sparse_categorical_crossentropy",metrics=["accuracy"])
通过拟合来训练模型
hist = model.fit(x,y_train, epochs=100)
然后,根据 Daniels 的评论,您采用要测试的序列并屏蔽某些值,以测试它们的影响
arr =np.reshape(np.array([1,2,3]), (1,3))
print(model.predict(arr))
arr =np.reshape(np.array([0,2,3]), (1,3))
print(model.predict(arr))
arr =np.reshape(np.array([1,0,3]), (1,3))
print(model.predict(arr))
arr =np.reshape(np.array([1,2,0]), (1,3))
print(model.predict(arr))
这将打印此结果,请记住,由于 y 从 1 开始,第一个值是占位符,所以第二个值代表“A”
[[0.00441748 0.7981055 0.19747704]]
[[0.00103579 0.9863035 0.01266076]]
[[0.0031549 0.9953074 0.00153765]]
[[0.01631758 0.00633342 0.977349 ]]
在那里我们可以看到,首先 A 被 0.7981 正确预测。当 [1,2,3] 我们将 3 更改为 0 时,因此 [1,2,0] 我们看到模型突然预测“ C”。所以3对位置3的影响最大。将其放入一个函数中,您可以使用您拥有的所有训练数据并构建统计指标来进一步分析它。
这只是一种非常简单的方法,但请记住,这是一个称为敏感性分析的大研究领域。如果您有兴趣,您可能想更深入地了解该主题。