Python 如何通过退出层改进神经网络?

Python 如何通过退出层改进神经网络?,python,tensorflow,keras,neural-network,dropout,Python,Tensorflow,Keras,Neural Network,Dropout,我正在研究一种预测心脏病的神经网络。数据来自kaggle,已经过预处理。我使用了各种模型,如逻辑回归、随机森林和支持向量机,它们都产生了可靠的结果。我正试图用同样的数据来建立一个神经网络,看看一个神经网络是否能比其他的ML模型表现得更好(数据集很小,这可以解释糟糕的结果)。下面是我的网络代码。下面的模型产生了50%的准确度,这显然太低了,没有用处。从你可以看出,有没有任何东西看起来会破坏模型的准确性 import pandas as pd import numpy as np import ma

我正在研究一种预测心脏病的神经网络。数据来自kaggle,已经过预处理。我使用了各种模型,如逻辑回归、随机森林和支持向量机,它们都产生了可靠的结果。我正试图用同样的数据来建立一个神经网络,看看一个神经网络是否能比其他的ML模型表现得更好(数据集很小,这可以解释糟糕的结果)。下面是我的网络代码。下面的模型产生了50%的准确度,这显然太低了,没有用处。从你可以看出,有没有任何东西看起来会破坏模型的准确性

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from tensorflow.keras.layers import Dense, Dropout
import tensorflow as tf
from tensorflow import keras
from tensorflow.keras.callbacks import EarlyStopping

df = pd.read_csv(r"C:\Users\***\Desktop\heart.csv")

X = df[['age','sex','cp','trestbps','chol','fbs','restecg','thalach']].values
y = df['target'].values

from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.30)

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()

scaler.fit_transform(X_train)
scaler.transform(X_test)


nn = tf.keras.Sequential()

nn.add(Dense(30, activation='relu'))

nn.add(Dropout(0.2))

nn.add(Dense(15, activation='relu'))

nn.add(Dropout(0.2))


nn.add(Dense(1, activation='sigmoid'))


nn.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics= 
 ['accuracy'])


early_stop = EarlyStopping(monitor='val_loss',mode='min', verbose=1, 
patience=25)

nn.fit(X_train, y_train, epochs = 1000, validation_data=(X_test, y_test),
     callbacks=[early_stop])

model_loss = pd.DataFrame(nn.history.history)
model_loss.plot()

predictions = nn.predict_classes(X_test)

from sklearn.metrics import classification_report,confusion_matrix

print(classification_report(y_test,predictions))
print(confusion_matrix(y_test,predictions))

使用EarlyStating运行模型后

Epoch 324/1000
23/23 [==============================] - 0s 3ms/step - loss: 0.5051 - accuracy: 0.7364 - val_loss: 0.4402 - val_accuracy: 0.8182
Epoch 325/1000
23/23 [==============================] - 0s 3ms/step - loss: 0.4716 - accuracy: 0.7643 - val_loss: 0.4366 - val_accuracy: 0.7922
Epoch 00325: early stopping
WARNING:tensorflow:From <ipython-input-54-2ee8517852a8>:54: Sequential.predict_classes (from tensorflow.python.keras.engine.sequential) is deprecated and will be removed after 2021-01-01.
Instructions for updating:
Please use instead:* `np.argmax(model.predict(x), axis=-1)`,   if your model does multi-class classification   (e.g. if it uses a `softmax` last-layer activation).* `(model.predict(x) > 0.5).astype("int32")`,   if your model does binary classification   (e.g. if it uses a `sigmoid` last-layer activation).
              precision    recall  f1-score   support

           0       0.90      0.66      0.76       154
           1       0.73      0.93      0.82       154

    accuracy                           0.79       308
   macro avg       0.82      0.79      0.79       308
weighted avg       0.82      0.79      0.79       308

Epoch 324/1000
23/23[============================================================-0s 3ms/步-损耗:0.5051-精度:0.7364-val_损耗:0.4402-val_精度:0.8182
纪元325/1000
23/23[======================================================-0s 3ms/步-损耗:0.4716-精度:0.7643-val\u损耗:0.4366-val\u精度:0.7922
纪元00325:提前停止
警告:tensorflow:From:54:Sequential.predict_类(来自tensorflow.python.keras.engine.Sequential)已弃用,将在2021-01-01后删除。
更新说明:
请改用:`np.argmax(model.predict(x),axis=-1)`,如果您的模型进行多类分类(例如,如果它使用`softmax`最后一层激活)。*`(model.predict(x)>0.5.astype(“int32”)`,如果您的模型进行二进制分类(例如,如果它使用`sigmoid`最后一层激活)。
精确回忆f1分数支持
0       0.90      0.66      0.76       154
1       0.73      0.93      0.82       154
精度0.79 308
宏平均值0.82 0.79 0.79 308
加权平均值0.82 0.79 0.79 308
这表明一个合理的准确性和f1分数与这样一个简单的MLP

我使用了这个数据集:

  • 对所有历次进行训练,初始精度可能较低,但模型将在几个历次后很快收敛

  • 在随机、tensorflow和numpy中使用
    种子
    ,每次都可以得到可重复的结果

  • 如果简单的模型显示出很好的准确性,那么NN的表现可能会更好,但您必须确保NN没有过度拟合

  • 检查您的数据是否不平衡,如果是,请尝试使用
    class\u权重

  • 您可以尝试使用交叉验证的
    tuner
    ,以获得性能最佳的模型


  • 定标器不到位;您需要保存缩放结果

    X_train = scaler.fit_transform(X_train)
    X_test = scaler.transform(X_test)
    
    然后,您将获得与预期更一致的结果

                  precision    recall  f1-score   support
    
               0       0.93      0.98      0.95       144
               1       0.98      0.93      0.96       164
    
        accuracy                           0.95       308
       macro avg       0.95      0.96      0.95       308
    weighted avg       0.96      0.95      0.95       308