给定的数据在 “point_data.csv”文件里,这个数据总共包含了5个类别(由Class_ID来区分), 并包括10个特征。在这里,我们需要搭建多层的神经网络,并利用这个网络来识别分类。
首先是导入所有所需的library

# 导入library
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

# TODO 导入跟keras相关的libraray
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras.optimizers import SGD

# 以下是跟sklearn相关的库
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import LabelEncoder,scale
from sklearn.metrics import f1_score, classification_report,confusion_matrix
1.导入数据集
filename = 'point_data.csv'
dataset = pd.read_csv(filename)
2.数据预处理

首先使用LabelEncoder对label进行标准化处理

encoder = LabelEncoder()

# 定义标签Y和特征X
Y = dataset.iloc[:, 2:3].values
X = dataset.iloc[:, 3:13].values

# TODO: 对Y做一个简单的转换(不然会在keras部分会出错) 
y = encoder.fit_transform(Y)

分割训练数据与测试数据

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.20, random_state=42)

使用preprocessing.scale函数对数据进行归一化

X_train = scale(X_train)
X_test = scale(X_test)
3.定义深度神经网络模型

模型总共包含4层hidden layer, 第一层包括50个hidden units, 第二层包括50个hidden units, 第三层包括60个hidden units,
第四层包括40个hidden units. 并在第一层hidden layer和第二层hidden layer之间添加一个dropout layer (rate=0.2),在第二层和第三层hidden layer之间添加dropout layer(rate=0.2), 第三层和第四层之间添加dropout layer(rate=0.1)。

input_shape = (10,)
output_shape = 5

# TODO: 定义深度学习模型
model = Sequential()

model.add(Dense(10, input_shape=input_shape, activation='relu'))
model.add(Dense(50, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(Dense(50, activation='relu'))
model.add(Dropout(rate=0.2))
model.add(Dense(60, activation='relu'))
model.add(Dropout(rate=0.1))
model.add(Dense(40, activation='relu'))
model.add(Dense(output_shape, activation='softmax'))

# 输出模型描述
model.summary()

使用深度神经网络识别卫星数据

定义SGD优化器,学习率为0.01

sgd = SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)

义模型的compile函数,设置loss为sparse_categorical_crossentropy, 利用上面定义的sgd优化器,利用准确率作为评估标准。

model.compile(loss='sparse_categorical_crossentropy',optimizer=sgd, metrics=['accuracy'])
4.训练模型

设置epoch为100, batch_Size为100,并把训练数据中的15%作为validation data(验证集), 把中间的结果都赋给history变量(后面做分析用)

history = model.fit(X_train, y_train, epochs=100,batch_size=100,validation_split=0.15)

可以看到随着模型的不断训练,损失函数降低到接近0.06,auc准确率可以达到97.7%
使用深度神经网络识别卫星数据

5.验证模型

我们可以画一个图来表示准确率的变化情况(分别在训练数据和测试数据)

plt.plot(history.history['acc'])
plt.plot(history.history['val_acc'])
plt.title('accuracy')
plt.ylabel('accuracy')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='lower right')
plt.show()

使用深度神经网络识别卫星数据
也可以画一个图来表示LOSS的变化情况(分别在训练数据和测试数据)

plt.plot(history.history['loss'])
plt.plot(history.history['val_loss'])
plt.title('loss')
plt.ylabel('loss')
plt.xlabel('epoch')
plt.legend(['train', 'test'], loc='upper right')
plt.show()

使用深度神经网络识别卫星数据

在测试数据上做评估

y_pred = model.predict(X_test)
score = model.evaluate(X_test, y_test, batch_size=100, verbose=1)
print(score)
print("Baseline Error: %.2f%%" % (100-score[1]*100))

绘制混淆矩阵

# 预测结果
test_class = model.predict_classes(X_test)
#  绘制矩阵
confusion_matrix(y_test, test_class)

使用深度神经网络识别卫星数据
输出在测试集上的precision, recall, f1-score

print(classification_report(y_test, test_class))

使用深度神经网络识别卫星数据

所有源码、测试数据以及训练好的模型已上传至git,点击这里可直接查看,有疑问的同学请在博客下方留言或提Issuees,谢谢!

相关文章:

  • 2021-10-31
  • 2021-08-16
  • 2021-11-21
  • 2021-12-04
  • 2021-07-17
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2021-04-16
  • 2022-12-23
  • 2021-04-04
  • 2021-05-16
  • 2021-11-10
相关资源
相似解决方案