数字识别篇 (一) : 了解数据和处理数据
房地产不太景气
在每次开始之前都需要先运行以下代码,不报错方可继续
# Python 的版本需要大于3.5
import sys
assert sys.version_info >= (3, 5)# Scikit-Learn的版本需要大于0.20
import sklearn
assert sklearn.__version__ >= "0.20"import numpy as np
import os#绘图设置
%matplotlib inline
import matplotlib as mpl
import matplotlib.pyplot as plt
mpl.rc('axes', labelsize=14)
mpl.rc('xtick', labelsize=12)
mpl.rc('ytick', labelsize=12)
所以我们换了一份工作,现在这家公司在开发一款手机手写输入法,我们负责数字的部分
假设负责数据收集的同事已经将收集好的一些手写数字图片打包上传好了,让我们下载下来
现在可以开始尝试理解这部分代码了,尤其建议和加州房价篇中的这部分代码对比理解
import os
import zipfile
import urllib.requestDOWNLOAD_ROOT = "https://dayangai.coding.net/p/dayangai/d/dayangai/git/raw/master/"
DIGIT_PATH = os.path.join("datasets", "digit")
DIGIT_URL = DOWNLOAD_ROOT + "datasets/digit/digit.zip"def fetch_digit_data(digit_url=DIGIT_URL, digit_path=DIGIT_PATH):if not os.path.isdir(digit_path):os.makedirs(digit_path)zip_path = os.path.join(digit_path, "digit.zip")opener = urllib.request.URLopener() #opener这三行代码现在可以不用理解,主要作用是将数据下载下来opener.addheader('User-Agent', 'whatever')opener.retrieve(digit_url, zip_path)digit_zip = zipfile.ZipFile(zip_path)digit_zip.extractall(path=digit_path)digit_zip.close()
fetch_digit_data()
import pandas as pddef load_digit_data(digit_path=DIGIT_PATH):csv_path = os.path.join(digit_path, "digit.csv")return pd.read_csv(csv_path)
digit = load_digit_data()
这样整个数据集就加载到digit里了
黑白图片一般由若干个像素点组成,每个像素点由一个0-255的数字控制,数字越大,这个像素点就越黑
我们来看看
digit.head()
输出:
digit.info()
输出:
784个像素点,加一个数字类别,也就是784个特征加一个目标(target),而且全是数字(int),不用处理,完美!
先把类别分离出来
digit_target = digit["class"].copy()
digit = digit.drop("class", axis=1)
我们问了一下同事,同事回答说每张原图片都是正方形,也就是28 x 28的图片(28 x 28=784),不过他已经帮我们整理好了,现在是1 x 784,方便我们
训练模型,所以如果我们想看看图片,得用reshape来还原,就选第一张吧(housing.values[0])
#这里可以注意一下加了values之后的类型,为什么要加values?
import matplotlib as mpl
from pylab import *
mpl.rcParams['font.sans-serif'] = ['SimHei']
import matplotlib.pyplot as pltplt.imshow(digit.values[0].reshape(28,28), cmap="binary")
plt.axis("off")
plt.show()
输出:
还不赖,是个5,看看digit_target这边是不是对的上
digit_target[0]
输出:
5
数据处理:数据增强(Data Augmentation)
在实际的生产活动中,机器学习应用的难点往往不是模型的选择和训练,而是数据难以收集,所以我们要尽最大努力利用好收集到的数据,对于不同的任务,数据增强的方法也各不相同,所以我们必须因地制宜,
对于目前的数字识别任务来说,我们可以把每个数字分别向上,下,左,右四个不同的方向平移一段距离,形成新的图片,这样我们的数据集一下就翻了四倍,不要小看这样的移动,因为在原数据集中每个数字都是居中的,还记得我们在加州房价篇提到过的过度拟合吗(overfit),如果仅在原数据集上训练,我们的模型很有可能无法识别不居中的数字,
不要认为这样的扩展降低了数据集的质量,虽然在人眼看来如此,但实际上像素的位置是发生了巨大变化的
数据增强既能避免过度拟合,又能扩展有限的数据集,可谓两全其美,妙哉!
我们看看怎么做
from scipy.ndimage.interpolation import shift
def shift_image(image, dx, dy):image = image.reshape((28, 28))shifted_image = shift(image, [dy, dx], cval=0, mode="constant")return shifted_image.reshape([-1])#返回1 x 784的图片
图片数据增强的函数定义好了,拿第一个图片看看效果
image = digit.values[0]
shifted_image_down = shift_image(image, 0, 5)
shifted_image_left = shift_image(image, -5, 0)
# subplot是为了能在同一代码格中输出多个图片
plt.figure(figsize=(12,3))
plt.subplot(131)
plt.title("原来的", fontsize=14)
plt.imshow(image.reshape(28, 28), cmap="binary")
plt.subplot(132)
plt.title("向上", fontsize=14)
plt.imshow(shifted_image_down.reshape(28, 28), cmap="binary")
plt.subplot(133)
plt.title("向左", fontsize=14)
plt.imshow(shifted_image_left.reshape(28, 28), cmap="binary")
plt.show()
输出:
没毛病,我们全部转换好
#想一想为什么这里需要用list绕一下,而不能直接用dataframe或者dataframe.values
X_train_augmented = [image for image in digit.values]
y_train_augmented = [label for label in digit_target.values]for dx, dy in ((1, 0), (-1, 0), (0, 1), (0, -1)):for image, label in zip(digit.values, digit_target.values):# zip 可以把两者放一起循环遍历X_train_augmented.append(shift_image(image, dx, dy))y_train_augmented.append(label)X_train_augmented = np.array(X_train_augmented)
y_train_augmented = np.array(y_train_augmented)
现在数据集的类型是array,而不是dataframe,不过不影响我们之后的训练,因为dataframe主要是用来查看数据集的特点的,在我们了解并处理好了数据集之后,可以直接用array来训练
好了,这个关于数据我们就处理好了,数字识别是分类问题,而房价预测是回归问题,二者最大的区别在于如何计算模型的误差,在房价预测里我们使用的是均方根误差,
而对于一个分类问题,我们该使用什么呢,我们在下一个部分着重讨论
对应视频
转载请注明出处
数字识别篇 (一) : 了解数据和处理数据相关推荐
- OpenCV 玩九宫格数独(二):knn 数字识别
欢迎大家关注腾讯云技术社区-博客园官方主页,我们将持续在博客园为大家推荐技术精品文章哦~ 作者:刘潇龙 前言 首先需要说明,这里所说的数字识别不是手写数字识别! 但凡对机器学习有所了解的人,相信看到数 ...
- Keras搭建CNN(手写数字识别Mnist)
MNIST数据集是手写数字识别通用的数据集,其中的数据是以二进制的形式保存的,每个数字是由28*28的矩阵表示的. 我们使用卷积神经网络对这些手写数字进行识别,步骤大致为: 导入库和模块 我们导入Se ...
- BP神经网络(手写数字识别)
1实验环境 实验环境:CPU i7-3770@3.40GHz,内存8G,windows10 64位操作系统 实现语言:python 实验数据:Mnist数据集 程序使用的数据库是mnist手写数字数据 ...
- Python人工智能--实现手写数字识别
文章目录 一.K-近邻算法(KNN)概述 二.Python实现 三.Python实现手写数字识别 四.K值选取对数据准确率的影响 在做此项目之前,首先要明白何为KNN算法. 一.K-近邻算法(KNN) ...
- 基于朴素贝叶斯的手写数字识别
基于朴素贝叶斯的手写数字识别 关于数据集 关于SIMD 关于python 数据预处理 总结 关于数据集 MNIST数据库(http://www.cs.nyu.edu/~roweis/data.html ...
- OpenCV玩九宫格数独(二):knn数字识别
参考: 1.http://blog.csdn.net/xingchenbingbuyu/article/details/70208199 2.https://github.com/LiuXiaolon ...
- Matlab搭建AlexNet实现手写数字识别
Matlab搭建AlexNet实现手写数字识别 个人博客地址 文章目录 Matlab搭建AlexNet实现手写数字识别 环境 内容 步骤 准备MNIST数据集 数据预处理 定义网络模型 定义训练超参数 ...
- svm手写数字识别_KNN 算法实战篇如何识别手写数字
上篇文章介绍了KNN 算法的原理,今天来介绍如何使用KNN 算法识别手写数字? 1,手写数字数据集 手写数字数据集是一个用于图像处理的数据集,这些数据描绘了 [0, 9] 的数字,我们可以用KNN 算 ...
- pytorch MNIST 手写数字识别 + 使用自己的测试集 + 数据增强后再训练
文章目录 1. MNIST 手写数字识别 2. 聚焦数据集扩充后的模型训练 3. pytorch 手写数字识别基本实现 3.1完整代码及 MNIST 测试集测试结果 3.1.1代码 3.1.2 MNI ...
最新文章
- 小目标检测的增强算法
- Selenium3自动化测试——13.下载文件功能
- Pycharm同步git代码提示:Merge failed
- 从《跨过鸭绿江》中看程序员的时间管理实践
- [转帖]Beyond Compare如何进行二进制比较
- 用c语言编写函数流程,C语言课程设计————写下流程图! 谢谢
- 感知机算法的对偶形式
- Ubuntu下完全删除Edraw软件
- html 卫星地图显示地名,卫星图看:河南10个名字非常好听的县(区),你认识几个?...
- springboot整合J2cache简单使用
- 互联网知识变现,不起眼利润高的冷门行业有哪些?
- Skipped xxx -- Node remains in conflict
- akka typed mysql_akka-typed(8) - CQRS读写分离模式
- 《BiLSTM with Multi-Polarity Orthogonal Attention for Implicit Sentiment Analysis》论文阅读笔记
- linux系统下,python 调用终端禁用鼠标键盘
- python从入门到精通编程汪老师_游戏AI开发从入门到精通:最全游戏AI编程书单...
- v-model是什么?怎么使用?
- TensorFlow-gpu使用方法
- php当月1号怎么获取,php获取下月1号和月底最后一天的时间
- vue实现考勤排班日历(备忘)
热门文章
- Linux作业 使用make命令和分析makefile文件
- MATLAB设置起始文件夹
- SingleChildScrollView内容不超出屏幕时下拉回弹
- 编码(字符串) SDUT
- python青蛙跳台阶_Python算法题(一)——青蛙跳台阶
- CISP含金量如何?
- 单页面SPA(如react,vue)网站的服务器渲染SSR之SEO大杀器rendertron(超详细配置+避坑)
- php序顶部导航,页面上下滚动改变顶部导航的定位方式
- 【PyTorch训练中Dataset多线程加载数据,比Dataloader里设置多个workers还要快】
- 数据分析应用在传统运营后变身数据化运营