"""
sklearn 把大量的特征处理相关的功能封装为转换器(transformer)sklearn
将模型训练与预测功能封装为估计器(estimator)
数据准备:指数据预处理,它将原始数据转换为适合机器学习的形式,它决定了机
器学习效果的上限,常见方法:标准化、归一化、二值化、独热编码等,sklearn
库的preprocessing模块提供了多种数据预处理类
标准化:指将数据按比例缩放,使之落入某个特定区间,目的是消除特征间量纲和
取值范围差异的影响。常见的标准化方法有标准差标准化和极差标准化
"""
#标准差标准化
#使用StandarScaler函数创建标准差标准化转换器并生成计算规则
from sklearn import preprocessing
import numpy as np
x_train = np.array([[1.,-1.,2.],[2.,0.,0.],[0.,1.,-1.]])
x_test = np.array([[-1.,1.,0.]])
#创建转换器并生成规则
std_transformer = preprocessing.StandardScaler().fit(x_train)
print('生成规则后的标准差标准化转换器为:\n',std_transformer)
#StandarScaler对象属性
print('特征均值为:\n',std_transformer.mean_,'\n','特征方差为:\n',
std_transformer.var_)
#使用tranform方法对数据集进行转换
print('标准差标准化后的训练集为:\n',std_transformer.transform(x_train))
print('标准差标准化后的测试集为:\n',std_transformer.transform(x_test))
#离差标准化
"""
离差标准化是对原始数据的一种线性变换,结果是将原始数据的数值映射到[0,1]区间,
离差标准化保留了原始数据值之间的联系,是消除量纲和数据取值范围影响最简单的方法
preprocessing模块的MinMaxScaler类用于特征离差标准化处理,MinMaxSxaler函数
用于创建标离差标准化转换器
"""
#使用MinMaxScaler函数创建离差标准化转换器并生成计算规则
#创建转换器并生成规则
mms_transformer = preprocessing.MinMaxScaler().fit(x_train)
print('生成规则后的离差标准化转换器为:\n',mms_transformer)
#MinMaxScaler对象的属性
print('特征最大值为:',mms_transformer.data_max_)
print('特征最小值为:',mms_transformer.data_min_)
#使用transform方法对数据集进行转换
print('离差标准化后的训练集为:\n',mms_transformer.transform(x_train))
print('离差标准化后的测试集为:\n',mms_transformer.transform(x_test))
#归一化
"""
归一化也称正则化,指按照特征矩阵的行处理数据,目的在于使样本向量在点乘运算或
其它核函数计算相似性时拥有统一的标准,preprocessing模块的Normalizer类用于特征
归一化处理,Normalizer函数用于创建归一化转换器,使用Normalizer函数创建归一化
转换器并使用fit方法生成计算规则,结果返回Normalizer对象
"""
#使用Normalizer函数创建归一化转换器并生成计算规则
norm_transformer = preprocessing.Normalizer().fit(x_train)
print('生成规则后的离差标准化转换器为:\n',norm_transformer)
"""
Normalizer对象未提供属性,较StandarScaler对象少了inverse_transform和partial_fit
方法
"""
#使用transform方法对数据集进行归一化
print('归一化后的训练集为:\n',norm_transformer.transform(x_train))
print('归一化后的测试集为:\n',norm_transformer.transform(x_test))
#二值化
"""
特征二值化指通过设置阈值,将特征值转换为0或1,当特征值大于阈值时转换为1,小于或等于
阈值时转换为0,特征二值化与数据离散化不同,特征二值化后的值为0或1,而数据离散化落在
所属区间,preprocessing模块的Binarizer类用于特征二值化,Binrizer函数用于创建二值
化转换器
"""
#使用Binarizer函数创建二值化转换器并生成计算规则
bin_transformer = preprocessing.Binarizer().fit(x_train)
print('生成规则后的二值化转换器为:\n',bin_transformer)
#使用transform方法对数据集进行二值化
print('二值化后的训练集为:\n',bin_transformer.transform(x_train))
print('二值化后的测试集为:\n',bin_transformer.transform(x_test))
#独热编码
"""
在机器学习中,特征可能不是数值型而是分类型的,但某些模型要求为数值型,最简单的方法是将
特征编码为整数。但该方法无法在sklearn的估计器中直接使用,因为连续输入使估计器认为类别
之间是有序的,但实际上是无序的,为解决这个问题,可使用独热编码。独热编码是One—Hot编码
"""
#使用OneHotEncoder函数创建独热编码转换器并生成计算规则
x_train = np.array([['男','北京','已婚'],
['男','上海','未婚'],
['女','广州','已婚']])
x_test = np.array([['男','北京','未婚']])
#构建分类型转换为数值型函数
def auto_coder(x):
for i in range(x.shape[1]):
x[: ,i] = preprocessing.LabelEncoder().fit_transform(x[: ,i])
x = x.astype(int)
return x
#将训练集转换为数值型
x_train_num = auto_coder(x_train)
print('转换为数值型后的训练集为:\n',x_train_num)
#创建转换器并生成规则
oe_transformer = preprocessing.OneHotEncoder().fit(x_train_num)
print('生成规则后的独热编码转换器为:\n',oe_transformer)
#使用transform方法对数据集进行转换
print('独热编码后的训练集为:\n',oe_transformer.transform(x_train_num).toarray())
x_test_num = auto_coder(x_test)
print('独热编码后的测试集为:\n',oe_transformer.transform(x_test_num).toarray())