python归一化处理_sklearn特征处理

python归一化处理_sklearn特征处理_第1张图片
我的主业是互联网运营,业余的python爱好者,学习python已经快两年,主攻网络爬虫与数据分析,爬虫能使用代理ip、打码平台、OCR识别、基本的js逆向处理反爬;数据分析主要使用pandas与pyecharts进行可视化,我的部分案例:

python归一化处理_sklearn特征处理_第2张图片
但数据存在的终极意义也许并非在最后的可视化,而在于利用大数据进行预测,为运营决策提供帮助,因此萌生学习机器学习的念头,我会在此记录我学习sklearn的整个过程,用自己的理解与思路进行记录,希望能帮到和我一样的小白,也给自己做个备忘录。我会在公众号:新青年TALKS,同步更新。

特征处理

1. 归一化

MinMaxScaler

  • 将原始数据进行变换映射到某范围之间(默认0-1),更加便捷快速。
  • 异常点影响最大值最小值

公式:

09bcdd56479ce4d870b49915fe3cc449.png

比起公式,我认为知道为什么这么做更重要。

代码示例:

  • 先用numpy随机生成一组二维数据(二维是为了后面画图方便)
import numpy as np
import matplotlib.pyplot as plt
a = np.random.randint(0,15,size=[5,2])

67bf406a2f2f7dbf4e9bc3a205683ea3.png
  • 画出散点图
plt.scatter(a[:,0],a[:,1])
plt.show()

python归一化处理_sklearn特征处理_第3张图片
  • 使用MinMaxScaler进行归一化后画图看下差别
from sklearn.preprocessing import MinMaxScaler
mm = MinMaxScaler()
res = mm.fit_transform(a)
plt.scatter(res[:,0],res[:,1])

python归一化处理_sklearn特征处理_第4张图片

其实数据的分布情况是没有变化的,只是区间被缩小。而区间的范围在实例化MinMaxScaler时有个属性:feature_range,来定义最终的区间,例如:

mm = MinMaxScaler(feature_range=[1,2])
res = mm.fit_transform(a)

2. 标准化

StandardScaler

  • 异常点影响较小

公式:

65079db62118f77e406585d2f4038187.png

这种方式不取决于最大值与最小值,而是取决于标准差。

代码示例:

from sklearn.preprocessing import MinMaxScaler,StandardScaler
standar = StandardScaler()
res = standar.fit_transform(a)
print(res)
# plt.scatter(a[:,0],a[:,1])
# plt.show()
plt.scatter(res[:,0],res[:,1])

python归一化处理_sklearn特征处理_第5张图片
  • 就分布形态来说没有差别,但与归一化相比,区间最大值处有明显区别。

如果max和min不稳定,很容易使得归一化结果不稳定,使得后续使用效果也不稳定。实际使用中可以用经验常量来替代max和min。[1]

  • 可以结合之前鸢尾花案例看归一化和标准化不同的预测结果,虽然这没有实际意义在应用中也不可取,但可以熟悉语法与API。

我按照自己理解做了一遍:

python归一化处理_sklearn特征处理_第6张图片

可能数据本身并不适合这种方式,所以结果好像并没有什么不同。如果有大佬请指出问题。

3. 特征预处理API

  • sklearn.preprocessing
  • 归一化与标准化都在这个API

4. 数据降维

  • 减少无用特征,减少处理量

4.1 特征选择

  • 过滤式
    • VarianceThreshold(删除低方差)
  • 嵌入式
    • 决策树
    • 正则化
    • 神经网络
  • 包裹式

4.1.1 特征选择API

  • sklearn.feature_selection

4.1.2 VarianceThreshold

方式非常简单,其主要目的是去除方差低(这意味这组数据没有太多参考意义)的那组数据。其他特征选择方式,以后再学,先把简单的整明白。

from sklearn.feature_selection import VarianceThreshold
a = np.array([[12,5,13],
            [2,5,11],
       [11,5,6],
       [0,5,3]])
var = VarianceThreshold(threshold=0)
data = var.fit_transform(a)
print(a)
print('*'*100)
print(data)

python归一化处理_sklearn特征处理_第7张图片

特征相同的一列数据被删掉,因为方差为0,设置方差使用threshold属性,默认为0。

4.2 PCA(主成分分析)

  • 定义:高维数据转化为地位数据的过程,在此过程中可能会舍弃原有数据、创造新的变量
  • 作用:是数据维数的压缩,尽可能降低原数据的维数(复杂度),损失少量信息[2]
  • sklearn.decomposition.PCA
  • n_components:数据保留程度(一般90%-95%)

使用方式:

import numpy as np
from sklearn.decomposition import PCA

a = np.random.randint(0,15,size=[10,3])
pca = PCA(n_components=2)
data = pca.fit_transform(a)
print(a)
print(data)

python归一化处理_sklearn特征处理_第8张图片

数据被降成二维。大概就是下图的意思:

python归一化处理_sklearn特征处理_第9张图片
  • 说明:n_components值为小数时,表示保留多少原有信息量(一般90-95%),当值为整数时,表示数据降到多少维。

5. 最后

目前还在摸索初探阶段,暂时不想深入了解具体公式(因为数学太差),后面会继续尝试学习下去。

参考

  1. ^https://www.cnblogs.com/fisherinbox/p/7192055.html
  2. ^https://www.lagou.com/lgeduarticle/33236.html

你可能感兴趣的:(python归一化处理)