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

时间:2017-12-12 20:39:16

标签: python pandas machine-learning neural-network

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

声明调试神经网络检查:

  
      
  1. 输入和输出之间的关系是否太随机了?也许输入和输出之间关系的非随机部分是   与随机部分相比太小(人们可以争辩说股票   价格是这样的)。即输入与...没有充分关系   输出。没有通用的方法来检测它,因为它取决于它   关于数据的性质。
  2.   

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

我的数据框:

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())

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

由此可以说属性1是比属性2更好的预测因子吗?我从阅读上面的“是关系......”创建了这个。这个计算有一个标题,它是衡量可预测性的一个很好的指标吗?

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

1 个答案:

答案 0 :(得分:1)

我不像你那样理解你的引语。因此,让我们区分两种解释。

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

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

  3. 这是两件不同的事情。

    解释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) # 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在决策树中使用将节点拆分为分支。

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

    # 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. 您预测的现象是高维度(由很多因素解释)并且可能是非线性的(即噪声更加敏感,因为它更难以解释过程)
    4. 您可以一起观察这3个案例,您应该做的是通常但具有挑战性的任务:找到更具代表性的数据,分解和去噪,减少维度,选择适合复杂行为的模型。事实上,所有这些任务......

        

      取决于数据的性质