热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

为什么要进行数据归一化

点击上方“小白学视觉”,选择加星标或“置顶”重磅干货,第一时间送达原文:https:medium.comurvashilluniyaw

点击上方“小白学视觉”,选择加"星标"或“置顶

重磅干货,第一时间送达db8ecb2724f5eda20c6f1f779291910b.png

原文:https://medium.com/@urvashilluniya/why-data-normalization-is-necessary-for-machine-learning-models-681b65a05029

数据归一化常用于机器学习的预处理阶段,当数据集的特征间具有不同的值范围时,数据归一化是非常有必要的,数据归一化的目的是使特征具有相同的度量尺度。

比如数据集包含了两个特征,年龄(x1)和收入(x2)。年龄范围为0~100岁之间,收入范围为0~20000及以上,收入大约是年龄的1000倍。因此收入和年龄具有不同的范围,当对该数据构建多元线性回归模型时,收入对结果影响远远大于年龄的值,但是这和实际情况是不相符的,因为忽视了年龄对结果的影响。

为了进一步解释,我们构造两个神经网络模型:一个不使用归一化数据,另一个使用归一化数据,比较这两个模型的结果,并将展示归一化对模型准确性的影响。

原始数据集的前几行:

8fd188950fde7222795d2eedda43ba94.png

使用非归一化的原始数据集构建神经网络模型:

'''Using covertype dataset from kaggle to predict forest cover type'''
#Import pandas, tensorflow and keras
import pandas as pd
from sklearn.cross_validation import train_test_split
import tensorflow as tf
from tensorflow.python.data import Dataset
import keras
from keras.utils import to_categorical
from keras import models
from keras import layers
#Read the data from csv file
df = pd.read_csv('covtype.csv')
#Select predictors
x = df[df.columns[:54]]
#Target variable
y = df.Cover_Type
#Split data into train and test
x_train, x_test, y_train, y_test = train_test_split(x, y , train_size = 0.7, random_state = 90)
'''As y variable is multi class categorical variable, hence using softmax as activation function and sparse-categorical cross entropy as loss function.'''
model = keras.Sequential([keras.layers.Dense(64, activation=tf.nn.relu,input_shape=(x_train.shape[1],)),keras.layers.Dense(64, activation=tf.nn.relu),keras.layers.Dense(8, activation= 'softmax')])model.compile(optimizer=tf.train.AdamOptimizer(),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
history1 = model.fit(x_train, y_train,epochs= 26, batch_size = 60,validation_data = (x_test, y_test))

输出结果为:

Output:
Epoch 1/26 406708/406708 [==============================]
- 19s 47us/step - loss: 8.2614 - acc: 0.4874 - val_loss: 8.2531 - val_acc: 0.4880
Epoch 2/26 406708/406708 [==============================]
- 18s 45us/step - loss: 8.2614 - acc: 0.4874 - val_loss: 8.2531 - val_acc: 0.4880
...............
Epoch 26/26 406708/406708 [==============================]
- 17s 42us/step - loss: 8.2614 - acc: 0.4874 - val_loss: 8.2531 - val_acc: 0.4880

模型的验证准确率仅仅为48.0%。

我们通过归一化数据集构建神经网络模型,通过对数据集去均值化以及将它缩放到单位方差来实现归一化。

数据集归一化代码:

from sklearn import preprocessingdf = pd.read_csv('covtype.csv')
x = df[df.columns[:55]]
y = df.Cover_Typex_train, x_test, y_train, y_test = train_test_split(x, y , train_size = 0.7, random_state = 90)#Select numerical columns which needs to be normalized
train_norm = x_train[x_train.columns[0:10]]
test_norm = x_test[x_test.columns[0:10]]# Normalize Training Data
std_scale = preprocessing.StandardScaler().fit(train_norm)
x_train_norm = std_scale.transform(train_norm)#Converting numpy array to dataframe
training_norm_col = pd.DataFrame(x_train_norm, index=train_norm.index, columns=train_norm.columns)
x_train.update(training_norm_col)
print (x_train.head())# Normalize Testing Data by using mean and SD of training set
x_test_norm = std_scale.transform(test_norm)
testing_norm_col = pd.DataFrame(x_test_norm, index=test_norm.index, columns=test_norm.columns)
x_test.update(testing_norm_col)
print (x_train.head())

归一化数据集的前5行数据:

f87e72862d8eef8df7c08698ea8af666.png

使用归一化数据集构建神经网络模型:

#Build neural network model with normalized data
model = keras.Sequential([keras.layers.Dense(64, activation=tf.nn.relu,input_shape=(x_train.shape[1],)),keras.layers.Dense(64, activation=tf.nn.relu),keras.layers.Dense(8, activation= 'softmax')])model.compile(optimizer=tf.train.AdamOptimizer(),loss='sparse_categorical_crossentropy',metrics=['accuracy'])
history2 = model.fit(x_train, y_train,epochs= 26, batch_size = 60,

输出结果为:

#Output:
Train on 464809 samples, validate on 116203 samples
Epoch 1/26 464809/464809 [==============================]
- 16s 34us/step - loss: 0.5433 - acc: 0.7675 - val_loss: 0.4701 - val_acc: 0.8022
Epoch 2/26 464809/464809 [==============================]
- 16s 34us/step - loss: 0.4436 - acc: 0.8113 - val_loss: 0.4410 - val_acc: 0.8124 Epoch 3/26
....................
Epoch 26/26 464809/464809 [==============================]
- 16s 34us/step - loss: 0.2703 - acc: 0.8907 - val_loss: 0.2773 - val_acc: 0.8893

模型验证集的准确率达到了88.9%,远比非归一化数据集构建的模型要好。

用图比较两个模型:

f99e09a754486e3199ef95886fafb00c.png

结果:由上面图标可知,模型1(左1)由很低的验证准确率(48%),当迭代次数增加时,模型的训练准确率和验证准确率均没有提高,模型2(右1)的训练准确率和验证准确率随着迭代次数的增加均有一定程度的提高。

原因分析:若特征间具有不同的值范围时,因此梯度更新时,会来回震荡,经过较长的时间才能达到局部最优值或全局最优值。为了解决该模型问题,我们需要归一化数据,我们确保不同的特征具有相同的值范围,这样梯度下降可以很快的收敛。从右1的图表可知,准确率随着迭代次数的增加而提高,当迭代次数为26时,准确率达到了88.93%。

下载1:OpenCV-Contrib扩展模块中文版教程

在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。

下载2:Python+OpenCV视觉实战项目52讲

在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。

下载3:Pytorch常用函数手册

在「小白学视觉」公众号后台回复:pytorch常用函数手册,即可下载含有200余个Pytorch常用函数的使用方式,帮助快速入门深度学习。

交流群

欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~

7727360e6b6f124ad031f84742a801de.png

16f7f4aa048056fd6b2774c8804e196e.png



推荐阅读
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 在第七天的深度学习课程中,我们将重点探讨DGL框架的高级应用,特别是在官方文档指导下进行数据集的下载与预处理。通过详细的步骤说明和实用技巧,帮助读者高效地构建和优化图神经网络的数据管道。此外,我们还将介绍如何利用DGL提供的模块化工具,实现数据的快速加载和预处理,以提升模型训练的效率和准确性。 ... [详细]
  • Python函数的高级用法[python基础]
    Python的函数也是一种值:所有函数都是function对象,这意味着可以把函数本身赋值给变量,就像把整数、浮点数、列表、元组赋值给变量一样;同样可以使用函数作为函数的形参,也可 ... [详细]
  • 普通树(每个节点可以有任意数量的子节点)级序遍历 ... [详细]
  • python模块之正则
    re模块可以读懂你写的正则表达式根据你写的表达式去执行任务用re去操作正则正则表达式使用一些规则来检测一些字符串是否符合个人要求,从一段字符串中找到符合要求的内容。在 ... [详细]
  • 目录预备知识导包构建数据集神经网络结构训练测试精度可视化计算模型精度损失可视化输出网络结构信息训练神经网络定义参数载入数据载入神经网络结构、损失及优化训练及测试损失、精度可视化qu ... [详细]
  • 利用python爬取豆瓣电影Top250的相关信息,包括电影详情链接,图片链接,影片中文名,影片外国名,评分,评价数,概况,导演,主演,年份,地区,类别这12项内容,然后将爬取的信息写入Exce ... [详细]
  • Ihavetwomethodsofgeneratingmdistinctrandomnumbersintherange[0..n-1]我有两种方法在范围[0.n-1]中生 ... [详细]
  • 解决问题:1、批量读取点云las数据2、点云数据读与写出3、csf滤波分类参考:https:github.comsuyunzzzCSF论文题目ÿ ... [详细]
  • 通过使用 `pandas` 库中的 `scatter_matrix` 函数,可以有效地绘制出多个特征之间的两两关系。该函数不仅能够生成散点图矩阵,还能通过参数如 `frame`、`alpha`、`c`、`figsize` 和 `ax` 等进行自定义设置,以满足不同的可视化需求。此外,`diagonal` 参数允许用户选择对角线上的图表类型,例如直方图或密度图,从而提供更多的数据洞察。 ... [详细]
  • 如何在 Node.js 环境中将 CSV 数据转换为标准的 JSON 文件格式? ... [详细]
  • 在该项目中,参与者需结合历史使用模式和天气数据,以预测华盛顿特区自行车共享系统的租赁需求。数据分析部分首先涉及数据的收集,包括用户骑行记录和气象信息,为后续模型构建提供基础。通过深入的数据预处理和特征工程,确保数据质量和模型准确性,最终实现对自行车租赁需求的有效预测。 ... [详细]
  • 本文提供了PyTorch框架中常用的预训练模型的下载链接及详细使用指南,涵盖ResNet、Inception、DenseNet、AlexNet、VGGNet等六大分类模型。每种模型的预训练参数均经过精心调优,适用于多种计算机视觉任务。文章不仅介绍了模型的下载方式,还详细说明了如何在实际项目中高效地加载和使用这些模型,为开发者提供全面的技术支持。 ... [详细]
  • 运用Isotonic回归算法解决鸢尾花数据集中的回归挑战
    本文探讨了利用Isotonic回归算法解决鸢尾花数据集中的回归问题。首先介绍了Isotonic回归的基本原理及其在保持单调性方面的优势,并通过具体示例说明其应用方法。随后详细描述了鸢尾花数据集的特征和获取途径,最后展示了如何将Isotonic回归应用于该数据集,以实现更准确的预测结果。 ... [详细]
  • 内网渗透技术详解:PTH、PTT与PTK在域控环境中的应用及猫盘内网穿透配置
    本文深入探讨了内网渗透技术,特别是PTH、PTT与PTK在域控环境中的应用,并详细介绍了猫盘内网穿透的配置方法。通过这些技术,安全研究人员可以更有效地进行内网渗透测试,解决常见的渗透测试难题。此外,文章还提供了实用的配置示例和操作步骤,帮助读者更好地理解和应用这些技术。 ... [详细]
author-avatar
不只是马甲呀_149
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有