Python 分类指数停留在60%

Python 分类指数停留在60%,python,machine-learning,keras,neural-network,classification,Python,Machine Learning,Keras,Neural Network,Classification,我试图在10000个数据集上创建一个二进制分类器。我尝试了多种激活器和优化器,但是结果总是在56.8%和58.9%之间。鉴于几十次迭代的结果相当稳定,我假设问题是: 我的数据集不可分类 我的模型坏了 这是数据集: 我也许能再得到2000张唱片,但那就是了 我的问题是:我的模型的构建方式中是否存在某种阻碍它学习到更高程度的因素 请注意,我很高兴拥有所需的尽可能多的层和节点,并且时间不是生成模型的一个因素 dataframe = pandas.read_csv(r"training-set

我试图在10000个数据集上创建一个二进制分类器。我尝试了多种激活器和优化器,但是结果总是在56.8%和58.9%之间。鉴于几十次迭代的结果相当稳定,我假设问题是:

  • 我的数据集不可分类
  • 我的模型坏了
  • 这是数据集:

    我也许能再得到2000张唱片,但那就是了

    我的问题是:我的模型的构建方式中是否存在某种阻碍它学习到更高程度的因素

    请注意,我很高兴拥有所需的尽可能多的层和节点,并且时间不是生成模型的一个因素

    dataframe = pandas.read_csv(r"training-set.csv", index_col=None)
    dataset = dataframe.values
    X = dataset[:,0:48].astype(float)
    Y = dataset[:,48]
    
    #count the input variables
    col_count = X.shape[1]
    
    #normalize X
    from sklearn.preprocessing import StandardScaler
    sc_X = StandardScaler()
    X_scale = sc_X.fit_transform(X)
    
    # Splitting the dataset into the Training set and Test set
    from sklearn.model_selection import train_test_split
    X_train, X_test, y_train, y_test = train_test_split(X_scale, Y, test_size = 0.2)
    
    # define baseline model
    activator = 'linear' #'relu' 'sigmoid' 'softmax' 'exponential' 'linear' 'tanh'
    #opt = 'Adadelta' #adam SGD nadam RMSprop Adadelta 
    nodes = 1000 
    max_layers = 2
    max_epochs = 100
    max_batch = 32
    loss_funct = 'binary_crossentropy' #for binary
    last_act = 'sigmoid' # 'softmax' 'sigmoid' 'relu'
    
    def baseline_model():
        # create model
        model = Sequential()
        model.add(Dense(nodes, input_dim=col_count, activation=activator))
        for x in range(0, max_layers):
            model.add(Dropout(0.2))
            model.add(Dense(nodes, input_dim=nodes, activation=activator))    
        #model.add(BatchNormalization())
        model.add(Dense(1, activation=last_act)) #model.add(Dense(1, activation=last_act)) 
        # Compile model
        adam = Adam(lr=0.001)
        model.compile(loss=loss_funct, optimizer=adam, metrics=['accuracy'])
        return model
    
    estimator = KerasClassifier(build_fn=baseline_model, epochs=max_epochs, batch_size=max_batch)
    
    estimator.fit(X_train, y_train)
    y_pred = estimator.predict(X_test)
    
    #confusion matrix
    from sklearn.metrics import confusion_matrix
    cm = confusion_matrix(y_test, y_pred)
    score = np.sum(cm.diagonal())/float(np.sum(cm))
    
    两点:

  • 用线性激活叠加密集层是绝对没有意义的——它们只产生一个线性单元;更改为
    activator='relu'
    (并且不要为注释列表中的其他候选激活函数而烦恼)

  • 默认情况下不要使用辍学,尤其是当您的模型在学习上有困难时(如这里);移除掉掉层,只需准备好将(部分)层放回原位,以防你看到过度装配(你目前离这一点还很远,所以现在不必担心)


  • 一般来说,当您的数据是严格同质数据时,最好使用神经网络,而对于其他异构数据,最好使用其他模型(集成方法,如梯度增强)。此外,提高性能指标的一个重要部分是特征工程(删除、转换和创建新变量)。尝试阅读单变量特征分析(如信息值)和多变量方法(PCA、递归消除),了解如何在拟合神经网络之前处理数据。尝试交换一个更简单的非神经模型,看看它是如何工作的。有一个基线可以帮助您确定问题是数据还是模型。当使用线性激活叠加密集层时,损失函数(例如预测和地面真相之间的MSE)如何:它仍然是凸的吗?@Mustafaydın如前所述;叠加一百万个线性层,你只会得到相当于一个线性单位的东西是的,但它(第283页,第三段)的损失函数失去了它们的凸性,然后可能有助于形成这样的网络:“Saxe et al.(2013)为此类网络中的完整学习动态提供了精确的解决方案,并表明在这些模型中的学习捕获了在训练具有非线性激活函数的深层模型时观察到的许多定性特征。“我完全理解你在回答中的观点;但说“绝对并没有任何意义”并不完全正确。引用Mustafaydın的话,也许可以作为学习动力研究的模型,但这并不意味着它们可以像这里尝试的那个样用于实践。无论如何,这更多的是一个理论问题,而这不是进行此类讨论的合适论坛。