如何在 python 中找到众多原因和结果之间的模式?

How to find patterns between numerious causes and the result in python?

对于每个实例,我都有一组问题和一个结果,如下所示:

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"]
})

我想找到问题与结果之间关系的模式。

我的第一个想法是关联规则挖掘,但这更多是为了在问题中寻找模式(例如)。我想机器学习可以以某种方式提供帮助,但我对仅仅预测结果不感兴趣,而是对导致该预测的模式感兴趣。

我会对

这样的模式感兴趣

有什么想法吗? 正如我用 Python 实现的那样,相应的包也欢迎提示。

非常感谢!

我很好奇,根据 Daniel Möller 在这个 in 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)

首先创建dataframe,创建训练数据

那是一项 multiclass-classification 任务,所以我使用分词器(肯定有更好的方法,因为它更适合文本)

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的影响是最大的。将其放入一个函数中,您可以使用您拥有的所有训练数据并构建统计指标来进一步分析。

这只是一个非常简单的方法,但请记住,这是一个很大的研究领域,叫做 敏感性分析。如果您有兴趣,您可能想更深入地了解该主题。