给定的数据在 “point_data.csv”文件里,这个数据总共包含了5个类别(由Class_ID来区分), 并包括10个特征。
point_data.csv数据链接:
链接:https://pan.baidu.com/s/1mjV0PF1bbnPdFosLZbNf3Q
提取码:3h7u
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import keras
from keras.utils import np_utils
from keras.models import Sequential
from keras.layers import Dense, Dropout
from keras import optimizers
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.metrics import f1_score,recall_score,precision_score,confusion_matrix
from sklearn import metrics
%matplotlib inline
# 导入数据
# 设置数据文件的位置(path)
filename = './point_data.csv'
dataset = pd.read_csv(filename)
list(dataset)

# 定义标签Y和特征X
# Y: 读取Class_ID字段
Y = dataset[['Class_ID']]
# 总共10个特征,分别读取 'B2','B3','B4','B5','B6','B7','B8','B8A','B11','B12' 字段
X = dataset[['B2','B3','B4','B5','B6','B7','B8','B8A','B11','B12']]
# 对Y做一个简单的转换(不然会在keras部分会出错)
Y = Y.values.squeeze()
# 把数据分成训练数据和测试数据
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.20, random_state=42)
# 做数据的归一化 (利用preprocessing.scale函数,详情查看官方文档)
X_train = preprocessing.scale(X_train)
X_test = preprocessing.scale(X_test)
X_train.shape
(19156, 10)
'''
定义深度学习模型: 模型总共包含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)。
'''
# 定义各类变量(比如输入维度的大小,输出维度的大小,hidden layer的unit个数等)
def create_baseline():
model = Sequential()
model.add(Dense(50,input_shape=(10,),activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(50,activation="relu"))
model.add(Dropout(0.2))
model.add(Dense(60,activation="relu"))
model.add(Dropout(0.1))
model.add(Dense(40,activation="softmax"))
return model
# 定义深度学习模型
model = create_baseline()
# 输出模型描述
model.summary()

# 定义SGD(stochastic gradient descent优化器),学习率为0.01.
sgd = optimizers.SGD(lr=0.01, decay=1e-6, momentum=0.9, nesterov=True)
# 定义模型的compile函数,设置loss为sparse_categorical_crossentropy, 利用上面定义的sgd优化器,利用准确率作为评估标准
model.compile(optimizer=sgd,loss="sparse_categorical_crossentropy",metrics=["accuracy"])
# 训练模型,设置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)
print(list(history.history))
[‘val_loss’, ‘val_acc’, ‘loss’, ‘acc’]
# 画一个图来表示准确率的变化情况(分别在训练数据和测试数据)
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))
4789/4789 [==============================] - 0s 7us/step
[0.057457029532449036, 0.9830862497033792]
Baseline Error: 1.69%
# 预测结果
test_class = model.predict_classes(X_test)
#画出混淆矩阵 confusion_matrix
confusion_matrix = confusion_matrix(Y_test,test_class)
confusion_matrix

# 输出在测试集上的precision, recall, f1-score, 不考虑类别的不平衡性,计算宏平均
test_f1 = f1_score(Y_test,test_class,average='macro')
print("f1 score ",test_f1)
test_recall = recall_score(Y_test,test_class,average='macro')
print("recall score ",test_recall)
test_precision = precision_score(Y_test,test_class,average='macro')
print("precision score ",test_precision)
f1 score 0.9829081582887067
recall score 0.9793255788442767
precision score 0.9866854429314621
# 输出在测试集上的precision, recall, f1-score, 考虑类别的不平衡性,需要计算类别的加权平均
test_f1 = f1_score(Y_test,test_class,average='weighted')
print("f1 score ",test_f1)
test_recall = recall_score(Y_test,test_class,average='weighted')
print("recall score ",test_recall)
test_precision = precision_score(Y_test,test_class,average='weighted')
print("precision score ",test_precision)
f1 score 0.9830521608962373
recall score 0.9830862392983921
precision score 0.9831695116893033
这篇博客介绍了一个使用深度学习对卫星数据进行分类的任务。数据集包含5个类别和10个特征,经过训练,模型达到了98.31%的准确率,基础误差为1.69%,并展示了f1分数、召回率和精确度等评估指标。

2964

被折叠的 条评论
为什么被折叠?



