使用Python构建自己的简单的人工神经网络
在本文中,我将向您展示如何使用Python创建自己的人工神经网络(ANN)!我们将使用Pima-Indian-Diabetes数据集来预测一个人是否患有糖尿病。
Pima是一群生活在亚利桑那州中部和南部地区的美洲原住民。在世界上所有人口中Pima报告的糖尿病患病率最高,并且通过参与研究过程的意愿为许多科学成果做出了贡献。他们的参与导致了关于2型糖尿病和肥胖的流行病学,生理学,临床评估和遗传学的重要发现。- 国家生物技术信息中心
“来自亚利桑那州的Pima印第安人“人类学系,1904年世界博览会
程序设计
在编写代码之前,我们可以在代码的前面加入注释。通过这种方式,可以回顾我们的代码并确切知道它的作用。
导入需要的库
#Load libraries from keras.models import Sequential from keras.layers import Dense import pandas as pd from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt#Load libraries from keras.models import Sequential from keras.layers import Dense import pandas as pd from sklearn.model_selection import train_test_split import matplotlib.pyplot as plt plt.style.use('fivethirtyeight')
将数据集加载并存储到变量df中,然后输出前5行数据。
#Store the data set df = pd.read_csv('diabetes.csv') #Look at first 5 rows of data df.head()
前5行数据
显示数据集中的行数和列数。
#Show the shape (number of rows & columns) df.shape
行:768,列:9
检查重复项并删除它们,并显示数据集中新的行数和列数。
#Checking for duplicates and removing them df.drop_duplicates(inplace = True) #Show the shape to see if any rows were dropped df.shape
行:768,列:9
在列中显示任何缺少的数据。
#Show the number of missing (NAN, NaN, na) data for each column df.isnull().sum()
将数据转换为数组并输出显示。这将有助于构建神经网络。
#Convert the data into an array dataset = df.values dataset
将数据拆分为独立/特征数据集X和依赖/目标数据集y。
# Get all of the rows from the first eight columns of the dataset X = dataset[:,0:8] # Get all of the rows from the last column y = dataset[:,8]
使用min-max scaler方法处理包含0到1之间的值的特征数据集,并输出这些值。
from sklearn import preprocessing min_max_scaler = preprocessing.MinMaxScaler() X_scale = min_max_scaler.fit_transform(X) X_scale
再次拆分数据,但将数据集按照80%的训练数据和20%的测试数据划分。
X_train, X_test, y_train, y_test = train_test_split(X_scale, y, test_size=0.2, random_state = 4)
最后,我们可以开始构建人工神经网络。模型体系结构将包含三个层。第一层将有12个神经元并使用ReLu激活函数,第二层将有15个神经元并使用ReLu激活函数,第三层也是最后一层将使用1个神经元和sigmoid激活函数。
model = Sequential([ Dense(12, activation='relu', input_shape=( 8 ,)), Dense(15, activation='relu'), Dense(1, activation='sigmoid') ])
编译模型并给它一个'binary_crossentropy'损失函数(用于二进制分类)来衡量模型在训练中的表现,然后给它随机梯度下降'sgd'优化器来改进损失。此外,我想测量模型的准确性,所以要在度量中添加“准确性”。
model.compile(optimizer='sgd', loss='binary_crossentropy', metrics=['accuracy'])
利用训练数据的拟合方法对模型进行训练,并以57个批大小训练1000个周期。通过将训练数据拆分为20%验证,提供模型验证数据以查看模型的执行情况。
批:单个批处理中存在的训练示例总数
Epoch(周期):整个数据集仅通过神经网络向前和向后传递一次的迭代次数。
Fit:训练的另一个词
hist = model.fit(X_train, y_train, batch_size=57, epochs=1000, validation_split=0.2)
使用图形可视化模型的执行情况!首先可视化模型的损失。
#visualize the training loss and the validation loss to see if the model is overfitting plt.plot(hist.history['loss']) plt.plot(hist.history['val_loss']) plt.title('Model loss') plt.ylabel('Loss') plt.xlabel('Epoch') plt.legend(['Train', 'Val'], loc='upper right') plt.show()
在约400个周期之前,训练数据和验证数据的模型损失均显著降低。
现在可视化训练和验证数据的模型准确性。
#visualize the training accuracy and the validation accuracy to see if the model is overfitting plt.plot(hist.history['acc']) plt.plot(hist.history['val_acc']) plt.title('Model accuracy') plt.ylabel('Accuracy') plt.xlabel('Epoch') plt.legend(['Train', 'Val'], loc='lower right') plt.show()
该模型使用测试数据集X_test进行预测
由于神经网络只给出了概率(0到1之间的值),所以我创建了一个阈值,其中0.5及以上的值将目标数据分类为(1),小于0.5的值分类为(0)。
我还将输出测试集的实际值来比较结果。
#Make a prediction & print the actual values prediction = model.predict(X_test) prediction = [1 if y>=0.5 else 0 for y in prediction] #Threshold print(prediction) print(y_test)
上半部分显示的是预测值,下半部分显示的是实际值。根据训练数据集对模型进行评估。
from sklearn.metrics import classification_report,confusion_matrix, accuracy_score pred = model.predict(X_train) pred = [1 if y>=0.5 else 0 for y in pred] #Threshold print(classification_report(y_train ,pred )) print('Confusion Matrix: \n',confusion_matrix(y_train,pred)) print() print('Accuracy: ', accuracy_score(y_train,pred)) print()
在测试数据集上评估模型。
from sklearn.metrics import classification_report,confusion_matrix, accuracy_score pred = model.predict(X_test) pred = [1 if y>=0.5 else 0 for y in pred] #Threshold print(classification_report(y_test ,pred )) print('Confusion Matrix: \n',confusion_matrix(y_test,pred)) print() print('Accuracy: ', accuracy_score(y_test,pred)) print()
这里有另一种方法来获得测试数据集的准确性。
model.evaluate(X_test, y_test)[1]
0.7727272742754453
该模型准确地识别出糖尿病患者和非糖尿病患者,检测数据的准确率为75.9% !
结论
就是这样,很简单的,这里已经完成了创建人工神经网络程序来检测糖尿病!
如果您有兴趣阅读机器学习并解决相关问题和示例,我建议您阅读Hands-On Machine Learning with Scikit-Learn and TensorFlow: Concepts, Tools, and Techniques to Build Intelligent Systems 。
这本书是帮助初学者学习编写机器学习程序和理解机器学习概念的好书。