特征处理是什么?

特征处理是通过特定的统计方法(数学方法)将数据转换成算法要求的数据
learn:https://scikit-learn.org/stable/modules/preprocessing.html#preprocessing

案例

相亲约会对象数据,这个样本时男士的数据,三个特征,玩游戏所消耗时间的 百分比、每年获得的飞行常客里程数、每周消费的冰淇淋公升数。然后有一个 所属类别,被女士评价的三个类别,不喜欢didnt、魅力一般small、极具魅力large 也许也就是说飞行里程数对于结算结果或者说相亲结果影响较大,但是统计的 人觉得这三个特征同等重要。

image.png

但是每个维度 单位 比例尺都不同,在计算差值、均值的计算中往往会遇到其中一个维度比另外一个维度相差很大的情况,这个时候就需要用到归一化处理。**

归一化

定义

数据标准化(归一化)处理是数据挖掘的一项基础工作,不同评价指标往往具有不同的量纲和量纲单位,这样的情况会影响到数据分析的结果,为了消除指标之间的量纲影响,需要进行数据标准化处理,以解决数据指标之间的可比性。原始数据经过数据标准化处理后,各指标处于同一数量级,适合进行综合对比评价。
参考:https://blog.csdn.net/jacke121/article/details/79008333(介绍了2种,这里先谈第一种)

min-max归一化

image.png
通常(mx-mi)= 1

使用

sklearn归一化API: sklearn.preprocessing.MinMaxScaler
MinMaxScalar(feature_range=(0,1)…) 每个特征缩放到给定范围(默认[0,1])
方法:MinMaxScalar.fit_transform(X) ,其中X为numpy array格式的数据[n_samples,n_features] ,返回值为转换后的形状相同的array。

栗子

  1. >>> import sklearn.preprocessing as sp
  2. >>> import numpy as np
  3. >>> t = np.arange(24).reshape(4,6)
  4. >>> t
  5. array([[ 0, 1, 2, 3, 4, 5],
  6. [ 6, 7, 8, 9, 10, 11],
  7. [12, 13, 14, 15, 16, 17],
  8. [18, 19, 20, 21, 22, 23]])
  9. >>> mm = sp.MinMaxScaler()
  10. >>> data = mm.fit_transform(t)
  11. >>> print(data)
  12. [[0. 0. 0. 0. 0. 0. ]
  13. [0.33333333 0.33333333 0.33333333 0.33333333 0.33333333 0.33333333]
  14. [0.66666667 0.66666667 0.66666667 0.66666667 0.66666667 0.66666667]
  15. [1. 1. 1. 1. 1. 1. ]]

这里会抛出一个warning:Data with input dtype int64 was converted to float64 by MinMaxScaler.

异常点对上面x最大值最小值的影响较大,故少量异常点对min-max标准化的影响是很大的。所以这种方法鲁棒性较差,只适合传统精确小数据场景。 这时就请出另外一种方法。

Z-score 标准化

image.png

使用

sklearn特征化API: scikit-learn.preprocessing.StandardScaler
在已有样本足够多的情况下比较稳定,适合现代嘈杂大数据场景。

方法或属性 解释
StandardScaler.fit_transform(X,y) X:numpy array格式的数据[n_samples,n_features] 返回值:转换后的形状相同的array
StandardScaler.mean_ 原始数据中每列特征的平均值
StandardScaler.var_ 原始数据每列特征的方差

栗子

  1. >>> import sklearn.preprocessing as sp
  2. >>> import numpy as np
  3. >>> t = np.arange(24).reshape(4,6)
  4. >>> ss = sp.StandardScaler()
  5. >>> t
  6. array([[ 0, 1, 2, 3, 4, 5],
  7. [ 6, 7, 8, 9, 10, 11],
  8. [12, 13, 14, 15, 16, 17],
  9. [18, 19, 20, 21, 22, 23]])
  10. >>> data = ss.fit_transform(t)
  11. >>> print(data)
  12. [[-1.34164079 -1.34164079 -1.34164079 -1.34164079 -1.34164079 -1.34164079]
  13. [-0.4472136 -0.4472136 -0.4472136 -0.4472136 -0.4472136 -0.4472136 ]
  14. [ 0.4472136 0.4472136 0.4472136 0.4472136 0.4472136 0.4472136 ]
  15. [ 1.34164079 1.34164079 1.34164079 1.34164079 1.34164079 1.34164079]]
  16. >>> print(ss.mean_)
  17. [ 9. 10. 11. 12. 13. 14.]
  18. >>> print(ss.var_)
  19. [45. 45. 45. 45. 45. 45.]

缺失值填补

使用

删除 如果每列或者行数据缺失值达到一定的比例,建议放弃整行或者整列
插补 可以通过缺失值每行或者每列的平均值、中位数来填充

sklearn缺失值API: sklearn.preprocessing.Imputer
Imputer(missing_values=’NaN’, strategy=’mean’, axis=0)
方法 Imputer.fit_transform(X,y),其中x为numpy array格式的数据[n_samples,n_features] ,返回值为转换后的形状相同的array

栗子

如果是文件中的一些缺失值,可以替换成nan,通过np.array转化成float型的数组即可:

  1. >>> import sklearn.preprocessing as sp
  2. >>> import numpy as np
  3. >>> t = np.arange(24).reshape(4,6)
  4. >>> t = t.astype('float')
  5. >>> t[t==0]=np.nan
  6. >>> t
  7. [[nan 1. 2. 3. 4. 5.]
  8. [ 6. 7. 8. 9. 10. 11.]
  9. [12. 13. 14. 15. 16. 17.]
  10. [18. 19. 20. 21. 22. 23.]]
  11. >>> ip = sp.Imputer(missing_values='NaN', strategy='mean', axis=0)
  12. >>> data = ip.fit_transform(t)
  13. >>> print(data)
  14. [[12. 1. 2. 3. 4. 5.]
  15. [ 6. 7. 8. 9. 10. 11.]
  16. [12. 13. 14. 15. 16. 17.]
  17. [18. 19. 20. 21. 22. 23.]]

emm然而,Class Imputer已被弃用;Imputer在版本0.20中已弃用,将在0.22中删除。朗读Class Imputer已被弃用;Imputer在版本0.20中已弃用,将在0.22中删除。
Class Imputer is deprecated; Imputer was deprecated in version 0.20 and will be removed in 0.22.
Import impute.SimpleImputer from sklearn instead.
warnings.warn(msg, category=DeprecationWarning)
恩啊 没事,可以使用Pandas解决这类缺失的问题
https://www.yuque.com/zhiwa/deepin/uv0xpb#ea0f8f7d