sklearn里面有很多对数据处理的方法这里介绍几种
# 以下的处理方法都需要引入这个模块
from sklearn import preprocessing
均值移除
适合处理数值差别很大的数据(比如每列中有1000, 1)这样的数据,需要给它均值移除成正太分布的数据(每列均值为0,标准差为1)
直接上代码
import numpy as np
# 初始化数组
data = np.array([[-1000,10,40],[10,300,40],[20,1,30]])
result = preprocessing.scale(data) # scale:对数据0均值处理 数据中心化处理
print(result)
print(np.mean(result,axis=0)) # 每列的平均值 约等于 0
print(np.std(result,axis=0)) # 每列的标准差为 1
范围缩放
个人理解
当数据的每列的数值比较大或相差很大可以用范围缩放把数据缩放到合适大小,当你拿到数据进行均值移除后发现数值相差还是有点大,可以再进行范围缩放(根据数据而论,有些数值大的数据也可以是正太分布数据可以直接进行范围缩放)
import numpy as np
# 初始化数据
data = np.array([[3,-1.5,2,-5.4],
[0,4,-0.3,2.1],
[1,3.3,-1.9,-4.3]])
# 创建范围缩放对象
# MinMaxScaler:范围缩放 feature_range:设定数值缩放范围
data_scaler = preprocessing.MinMaxScaler(feature_range=(0,1))
# 将数据放进范围缩放对象 fit_transform:理解为将数值范围缩放后返回
data_scaled = data_scaler.fit_transform(data)
print(data_scaled) # 查看缩放 后的数据
数据归一化
是将数据的值缩放到同一个数值范围
归一化里面包括:
L1范数:是每列或每行的数值相加为1
L2范数:是每行或每列的数值平方求和然后求平方根
import numpy as np
# 初始化数据
data=np.array([[3, -1.5, 2, -5.4],
[0, 4,-0.3,2.1],
[1, 3.3, -1.9, -4.3]])
# 将数据归一化 norm:指定 L1 范数 axis=0:列
data_L1_normalized = preprocessing.normalize(data,norm='l1',axis=0)
print('归一化L1:{}'.format(data_L1_normalized))
print('L1范数总和:{}'.format(np.sum(data_L1_normalized)))
data_L2_normalized = preprocessing.normalize(data,norm='l2',axis=0) # 默认是l2
print('归一化L2:{}'.format(data_L2_normalized))
二值化
二值化后的数据只有两个结果,要么0,要么1,所以叫二值化
import numpy as np
data=np.array([[3, -1.5, 2, -5.4],
[0, 4,-0.3,2.1],
[1, 3.3, -1.9, -4.3]])
# Binarizer:二值化函数, threshold:指定一个标准,数值超过1.4就是1,小于1.4就是0
data_binarized = preprocessing.Binarizer(threshold=1.4).fit_transform(data)
独热编码
主要处理稀疏矩阵,比如一个矩阵列内0比较多,而且很多值是重复的,它会每样只取出一个数值进行编码
data=np.array([[0,2,1,12],
[1,3,5,3],
[2,3,2,12],
[1,2,4,3]])
# 创建独热编码对象
encoder = preprocessing.OneHotEncoder()
# 使用编码器对数据编码
encoder.fit(data)
# 拿出一部分原数据去编码器查看编码
encoded_vector = encoder.transform([[2,3,5,3]]).toarray()
print(encoded_vector)
汉字编码
当数据是汉字时,计算机是不能识别的,需要对汉字进行编码成数字
data = ['小王','小花','张三','李四','李四']
# 创建编码器
encoder = preprocessing.LabelEncoder()
# 使用编码器对数据进行编码
encoder.fit(data)
# 查看编码器里面的数据 数据已经去重
print(encoder.classes_)
# 用编码器对张三进行编码
res = encoder.transform(['张三'])
# 解码(数字必须是编码内的数字)
print(encoder.inverse_transform([1]))