机器学习过程实现和经典案例/ 机器学习 #5

in STEEM CN/中文5 months ago

李宏毅老师曾用“大象装进冰箱”来比喻机器学习。大象怎么装进冰箱?3个步骤:打开冰箱门、放进去、关门。解决问题的思路大体相同,机器学习也类似:选择函数模型,评估函数的优劣,确定最优的函数。

ml20.jpg

这个比喻很形象,把解决问题的思路抽象得很好。机器学习的实际流程要更复杂一些。大致分为5步:

  1. 问题的定义
  2. 数据准备和特征工程
  3. 模型(算法)的选择
  4. 机器学习(训练机器的过程)
  5. 评估和性能优化

这5个阶段。每一步的处理是否得当,都直接影响机器学习项目的成败。而且,这些步骤还需要再项目实战中以迭代的方式反复进行,以实现最优的效果。下面,我们来实践一个经典的案例:MNIST数据集,手写数字的识别。

MNIST数据集简介

MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST)。训练集(training set)由来自250个不同人手写的数字构成,其中50%是高中学生,50%来自人口普查局(the Census Bureau)的工作人员。测试集(test set)也是同样比例的手写数字数据,但保证了测试集和训练集的作者集不相交。

MNIST数据集一共有7万张图片,其中6万张是训练集,1万张是测试集。每张图片是 28 × 28 28\times 28 28×28的 0 − 9 0-9 0−9的手写数字图片组成。每个图片是黑底白字的形式,黑底用0表示,白字用0-1之间的浮点数表示,越接近1,颜色越白。

ml21.jpg

import numpy as np # 导入NumPy数学工具箱
import pandas as pd # 导入Pandas数据处理工具箱
from keras.datasets import mnist #从Keras中导入mnist数据集
#读入训练集和测试集
(X_train_image, y_train_lable), (X_test_image, y_test_lable) =  mnist.load_data()

from tensorflow.keras.utils import to_categorical # 导入keras.utils工具箱的类别转换工具
X_train = X_train_image.reshape(60000,28,28,1) # 给标签增加一个维度
X_test = X_test_image.reshape(10000,28,28,1) # 给标签增加一个维度
y_train = to_categorical(y_train_lable, 10) # 特征转换为one-hot编码
y_test = to_categorical(y_test_lable, 10) # 特征转换为one-hot编码
print ("数据集张量形状:", X_train.shape) # 特征集张量的形状
print ("第一个数据标签:",y_train[0]) # 显示标签集的第一个数据
# 数据集张量形状: (60000, 28, 28, 1)
# 第一个数据标签: [0. 0. 0. 0. 0. 1. 0. 0. 0. 0.]

from keras import models # 导入Keras模型, 和各种神经网络的层
from keras.layers import Dense, Dropout, Flatten, Conv2D, MaxPooling2D
model = models.Sequential() # 用序贯方式建立模型
model.add(Conv2D(32, (3, 3), activation='relu', # 添加Conv2D层
                 input_shape=(28,28,1))) # 指定输入数据样本张量的类型
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Conv2D(64, (3, 3), activation='relu')) # 添加Conv2D层
model.add(MaxPooling2D(pool_size=(2, 2))) # 添加MaxPooling2D层
model.add(Dropout(0.25)) # 添加Dropout层
model.add(Flatten()) # 展平
model.add(Dense(128, activation='relu')) # 添加全连接层
model.add(Dropout(0.5)) # 添加Dropout层
model.add(Dense(10, activation='softmax')) # Softmax分类激活,输出10维分类码
# 编译模型
model.compile(optimizer='rmsprop', # 指定优化器
              loss='categorical_crossentropy', # 指定损失函数
              metrics=['accuracy']) # 指定验证过程中的评估指标

model.fit(X_train, y_train, # 指定训练特征集和训练标签集
          validation_split = 0.3, # 部分训练集数据拆分成验证集
          epochs=5, # 训练轮次为5轮
          batch_size=128) # 以128为批量进行训练

score = model.evaluate(X_test, y_test) # 在测试集上进行模型评估
print('测试集预测准确率:', score[1]) # 打印测试集上的预测准确率
# 测试集预测准确率: 0.98580002784729

pred = model.predict(X_test[0].reshape(1, 28, 28, 1)) # 预测测试集第一个数据
print(pred[0],"转换一下格式得到:",pred.argmax()) # 把one-hot码转换为数字
import matplotlib.pyplot as plt # 导入绘图工具包
plt.imshow(X_test[0].reshape(28, 28),cmap='Greys') # 输出这个图片

最后结果输出如下:
ml22.jpg

不错,很快就在Colab上完成了这个经典的案例!虽然有些代码不是一下就能理解,但跑起来了就算是成功啰!

Coin Marketplace

STEEM 0.17
TRX 0.16
JST 0.028
BTC 73898.71
ETH 2624.92
USDT 1.00
SBD 2.40