机器学习之 数据预处理 preprocessing_state_preprocessing-程序员宅基地

技术标签: 机器学习  

数据归一化及两种常用归一化方法

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。以下是两种常用的:

min-max标准化(Min-Max Normalization)

也称为离差标准化,是对原始数据的线性变换,使结果值映射到[0 , 1]之间。转换函数如下: 
这里写图片描述 
其中max为样本数据的最大值,min为样本数据的最小值。这种方法有个缺陷就是当有新数据加入时,可能导致max和min的变化,需要重新定义。

min-max标准化python代码如下:

import numpy as np

arr = np.asarray([0, 10, 50, 80, 100])
for x in arr:
    x = float(x - np.min(arr))/(np.max(arr)- np.min(arr))
    print x

# output
# 0.0
# 0.1
# 0.5
# 0.8
# 1.0
   
   
    
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

Z-score标准化方法

也称为均值归一化(mean normaliztion), 给予原始数据的均值(mean)和标准差(standard deviation)进行数据的标准化。经过处理的数据符合标准正态分布,即均值为0,标准差为1。转化函数为: 
这里写图片描述 
其中  μ  为所有样本数据的均值, σ 为所有样本数据的标准差。

import numpy as np

arr = np.asarray([0, 10, 50, 80, 100])
for x in arr:
    x = float(x - arr.mean())/arr.std()
    print x

# output
# -1.24101045599
# -0.982466610991
# 0.0517087689995
# 0.827340303992
# 1.34442799399

【ML】数据预处理

前言

对于数据的预处理,没有固定的步骤。 
下文写的仅仅的常规的一些小步骤。 
具体的预处理,还需要根据数据以及需求来自行处理。

====================================

Python

STEP1、导入依赖包

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
      
      
       
  • 1
  • 2
  • 3

把np作为numpy的缩写,后面可以直接使用np来调用各种方法。

==> 
numpy系统是python的一种开源的数值计算扩展。 
这种工具可用来存储和处理大型矩阵,比python自身的嵌套列表结构要高效的多。 
你可以理解为凡是和矩阵有关的都用numpy这个库。

==> 
matplotlib.pyplot是用来做数据的展示。也就是数据的可视化。

==> 
pandas该工具是为了解决数据分析任务而创建的。pandas 纳入了大量库和一些标准的数据模型,提供了高效地操作大型数据集所需的工具。 
pandas提供了大量能使我们快速便捷地处理数据的函数和方法。它是使python成为强大而高效的数据分析环境的重要因素之一。

======== 
选择好这三行代码,敲下shift+return组合键。

如果结果如下,说明库已经导入了。 
我们的环境配置也完全没有问题。

如果环境的配置有问题,参考博客: 
http://blog.csdn.net/wiki_su/article/details/78404808

STEP2、读取数据

原始数据在云盘,有需要的自行下载吧。 
链接:http://pan.baidu.com/s/1eRHXACU 
密码:4q8c

Spyder中,设置好文件路径。千万不要忘了。

输入下面的代码。然后选择这行代码,敲下shift+return组合键。

#import dataset
dataset = pd.read_csv('Data.csv')
      
      
       
  • 1
  • 2

我们在explorer中会看到我们命名的dataset

dataset

双击打开

根据上面的dataset的那个图我们可以看出,我们的目的是想要通过地区,年龄,薪资来看购买力。

那我们把country,age,salary作为X,purchased作为Y。 
得到二者之间的关系,就得到了country,age,salary和purchased之间的某种关系。

#取出所有的行,(去掉最后一列 purchased)
X = dataset.iloc[:,:-1].values

取出结果
Y = dataset.iloc[:,3].values
      
      
       
  • 1
  • 2
  • 3
  • 4
  • 5

运行结果如下:

然后我们双击打开X,会发现打不开。这个是因为数据类型的原因。

我们可以在代码中输入X,然后选中运行。

STEP3、遗失数据的处理

我们回过头在看上面的dataset的图。 
我们会发现数据缺少几个。他用了nan来标记缺失的数据。

注意: 
对于缺失的数据,我们大体上有3中处理方法: 
1、通过数据中的最大值和最小值,我们把中间值赋值给缺失的数据; 
2、通过所有数据的平均值来赋值给缺失的数据; 
3、删除有空缺数据项;

择优排队的结果是:1 > 3 、 2 > 3 
因为在大部分的时候,我们的数据会非常稀少。每一个数据都来之不易。我们不能轻易的删掉。

============

导入库。这个库就是专门做数据预处理的。

#预处理impoter
from sklearn.preprocessing import Imputer

#做遗失的部分的处理 用NaN的方式填补上来
#axis:传0或者。0代表处理列 ,1代表处理行。
#strategy的值有mean,median,most_frequent ,分别代表:平均数 中间值 最常出现的数值
imputer = Imputer(missing_values = 'NaN',strategy = 'mean', axis = 0)

#1-3行缺失的部分补上
imputer = imputer.fit(X[:,1:3])

#返回处理好的数据
X[:,1:3] = imputer.transform(X [:,1:3])
      
      
       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

对于这个方法,我们不熟悉可以通过Help来查看。不过前提是 
from sklearn.preprocessing import Imputer这行代码运行过。

然后我们运行下,会发现缺失的数据已经被我们填充好了。

STEP4、数据明确化

数据明确就是为了提高运行的速度和准确性。 
当然我们不进行数据明确也可以…为了更好,还是加上这步吧。

我们看country 和 purchased ,如果都变成用数字表示。那我们运行的效率就提升上去了。

热编码的优点: 
1.能够处理非连续型数值特征。 
2.在一定程度上也扩充了特征。

#数据明确
#提高运行的速度和准确性
#把数据明确化,变成数字
#OneHotEncoder 热编码
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

#把城市数据进行数字明确化
labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

#热编码,拿出来做数组的编排
onehotencoder = OneHotEncoder()
X = onehotencoder.fit_transform(X).toarray()

#把结果数据进行城市化
labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)
      
      
       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行,然后我们看下结果:

STEP5、数据分割

数据分割。是把数据分为两组。一组A用来训练,一组B是用来测试。 
然后通过测试数据的Y,用训练组的模型得到的Y值进行比较。

就是比较B.Y 和 ResultA (B.X) 的值是否一样,如果一样或者差别不大,那么我们做出来的模型就是可靠的。

#数据分割
from sklearn.cross_validation import train_test_split

#0 取一次就好了,不要每次都取两组随机的数字
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.2,random_state = 0)
      
      
       
  • 1
  • 2
  • 3
  • 4
  • 5

我们就可以看到分割好的两组数据。 
X_train、Y_train 
X_test 、Y_test

STEP6、数据缩放

数据缩放把这些数据,规范在一个范围中。 
如果不这么做的话,比如 0 ,0.001, 0.2, 99… 这类数据非常不易看。

from sklearn.preprocessing import StandardScaler

#缩放
sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)
Y_train = sc_X.fit_transform(Y_train)
Y_test = sc_X.fit_transform(Y_test)
      
      
       
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

我们打开X_train,然后format调成小数一位。结果如下。

以上就是数据预处理的几步了。

END 完整代码

#数据预处理 data preprocessing

import numpy as np
import matplotlib.pyplot as plt
import pandas as pd

#import dataset
dataset = pd.read_csv('Data.csv')

#Matrix of feature
X = dataset.iloc[:,:-1].values
Y = dataset.iloc[:,3].values

#预处理impoter
from sklearn.preprocessing import Imputer

imputer = Imputer(missing_values = 'NaN',strategy = 'mean', axis = 0)
imputer = imputer.fit(X[:,1:3])
#返回处理好的数据
X[:,1:3] = imputer.transform(X [:,1:3])

#数据明确
from sklearn.preprocessing import LabelEncoder,OneHotEncoder

labelencoder_X = LabelEncoder()
X[:,0] = labelencoder_X.fit_transform(X[:,0])

onehotencoder = OneHotEncoder()
X = onehotencoder.fit_transform(X).toarray()

labelencoder_Y = LabelEncoder()
Y = labelencoder_Y.fit_transform(Y)

#数据分割
from sklearn.cross_validation import train_test_split

#0 取一次就好了,不要每次都取两组随机的数字
X_train,X_test,Y_train,Y_test = train_test_split(X,Y,test_size = 0.2,random_state = 0)

#缩放X
from sklearn.preprocessing import StandardScaler

sc_X = StandardScaler()
X_train = sc_X.fit_transform(X_train)
X_test = sc_X.fit_transform(X_test)
Y_train = sc_X.fit_transform(Y_train)
Y_test = sc_X.fit_transform(Y_test)

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_37634812/article/details/78647265

智能推荐

oracle去重差个数,多表查询 - Oracle 查询技巧与优化_数据库技术_Linux公社-Linux系统门户网站...-程序员宅基地

文章浏览阅读254次。前言上一篇blog介绍了Oracle中的单表查询和排序的相关技巧,本篇blog继续介绍查询中用的最多的——多表查询的技巧与优化方式,下面依旧通过一次例子看一个最简单的多表查询。多表查询上一篇中提到了学生信息表的民族代码(mzdm_)这个字段通常应该关联字典表来查询其对应的汉字,实际上我们也是这么做的,首先简单看一下表结构,首先是字典表:如上图,可以看到每个民族代码和名称都是由两个字段——“item..._oracle 统计去重后的数量优化

基于51单片机的门锁系统_基于c51单片机的指纹锁的设计的主函数怎么写-程序员宅基地

文章浏览阅读5.4k次,点赞25次,收藏103次。8051单片机按键门锁系统概述设计思想仿真原理图代码展示main.ckeys.hkeys.clcd.hlcd.cdelay.hdelay.c说明实例图片概述本人纯属小白,无聊就想着做一个密码锁,由于知识的不足,以及制作是间断周期性的,所以有一些bug,有些也不够想法完善,但还是要把这些记录下来,也算是给自己的一个交代。设计思想以89c51单片机作为核心,4*4矩阵键盘输入,lcd1602输出,舵机作为机械动作。实现交互,密码的输入,显示,修改,提示,开门动作。代码分为以下四部分:LCD库 :端口_基于c51单片机的指纹锁的设计的主函数怎么写

Lua使用 lua_shared_dict 共享内存和进程间变量、lua脚本中实现美化打印显示table的函数、以及Nginx服务器非覆盖安装lua扩展的方法-程序员宅基地

文章浏览阅读417次,点赞18次,收藏13次。共享内存就是在内存块中分配出一个空间,让几个不相干的进程都能访问存储在这里面的变量数据,实际我们用过的redis,memcache也具有共享内存的意义,redis,memcache等是更高级的可跨服务器的共享内存,在lua中使用共享内存也非常简单。语法:lua_shared_dict 意义:定义一块名为name的共享内存空间,内存大小为size。_lua_shared_dict

[原创]VMware Workstation 14.1.3 Pro安装CentOS_7.6.1810-程序员宅基地

文章浏览阅读38次。【原文链接】:https://blog.tecchen.xyz ,博文同步发布到博客园。由于精力有限,对文章的更新可能不能及时同步,请点击上面的原文链接访问最新内容。欢迎访问我的个人网站:https://www.tecchen.xyz 。前言Linux作为最主流的服务器操作系统,在市场上的使用占比保持着领先对位。其中CentOS作为基于Red Hat Linux 提供的可自由使用..._vmware pro 14.1.3 csdn下载

【完美解决系列】duplicate entry: com/google/gson/annotations/Expose.class-程序员宅基地

文章浏览阅读1.1w次,点赞8次,收藏5次。项目在引入Retrofit2时,运行项目时会报出以下错误:Error:Execution failed for task ':app:transformClassesWithJarMergingForDebug'.> com.android.build.api.transform.TransformException: java.util.zip.ZipException: duplicate e_duplicate entry: com/

Android开发规范,性能优化-程序员宅基地

文章浏览阅读3.7k次。本文带您全面了解Android开发规范,其中包括Android编码规范,Android性能优化和Android UI优化,读完绝对不会后悔的好文章。一、Android编码规范1.java代码中不出现中文,最多注释中可以出现中文2.局部变量命名、静态成员变量命名只能包含字母,单词首字母出第一个外,都为大写,其他字母都为小写

随便推点

mybatis JdbcTypeInterceptor - 运行时自动添加 jdbcType 属性-程序员宅基地

文章浏览阅读130次。上代码:package tk.mybatis.plugin;import org.apache.ibatis.executor.ErrorContext;import org.apache.ibatis.executor.parameter.ParameterHandler;import org.apache.ibatis.mapping.BoundSql;impo..._mybatis 增加 jdbctype

ONL(open network linux) from OCP-程序员宅基地

文章浏览阅读169次。https://opennetlinux.org/github:https://github.com/OpenComputeProject/OpenNetworkLinuxOpen Network Linuxis a Linux distribution for "bare metal" switches, that is, network forwarding devices buil..._open network linux

请注意,这不是自动驾驶汽车,这是一艘机器人帆船-程序员宅基地

文章浏览阅读99次。Saildrone机器人帆船驶进了白令海峡,它们的任务是统计鱼的数量,具体来说,是统计黑线鳕鱼的数量。现在的硅谷,至少有20家公司正在追寻着自己的自动驾驶汽车梦,但梦想并没有实现。不过,自动驾驶帆船却已经实实在在地落地了。Saildrone是一家提供水上无人机服务的公司,公司于2012年在加利福尼亚阿拉米达市成立。公司的主要业务是通过水上无人机...

Android开发指南-窗口小部件_android 开发权威指南 小部件-程序员宅基地

文章浏览阅读585次。http://dev.10086.cn/cmdn/wiki/index.php?doc-view-2228.htmlAndroid开发指南-窗口小部件(App Widgets) 目录1 应用程序窗口小部件App Widgets 2 基础知识The Basics 3 在清单中声明一个应用小部件 4 增加AppWidgetProv_android 开发权威指南 小部件

最热开源项目,以及java基础整理_软件java项目最热算法?-程序员宅基地

文章浏览阅读186次。1、halo,这是一个轻快,简洁,功能强大,使用Java开发的博客系统。项目地址:https://github.com/halo-dev/halo Star 61392、jeecg-boot项目地址:https://github.com/zhangdaiscott/jeecg-boot Star 2873这是一款基于代码生成器的JAVA快速开发平台!提高UI能力的同时,降低前后分离的..._软件java项目最热算法?

redis 获取不到_Redis::scan 函数时获取不到数据-程序员宅基地

文章浏览阅读1.7k次。我在redis 组件 src/Connection/Connection.php 文件里面添加了scan替代 把迭代值返回 解决了这个问题* @param mixed $iterator* @param string $key* @param array $keys** @return array*/public function scan($iterator, string $pattern ...