通过预处理提高神经网络的准确性

阅读 https://blog.slavv.com/37-reasons-why-your-neural-network-is-not-working-4020854bd607

提到调试神经网络时需要检查以下内容:

  1. 输入和输出之间的关系是否过于随机?也许输入和输出之间非随机部分相对于随机部分而言太小(可以说股票价格就是这样)。也就是说,输入与输出之间的关联度不足。没有通用的方法来检测这一点,因为它取决于数据的性质。

为了检查这一点,我编写了以下代码:

我的数据框如下:

columns = ['A','B']data = np.array([[1,2] , [1,5], [2,3], [2,3]])df = pd.DataFrame(data,columns=columns)df    A   B0   1   21   1   52   2   33   2   3

其中A是输入变量,B是目标变量。

用于测量标签1预测能力的代码:

df_sub1 = df[df['A'] == 1] len(df_sub1['A'].unique()) / len(df_sub1['B'].unique())

返回的值是0.5,因为对于标签1有两个不同的目标值。

用于测量标签2预测能力的代码:

df_sub1 = df[df['A'] == 2] len(df_sub1['A'].unique()) / len(df_sub1['B'].unique())

返回的值是1,因为对于标签2两个目标值相同。

由此可以推断,属性1比属性2更好的预测器吗?我是从阅读上述“输入和输出之间的关系…”得到的启发。这种计算有一个标题,它是衡量可预测性的好方法吗?

为了通过数据预处理提高神经网络的准确性,可以尝试从训练集中移除预测能力低于预定义阈值的数据,其中该值是上述计算的结果吗?


回答:

我对你引用的理解与你不同。所以让我们区分这两种解释。

  1. 根据你的观点,你将模型的随机部分定义为导致随机输出的预测变量(A)的一个子集,因此应该被移除。

  2. 在我看来,这段引文应该被解释为预测变量(A)与目标变量(B)之间的总体关系。

这两者是不同的概念。

解释1

如果你从预测集中移除{A=1}的集合,你也必须从预测集中移除它。基本上,你将训练你的神经网络仅在A不为1时预测B。由于当A=1时B的结果不确定,你的模型性能可能会提高,但如果必须在A=1的情况下进行预测怎么办?

确实,你提高了准确性,但你将预测潜力限制在{A!=1},这种操作只有在你找到另一个模型在{A=1}的情况下能胜过你的神经网络,从而提高整体准确性时才值得。此外,考虑到神经网络的非线性结构,它理论上应该能够自己区分这两种情况,所以我对这种方法的适用性持怀疑态度。

关于你尝试测量预测能力,你必须意识到,没有预测方法或模型就没有预测能力。通过使用unique方法,你对输出的等概率性做出了强烈假设。以下数据的预测能力会如何反应?

data = np.array([[1,2] , [1,5], [2,3], [2,3], [2,3], [2,4]])df1 = pd.DataFrame(data[:-2,:], columns=columns) # 你的数据df2 = pd.DataFrame(data, columns=columns) # 我的数据# 你的方法应用到我的数据上print 1 / df2.groupby('A')['B'].nunique()

打印结果

A1    0.52    0.5Name: B, dtype: float64

A的两个值导致相同的预测能力,但在{A=1}的情况下,输出是等概率的,而在{A=2}的情况下,从最大似然的角度来看,预测值应该是3。

主要问题是你脑海中有一个与你打算使用的模型(即神经网络)不同的模型来表示预测能力。所以,如果你想测量你的变量的预测能力(总体或带有某些条件约束),为什么不直接使用模型本身呢?

否则,如果你想使用一个快速的代理来测量预测变量的值如何减少对变量的不确定性,你可以使用更robust的指标,例如信息增益,它易于实现,并且已经在决策树中用于将节点分成分支。

我让你阅读相关内容,但这里有一个例子来说明它如何克服上述问题:

# 信息增益方法def entropy(data):    """计算一组值的熵"""    bin_cnt  = np.bincount(data)    bin_prob = bin_cnt / np.sum(bin_cnt)    entropy = - np.sum(bin_prob * np.ma.log2(bin_prob))    return entropy# 使用你的数据print entropy(df1['B']) - df1.groupby('A')['B'].apply(entropy)

打印结果

A1    0.52    1.5Name: B, dtype: float64

显示当A=2时我们有更多的信息增益。

# 使用我的数据print entropy(df2['B']) - df2.groupby('A')['B'].apply(entropy)

打印结果

A1    0.7924812    0.981203Name: B, dtype: float64

显示当A=2时我们仍然有更多的信息增益。

解释2

输入与输出之间的关联度不足。

如我所述,我不认为这应该被视为你所做的那样输入-输出的子集,而应是它们之间的总体关系。假设一个确定性的预测现象,我看到三种不同的情况,其中输入和输出的关系可能普遍较弱:

  1. 你的预测变量是预测现象的解释变量的弱代理
  2. 你的预测变量有噪声
  3. 你的预测现象是高维的(由许多因素解释)并且可能是非线性的(即,对噪声更加敏感,因为解释过程更加困难)

你可能会同时观察到这三种情况,你应该做的就是通常但具有挑战性的任务:寻找更具代表性的数据,分解和去噪,降维,选择适合复杂行为的模型。确实,所有这些任务…

取决于数据的性质

Related Posts

L1-L2正则化的不同系数

我想对网络的权重同时应用L1和L2正则化。然而,我找不…

使用scikit-learn的无监督方法将列表分类成不同组别,有没有办法?

我有一系列实例,每个实例都有一份列表,代表它所遵循的不…

f1_score metric in lightgbm

我想使用自定义指标f1_score来训练一个lgb模型…

通过相关系数矩阵进行特征选择

我在测试不同的算法时,如逻辑回归、高斯朴素贝叶斯、随机…

可以将机器学习库用于流式输入和输出吗?

已关闭。此问题需要更加聚焦。目前不接受回答。 想要改进…

在TensorFlow中,queue.dequeue_up_to()方法的用途是什么?

我对这个方法感到非常困惑,特别是当我发现这个令人费解的…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注