数据挖掘的五大流程
1:获取数据
从调查问卷,网络,爬虫,算法转变等一系列方式获得数据
2:数据预处理
这是从数据中检测、纠正、或者删除损坏、不准确、不适用的数据的过程。
可能面对的问题有:数据类型不对,比如不是所有机器学习算法可以处理文字;数据的质量不行,比如有噪声,有异常,有错误,有缺失,量纲不一致,数据有重复,数据有的他打或者太小。
目的就是:让数据变得完整、准确和可靠,从而使得数据更能适应、匹配模型。
3:特征工程
特征工程是一种为了能让原始数据转换为更能代表模型潜在问题的特征的过程,可以通过挑选最相关的特征,提取以及创造特征来实现。其中创造特征就是我们以前学习过的降维等算法来实现。
可能面对的问题有:特征之间存在相关性,特征和目标信息无关,特征太多或者太少,或者而无法表现出应有的数据现象,或来展示数据的真实面貌。
目的就是:减低计算成本,提升模型的效果上限,进一步提升可靠性。
4:建模,测试,调参
5:验证模型效果
Scikit-learn中有两个大板块就是讲这个的。
一个是降维(包含了特征的一些操作,如降维操作),一个是预处理(常见的数据预处理和特征提取操作)。
常见的模块
模块preprocessing:几乎包含了数据预处理的所有内容。
模块impute:填补缺失值(之前学习过,用均值、中值、0、学习导等方式)。
模块feature selection:包含了特征选择的各种方法。
模块decomposition:包含了降维算法。
今天我们来学习下数据预处理中的无量纲化:
在不同的数据中,我们一般希望把数据转换到同一规格,或者把具有不同分布的数据转换到同一分布上。这样的操作叫做 “无量纲化”。
无量纲化包括中心化和缩放处理。中心化是让数据减去某个值。让数据平移到某个位置;缩放处理是除以某个值,将数据固定在某个范围,取对数也是一种缩放处理。
先把数据x按照最小值中心化后,再按照(最大值减去最小值)进行缩放到了[0,1]的范围,就叫做数据归一化(Normalization,或Min-Max Scaling)。
我们先自己手动实现一下
import numpy as np
# 按照列计算来进行归一化
def normalization_Func(x):
return (x - x.min(axis=0)) / (x.max(axis=0) - x.min(axis=0))
# 逆转归一化
def Denormalization_Func(x_nor, min, max):
return x_nor * (max - min) + min
data1 = np.array(data)
data_nor = normalization_Func(data1)
print(data_nor)
print(Denormalization_Func(data_nor, data1.min(axis=0), data1.max(axis=0)))
也挺简单的哈
但是在scikit-learn中,我们使用sklearn.preprocessing.MinMaxScaler来实现归一化功能,
其中参数feature_range还可以自己指定归一化的目标范围
代码如下:
from sklearn.preprocessing import MinMaxScaler
import pandas as pd
import numpy as np
data = [[11, 22, 33], [44, 55, 66], [77, 88, 99]]
# print(pd.DataFrame(data))
# 方式一
scaler = MinMaxScaler()
scaler = scaler.fit(data) # 这里是计算出min(x) 和 max(x)
res = scaler.transform(data) # 真正来转换数据,记住,是按照列来计算的。
print(res)
# 方式二
scaler = MinMaxScaler()
res = scaler.fit_transform(data) # 真正来转换数据,记住,是按照列来计算的。
print(res)
# 方法三:默认是归一化到[0,1],也可以自己指定到某个指定的范围
scaler = MinMaxScaler(feature_range=[3,6])
res = scaler.fit_transform(data) # 真正来转换数据,记住,是按照列来计算的。
print(res)
# 进一步操作,已经归一化的值进行逆转到原始数据
data_src = scaler.inverse_transform(res)
print(data_src)
=======================华丽的分割线
我们还有一种是按照均值中心化,再按照标准差缩放,这样的分布会服从于标准正态分布,这个过程叫做数据标准化(Standardization)
具体的操作如下:
from sklearn.preprocessing import StandardScaler
data = [[2., -2., 6.], [4., 8., 3.], [7., 8., -2.]]
# 方法一
std = StandardScaler()
std = std.fit(data) # 计算出均值和方差
print(std.mean_) # 查看原始数据按照列,的均值
print(std.var_) # 查看原始数据按照列,的方差
res = std.transform(data) # 转换结果,进行标准化
print(res.mean()) # 转换后结果的均值几乎是0
print(res.std()) # 转换后结果的方差是1
print(res)
# 方法二
std = StandardScaler()
# (fit_transform()等同于fit()填充数据 + tansform()转换数据)(tansform转换器转换数据时所依赖的均值、标准差等取决于fit()填充的数据)
res = std.fit_transform(data)
print(res)
# 进一步操作,还原数据
data_src = std.inverse_transform(res)
print(data_src)
大部分时候我们会选择标准化,minmaxscaler对异常值处理不是很合理,因此通常选用标准化,但是在一定的场景下,我们需要把数据转换到一些范围的时候就能用的上了,除了这俩之外呢,scikit-learn还提供了
MaxAbsScaler:这种方式没有中心化,只是用最大值进行缩放,范围是[-1, 1]。