归一化是数据处理的常用方法之一,目的是消除不同评价指标之间的量纲对数据分析结果的影响,使各指标处于同一数量级,以解决数据指标之间的可比性问题。
目前学术界关于归一化和标准化的概念还不统一,常常会把这两个概念混用,但它们都是特征处理的一种方法,具体区别看公式就好区分了。这的归一化是指min-max归一化(Min-Max Normalization),基于数据的最小值和最大值对原始数据做线性变换,将结果值映射到[0 , 1]之间,归一化公式如下:
其实,在sklearn库中已经有非常优秀的数据归一化函数——MinMaxScaler(),我们只需要调用该函数就可以轻松实现数据归一化处理。但是这里为了加深对数据归一化的理解,就自己编写了一个数据归一化的程序。
数据集准备
在对kdd数据集标准化之前,需要先对数据集进行数值化处理,可以参考我上一篇文章:
追梦小公子:手写代码实现KDD CUP99数据集的数据数值化处理zhuanlan.zhihu.com数值化处理后的kdd数据集文件为kddcup.data.numerization.txt,百度网盘下载链接:
但是kdd数据集的第4817100行数据存在错误,如图1所示。
该行数据有56列,比正常数据多了14个特征,说明这行数据是错误的。所以在数值化处理后,我手动删除了错误的那一行数据,得到数值化并修正后的kdd数据集文件kddcup.data.numerization_corrected.txt,这也是本文用的数据集,百度网盘下载链接为:
---------------------------------------------代码---------------------------------------------
导入所需的库
import numpy as np
import csv
from time import *
读取数据集文件
global x_data # 定义全局变量
begin_time = time() # 读取文件开始时间
data_numerization = open("kddcup.data.numerization_corrected.txt") # 打开数值化后的kdd数据集文件
lines = data_numerization.readlines() # 按行读取所有数据,并返回列表
line_nums = len(lines)
x_data = np.zeros((line_nums, 42)) # 创建line_nums行 para_num列的矩阵
for i in range(line_nums):
line = lines[i].strip().split(',')
x_data[i, :] = line[0:42] # 获取42个特征
data_numerization.close()
print('数据集大小:',x_data.shape)
# 耗时分析
end_time = time() # 读取文件结束时间
total_time = end_time-begin_time # 读取文件耗时
print('读取文件耗时:',total_time,'s')
定义数据归一化函数
def MinMax_Normalization(x, n):
if np.max(x)-np.min(x) == 0:
x_data[:, n] = 0
else:
x_data[:, n] = (np.max(x) - np.min(x)) / (np.max(x) - np.min(x))
print("The ", n , "feature is normalization.")
获取每一列特征,并依次归一化
begin_time = time() # 归一化开始时间
for i in range(42):
MinMax_Normalization(x_data[:, i], i)
# 耗时分析
end_time = time() # 归一化结束时间
total_time = end_time-begin_time # 归一化耗时
print('归一化耗时:',total_time,'s')
将归一化后的数据集写入文件
data_normalization = open("kddcup.data.numerization_corrected_normalization.txt",'w', newline='')
csv_writer = csv.writer(data_normalization)
i = 0
while i<len(x_data[:, 0]):
csv_writer.writerow(x_data[i, :])
i = i + 1
data_normalization.close()
print('数据归一化done!')
-------------------------------------------写在最后-------------------------------------------
由于本人精力与能力有限无法尽善尽美,如有错误、疑问或者建议,欢迎留言讨论,希望这篇文章对您有所帮助。
原创文章,非商业转载请注明出处,商业转载请联系作者获得授权。