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