Python机器学习 -- 数据预处理

MinMaxScale

最小-最大规范化对原始数据进行线性变换,变换到[0,1]区间(也可以是其他固定最小最大值的区间)每个特征中的最小值变成了0,最大值变成了1.m

import numpy as np
from sklearn.preprocessing import MinMaxScaler
X = np.array([[-1, 2], [-0.5, 6], [0, 10], [1, 18]])

#实现归一化
scaler = MinMaxScaler()          #实例化
scaler = scaler.fit(X)          #fit,在这里本质是生成min(x)和max(x)
result = scaler.transform(X)    #通过接口导出结果

#也可以训练和导出结果一步达成
# result_ = scaler.fit_transform(data)

StandardScaler

Standardization标准化:将特征数据的分布调整成标准正太分布,也叫高斯分布,也就是使得数据的均值维0,方差为1.

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()                           #实例化
scaler.fit(data)                                 #fit,本质是生成均值和方差
 
scaler.mean_                                  #查看均值的属性mean_
scaler.var_                                  #查看方差的属性var_
 
x_std = scaler.transform(data)                      #通过接口导出结果
 
x_std.mean()                                  #导出的结果是一个数组,用mean()查看均值
x_std.std()                                   #用std()查看方差
 
scaler.fit_transform(data)                         #使用fit_transform(data)一步达成结果

大多数机器学习算法中,会选择StandardScaler来进行特征缩放,因为MinMaxScaler对异常值非常敏感。在PCA,聚类,逻辑回归,
支持向量机,神经网络这些算法中,StandardScaler往往是最好的选择。

MinMaxScaler在不涉及距离度量、梯度、协方差计算以及数据需要被压缩到特定区间时使用广泛,比如数字图像
处理中量化像素强度时,都会使用MinMaxScaler将数据压缩于[0,1]区间之中。

MaxAbsScaler

原理与上面的很像,只是数据会被规模化到[-1,1]之间。也就是特征中,所有数据都会除以最大值。这个方法对那些已经中心化均值维0或者稀疏的数据有意义,后者不会改变矩阵的稀疏性,是0的还是0,而前者会改变。

RobustScaler

根据四分位数来缩放数据。对于数据有较多异常值的情况,使用均值和方差来标准化显然不合适,按中位数,一、四分位数缩放效果要好

QuantileTransformer

使用百分位教转换特征,通过缩小边缘异常值和非异常值之间的距离来提供特征的非线性变换。可以使用参数output_distribution = "normal"来将数据映射到标准正态分布。
sklearn.preprocessing.QuantileTransformer(n_quantiles=1000, output_distribution=’uniform’,
ignore_implicit_zeros=False, subsample=100000, random_state=None, copy=True)

正则化( Normalizer)

正则化是缩放单个样本以具有单位范数的过程,这里的”范数”,可以使用L1或L2范数。如果你计划使用二次形式(如点积或任何其他核函数)来量化任何样本间的相似度,则此过程将非常有用。

这个观点基于 向量空间模型(Vector Space Model) ,经常在文本分类和内容聚类中使用。
sklearn.preprocessing.Normalizer(norm=’l2’, copy=True)

其中,norm : ‘l1’, ‘l2’, or ‘max’, optional (‘l2’ by default)

编码分类特征

在机器学习中,大多数算法,譬如逻辑回归,支持向量机SVM,k近邻算法等都只能够处理数值型数据,不能处理文字,在sklearn当中,除了专用来处理文字的算法,其他算法在fit的时候全部要求输入数组或矩阵,也不能够导入文字型数据(其实手写决策树和朴素贝叶斯可以处理文字,但是sklearn中规定必须导入数值型)。然而在现实中,许多标签和特征在数据收集完毕的时候,都不是以数字来表现的。比如说,学历的取值可以是[“小学”,“初中”,“高中”,“大学”],付费方式可能包含[“支付宝”,“现金”,“微信”]等等。在这种情况下,为了让数据适应算法和库,我们必须将数据进行编码,即是说,将文字型数据转换为数值型。

  • OrdinalEncoder:特征专用,能够将分类特征转换为分类数值。
  • OneHotEncoder:类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息
  • LabelEncoder:标签专用,能够将分类转换为分类数值。

1.LabelEncoder:标签专用,能够将分类转换为分类数值

import pandas as pd
from sklearn.preprocessing import LabelEncoder
y = pd.DataFrame([‘yes’,‘yes’,‘yes’,‘no’,‘no’,‘no’],columns=[‘target’])
label = LabelEncoder().fit_transform(y)
label

OrdinalEncoder:特征专用,能够将分类特征转换为分类数值

import pandas as pd
from sklearn.preprocessing import OrdinalEncoder
X = pd.DataFrame([[‘male’,‘high’],
[‘female’,‘high’],
[‘male’,‘low’],
[‘female’,‘medium’],
[‘female’,‘medium’],
[‘female’,‘low’]],
columns=[‘sex’,‘income’])

X = OrdinalEncoder().fit_transform(X)

OneHotEncoder:类别OrdinalEncoder可以用来处理有序变量,但对于名义变量,我们只有使用哑变量的方式来处理,才能够尽量向算法传达最准确的信息。

import pandas as pd
from sklearn.preprocessing import OneHotEncoder
X = pd.DataFrame([‘male’,‘female’,‘male’,‘female’,‘female’,‘female’],columns=[‘sex’])
X = OneHotEncoder().fit_transform(X).toarray()

离散化

离散化(也称为量化或绑定)提供了一种将连续特征划分为离散值的方法。某些具有连续特征的数据集可能受益于离散化,因为离散化可以将连续属性的数据集转换为仅具有名义属性的数据集。

  • KBinsDiscretizer
  • Binarizer

KBinsDiscretizer:k个等宽箱的离散化特征,默认情况下,输出是one-hot编码成稀疏矩阵,并且可以使用encode参数。对于每个特性,在fit再加上分箱的数量,他们会定义间隔。

你可能感兴趣的:(Python)