首页 > 解决方案 > 如何在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 实现的那样,相应的包也是受欢迎的提示。

非常感谢!

标签: pythonpattern-finding

解决方案


我很好奇,我做了一些实验性的东西,基于 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的影响最大。将其放入一个函数中,您可以使用您拥有的所有训练数据并构建统计指标来进一步分析它。

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


推荐阅读