机器学习—神经网络算法—调sklearn库实现(Accuracy、Precision、Recall、F1-score)

关于神经网络算法的推导及手写底层的实现,在下面的超链接中详细的总结了,现在我们来用sklearn库来快速实现神经网络算法的操作。

神经网络算法的推导及手写代码实现

1、神经网络算法的调库实现

import matplotlib.pyplot as plt
import numpy as np

#导入sklearn.neural_network库
from sklearn.neural_network import MLPClassifier

#导入统计相关库     混淆矩阵 分类报告
from sklearn.metrics import confusion_matrix,classification_report

#设置正常显示汉字、负号
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False

#导入手写数字识别数据集
#手写数字识别数据集imgX: 共包含5000个数据,分为10类,每个数据包含400属性
#标签集labely: 共包含50 00个数据,每个数据为数字1-10
#独立属性: 数据包含400个独立属性, 代表每个手写数字图像的点阵数据

X = np.loadtxt(r'E:\PC_Project\machine learning1\day10\imagesData.txt',delimiter=',')
y = np.loadtxt(r'E:\PC_Project\machine learning1\day10\labelsData.txt',delimiter=',')

#数据预处理
def preprocess(X,y):
    #进行0-1缩放特征
    X_min = np.min(X)
    X_max = np.max(X)
    X = (X-X_min)/(X_max-X_min)
    return X,y

X,y = preprocess(X,y)

#洗牌
m = len(X)
np.random.seed(3)  #设置随机种子
order = np.random.permutation(m)
X = X[order]
y = y[order]

#数据切分
a = int(0.7*m)
train_X,test_X = np.split(X,[a])
train_y,test_y = np.split(y,[a])

#alpha正则化参数   学习率
# 隐藏层共2层,单元数分别为400,100;正则化参数0.1;最大迭代次数为300
mlp = MLPClassifier(hidden_layer_sizes=(400,100),alpha=0.1,max_iter=300)

# -使用训练集完成模型的训练,并计算和输出训练集和测试集的准确率
mlp.fit(train_X,train_y.ravel())   #train_y要转成一维数组格式  .ravel()

print('训练集准确率=',mlp.score(train_X,train_y))
print('测试集准确率=',mlp.score(test_X,test_y))

# -分别计算并输出训练集和测试集的混淆矩阵和分类报告
#注意传入的第一个参数为真实值 第二个参数为预测值
print('训练集混淆矩阵\n',confusion_matrix(train_y,mlp.predict(train_X)))
print('测试集混淆矩阵\n',confusion_matrix(test_y,mlp.predict(test_X)))
print('训练集分类报告\n',classification_report(train_y,mlp.predict(train_X),))
print('测试集分类报告\n',classification_report(test_y,mlp.predict(test_X)))

2、结果展示

训练集准确率= 1.0
测试集准确率= 0.9736666666666667
训练集混淆矩阵
 [[668   0   0   0   0   0   0   0   0   0]
 [  0 792   0   0   0   0   0   0   0   0]
 [  0   0 689   0   0   0   0   0   0   0]
 [  0   0   0 733   0   0   0   0   0   0]
 [  0   0   0   0 705   0   0   0   0   0]
 [  0   0   0   0   0 589   0   0   0   0]
 [  0   0   0   0   0   0 717   0   0   0]
 [  0   0   0   0   0   0   0 757   0   0]
 [  0   0   0   0   0   0   0   0 658   0]
 [  0   0   0   0   0   0   0   0   0 692]]
测试集混淆矩阵
 [[331   0   0   0   0   0   0   1   1   0]
 [  0 331   0   0   1   0   0   1   1   1]
 [  1   1 292   1   2   2   1   1   1   0]
 [  1   1   2 289   0   2   0   2   1   1]
 [  0   1   1   0 270   0   0   0   0   3]
 [  1   1   0   3   0 267   0   0   1   1]
 [  1   1   0   0   2   2 287   0   4   0]
 [  0   1   0   0   2   0   0 308   0   2]
 [  0   1   1   3   1   0   1   0 275   4]
 [  2   1   0   1   8   1   0   1   1 271]]
训练集分类报告
               precision    recall  f1-score   support

         0.0       1.00      1.00      1.00       668
         1.0       1.00      1.00      1.00       792
         2.0       1.00      1.00      1.00       689
         3.0       1.00      1.00      1.00       733
         4.0       1.00      1.00      1.00       705
         5.0       1.00      1.00      1.00       589
         6.0       1.00      1.00      1.00       717
         7.0       1.00      1.00      1.00       757
         8.0       1.00      1.00      1.00       658
         9.0       1.00      1.00      1.00       692

    accuracy                           1.00      7000
   macro avg       1.00      1.00      1.00      7000
weighted avg       1.00      1.00      1.00      7000

测试集分类报告
               precision    recall  f1-score   support

         0.0       0.98      0.99      0.99       333
         1.0       0.98      0.99      0.98       335
         2.0       0.99      0.97      0.98       302
         3.0       0.97      0.97      0.97       299
         4.0       0.94      0.98      0.96       275
         5.0       0.97      0.97      0.97       274
         6.0       0.99      0.97      0.98       297
         7.0       0.98      0.98      0.98       313
         8.0       0.96      0.96      0.96       286
         9.0       0.96      0.95      0.95       286

    accuracy                           0.97      3000
   macro avg       0.97      0.97      0.97      3000
weighted avg       0.97      0.97      0.97      3000

3、Accuracy、Precision、Recall、F1-score

TP: 预测为1(Positive),实际也为1(Truth-预测对了)
TN: 预测为0(Negative),实际也为0(Truth-预测对了)
FP: 预测为1(Positive),实际为0(False-预测错了)
FN: 预测为0(Negative),实际为1(False-预测错了)

Accuracy = (预测正确的样本数)/(总样本数)= (TP+TN)/(TP+TN+FP+FN)
Precision = (预测为1且正确预测的样本数)/(所有预测为1的样本数) = TP/(TP+FP)
Recall = (预测为1且正确预测的样本数)/(所有真实情况为1的样本数) = TP/(TP+FN)

Precision 就是检索出来的条目中(比如:文档、网页等)有多少是准确的,
Recall就是所有准确的条目有多少被检索出来了。
F1值是精确度和召回率的调和平均值

  精确度和召回率都高时, F1 值也会高. F1值在1时达到最佳值(完美的
  精确度和召回率),最差为0.在二元分类中, F1值是测试准确度的量度。

我们当然希望检索的结果P越高越好,R也越高越好,但事实上这两者在某些情况下是矛盾的。比如极端情况下,我们只搜出了一个结果,且是准确的,那么P就是100%,但是R就很低;而如果我们把所有结果都返回,那么必然R是100%,但是P很低。

你可能感兴趣的:(机器学习)