机器学习:数据转换
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习:数据转换相关的知识,希望对你有一定的参考价值。
1.数据的标准化
标准化的原因:
在于如果有些特征的方差过大,则会主导目标函数从而使参数估计器无法正确地去学习其他特征。
消除量纲的影响。把一个百分制的变量与一个5分值的变量标准化到同一个量纲时才具有可比性
1.1 z_score标准化
将特征数据的分布调整成标准正态分布,也叫高斯分布。
代码实现:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_std = scaler.fit_transform(X_train)
X_test_std = scaler.fit_transform(X_test)
#X_train_std.mean(axis=0)返回array([ 0., 0., 0., 0.])
#X_train_std.std(axis=0)返回array([ 1., 1., 1., 1.])
StandardScaler()中可以传入两个布尔型参数with_mean,with_std,默认情况下都是true,但也可以自定义成false.即不要均值中心化或者不要方差规模化为1
1.2 min_max标准化
代码实现:
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
X_train_minmax = scaler.fit_transform(X_train)
X_test_minmax = scaler.fit_transform(X_test)
缺点:
离群点左右了MinMaxScaler规范化
零值可能会转换成一个非零值,因此稀疏矩阵将变成一个稠密矩阵
1.3 MaxAbsScaler(绝对值最大标准化)
代码实现:
from sklearn.preprocessing import MaxAbsScaler
scaler = MaxAbsScaler()
X_train_maxabs = scaler.fit_transform(X_train)
X_test_maxabs = scaler.fit_transform(X_test)
优点:MaxAbsScaler和maxabs_scale不会将稀疏矩阵变得稠密,是专门为稀疏数据的标准化所设计的
缺点:最大绝对值点可能是一个离群点
1.4 规模化有异常值的数据
如果数据有许多异常值,那么使用数据均值与方差去做标准化就不行了。
可以使用robust_scale 和 RobustScaler这两个方法。它会根据中位数或者四分位数去中心化数据。
2.二值化
特征二值化的核心在于设定一个阈值,阈值默认值为零,大于阈值的赋值为1,小于等于阈值的赋值为0
代码实现:
from sklearn.preprocessing import Binarizer
X_binary=Binarizer(threshold=1.1).fit_transform(X)
实例:
X = [[ 1., -1., 2.], [ 2., 0., 0.], [ 0., 1., -1.]]
binarizer = preprocessing.Binarizer(threshold=1.1)
binarizer.transform(X)
#out:
array([[ 0., 0., 1.],
[ 1., 0., 0.],
[ 0., 0., 0.]])
3. 对类别特征进行编码
分类器往往默认数据数据是连续的,并且是有序的。但当特征不是连续型数值而是分类值时,需要有序地翻译这些特征。
为了解决上述问题,其中一种可能的解决方法是采用独热编码(One-Hot Encoding),其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都由他独立的寄存器位,并且在任意时候只有一位有效。因此,数据会变成稀疏的。
优点:
解决了分类器不好处理属性数据的问题
在一定程度上也起到了扩充特征的作用
代码实现:
from sklearn import preprocessing
enc = preprocessing.OneHotEncoder()
enc.fit([[0, 0, 3], [1, 1, 0], [0, 2, 1], [1, 0, 2]])
enc.transform([[0, 1, 3]]).toarray()
输出结果:
array([[ 1., 0., 0., 1., 0., 0., 0., 0., 1.]])
OneHotEncoder参数: sklearn.preprocessing.OneHotEncoder(n_values=‘auto‘, categorical_features=‘all‘, dtype=<class ‘float‘>, sparse=True, handle_unknown=‘error‘)
n_values : ‘auto’, int or array of ints用于指定每个特征的数量
‘auto’ : 从训练数据的范围中得到
int : 所有特征的最大值(number)
array : 每个特征的最大值(number)
>>> enc = preprocessing.OneHotEncoder(n_values=[2, 3, 4])
#此时参数n_values取的是一个array of ints,表明各特征对应的状态数
>>> enc.fit([[1, 2, 3], [0, 2, 0]])
>>> enc.transform([[1, 0, 0]]).toarray()
array([[ 0., 1., 1., 0., 0., 1., 0., 0., 0.]])
4.正则化
from sklearn.preprocessing import Normalizer
X_normalizd=Normalizer(norm=’l2’).fit_transform(X)
5. 生成多项式特征
在输入数据中增加非线性特征可以有效的提高模型的复杂度。
代码实现:
import numpy as np
from sklearn.preprocessing import PolynomialFeatures
X = np.arange(6).reshape(3, 2)
X
array([[0, 1],
[2, 3],
[4, 5]])
poly = PolynomialFeatures(2)
poly.fit_transform(X)
array([[ 1., 0., 1., 0., 0., 1.],
[ 1., 2., 3., 4., 6., 9.],
[ 1., 4., 5., 16., 20., 25.]])
#PolynomialFeatures(2)
原始特征:(X_1,X_2)
转化后:(1,X_1,X_2,X_1^2,X_1 X_2,X_2^2)
有时候只需要特征的交叉项,设置interaction_only=True来得到:
poly=PolynomialFeatures(2,interaction_only=True)
poly.fit_transform(x)
#out
array([[ 1., 0., 1., 0.],
[ 1., 2., 3., 6.],
[ 1., 4., 5., 20.]])
即PolynomialFeatures(2,interaction_only=True)完成如下的转换原始特征:(X_1,X_2,X_3)
转化后:(1,X_1,X_2,X_1 X_2)
6.自定义转换
代码实现:
import numpy as np
from sklearn.preprocessing import FunctionTransformer
transformer = FunctionTransformer(np.log1p)
X = np.array([[0, 1], [2, 3]])
transformer.fit_transform(X)
array([[ 0. , 0.69314718],
[ 1.09861229, 1.38629436]])
以上是关于机器学习:数据转换的主要内容,如果未能解决你的问题,请参考以下文章