【问题标题】:Improving accuracy of neural network through preprocessing通过预处理提高神经网络的准确性
【发布时间】:2018-05-26 15:25:19
【问题描述】:

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

调试神经网络检查的状态如下:

  1. 输入输出的关系是不是太随意了?也许输入和输出之间关系的非随机部分是 与随机部分相比太小(有人可能会争辩说库存 价格是这样的)。 IE。输入与 输出。没有一种通用的方法可以检测到这一点,因为这取决于 数据的性质。

为了检查这一点,我写了下面的代码:

我的数据框:

columns = ['A','B']
data = np.array([[1,2] , [1,5], [2,3], [2,3]])
df = pd.DataFrame(data,columns=columns)
df
    A   B
0   1   2
1   1   5
2   2   3
3   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 更好的预测器?我通过阅读上面的“Is the relationship ....”创建了这个。这个计算有一个标题,它是衡量可预测性的好方法吗?

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

【问题讨论】:

    标签: python pandas machine-learning neural-network


    【解决方案1】:

    我不像你那样理解你的报价。所以让我们区分这两种解释。

    1. 根据您的说法,您将模型的随机部分限定为导致随机输出 (B) 的预测变量 (A) 的子集,因此应将其删除。

    2. 在我看来,引用应该被解释为预测变量(A)和目标变量(B)之间的一般关系

    这是两个不同的东西。

    解读一

    如果您从预测集中移除您的集合 {A=1},您也必须将它从您的预测集中移除。基本上,您将训练您的神经网络仅在 A 不为 1 时预测 B。由于 B 的结果在 A = 1 时不确定,因此您的模型性能可能会提高,但如果您必须在案例 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) # your data
    df2 = pd.DataFrame(data, columns=columns) # my data
    
    # your method applied to my data
    print 1 / df2.groupby('A')['B'].nunique()
    

    打印

    A
    1    0.5
    2    0.5
    Name: B, dtype: float64
    

    A 的两个值导致相同的预测能力,但如果 {A=1} 结果是等概率的并且 {A=2},就最大似然而言,预测应该是 3。

    主要的问题是,您心中有一个模型来表示与您打算使用的模型(即神经网络)不同的预测能力。那么,如果您想衡量变量的预测能力(通常或带有一些条件约束),为什么不简单地使用模型本身呢?

    否则,如果您想使用快速代理来衡量预测变量的值如何降低有关变量的不确定性,您可以使用更强大的指标,例如易于实施且已在决策树将节点拆分为分支。

    我让你阅读了它,但这里有一个例子来展示它如何克服上述问题:

    # information gain method
    
    def entropy(data):
        """Compute entropy of a set of values"""
        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
    
    # using your data
    print entropy(df1['B']) - df1.groupby('A')['B'].apply(entropy)
    

    打印

    A
    1    0.5
    2    1.5
    Name: B, dtype: float64
    

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

    # Using my data
    print entropy(df2['B']) - df2.groupby('A')['B'].apply(entropy)
    

    打印

    A
    1    0.792481
    2    0.981203
    Name: B, dtype: float64
    

    表明当 A=2 时我们还有更多的信息增益。

    解读2

    输入与输出的相关性不够。

    正如我所提到的,我不认为它应该像你所做的那样被视为输入输出的子集,而是在它们的整体关系中。假设一个确定性的预测现象,我看到了三种不同的情况,其中输入和输出关系通常很弱:

    1. 您的预测变量是预测现象的解释变量的弱代理
    2. 您的预测变量很嘈杂
    3. 您预测的现象是高维的(由很多因素来解释)并且可能是非线性的(即,对噪声更敏感,因为更难以解释该过程)

    您可以一起观察这 3 个案例,您应该做的是通常但具有挑战性的任务:寻找更具代表性的数据、分解和去噪、降维、选择适合复杂行为的模型。事实上,所有这些任务......

    取决于数据的性质

    【讨论】:

      猜你喜欢
      • 2016-08-02
      • 2018-01-10
      • 2017-09-06
      • 2017-08-05
      • 1970-01-01
      • 2020-08-20
      • 2020-12-09
      • 2018-06-05
      相关资源
      最近更新 更多