1. 数据预处理
无量纲化
使不同规格的数据转换到同一规格。
# 1. 数据转换为均值为0,方差为1
from sklearn import preprocessing
scaler = preprocessing.StandardScaler().fit(X)
scaler.transform(X)
# 2. 缩放到制定范围
# 2.1 对于方差非常小的属性可以增强其稳定性。
# 2.2 维持稀疏矩阵中为0的条目
min_max_scaler = preprocessing.MinMaxScaler()
X_train_minmax = min_max_scaler.fit_transform(X)
正则化(归一化)
该方法主要应用于文本分类和聚类中。例如,对于两个TF-IDF向量的l2-norm进行点积,就可以得到这两个向量的余弦相似性。
对要使用如二次型(点积)或者其它核方法计算两个样本之间的相似性这个方法会很有用。
Normalization主要思想是对每个样本计算其p-范数,然后对该样本中每个元素除以该范数,这样处理的结果是使得每个处理后样本的p-范数(l1-norm,l2-norm)等于1。
# 使用函数转换
X_normalized = preprocessing.normalize(X, norm='l2')
# 使用类转换
normalizer = preprocessing.Normalizer().fit(X)
normalizer.transform(X)
备注:
image.png
1 归一化特点 行处理 对不同特征维度的伸缩变换的目的是使各个特征维度对目标函数的影响权重是一致的,即使得那些扁平分布的数据伸缩变换成类圆形。这也就改变了原始数据的一个分布。
好处:
1.1 提高迭代求解的收敛速度
1.2 提高迭代求解的精度
2 标准化特点 列处理 对不同特征维度的伸缩变换的目的是使得不同度量之间的特征具有可比性。同时不改变原始数据的分布。
image.png
好处
1 使得不同度量之间的特征具有可比性,对目标函数的影响体现在几何分布上,而不是数值上;
2 不改变原始数据的分布 来自知乎
二值化
将数据特征转变成boolean变量
# 阈值可设定,默认为1
binarizer = preprocessing.Binarizer(threshold=1.0).fit(X)
binarizer.transform(X)
哑编码
针对离散或文本数据
from sklearn.preprocessing import OneHotEncoder
OneHotEncoder().fit_transform(X)
缺失值处理
一般空值无法直接使用scikit-learn分类器直接训练,所以需要进行处理。
from sklearn.preprocessing import Imputer
imp = Imputer(missing_values='NaN', strategy='mean', axis=0)
imp.fit([[1, 2], [np.nan, 3], [7, 6]])
Imputer类同样支持稀疏矩阵
import scipy.sparse as sp
X = sp.csc_matrix([[1, 2], [0, 3], [7, 6]])
imp = Imputer(missing_values=0, strategy='mean', axis=0)
imp.fit(X)
X_test = sp.csc_matrix([[0, 2], [6, 0], [7, 6]])
print(imp.transform(X_test))
拉格朗日插值法
import pandas as pd
from scipy.interpolate import lagrange
inputfile = r'demo\data\catering_sale.xls'
outputfile = r'demo\tmp\sales.xls'
data = pd.read_excel(inputfile)
data.loc[(data['销量'] < 400) | (data['销量'] > 5000), '销量'] = None
def polyinterp_column(s, n, k=5):
y = s[list(range(n-k, n)) + list(range(n+1, n+1+k))]
y = y[y.notnull()]
return lagrange(y.index, list(y))(n)
for i in data.columns:
for j in range(len(data)):
if (data[i].isnull())[j]:
data.loc[j, i] = polyinterp_column(data[i], j)
数据变换
常见的数据变换有基于多项式的、基于指数函数的、基于对数函数的。
image.png
使用preproccessing库的PolynomialFeatures类对数据进行多项式转换的代码如下:
from sklearn.preprocessing import PolynomialFeatures
#多项式转换
#参数degree为度,默认值为2
PolynomialFeatures().fit_transform(iris.data)
基于单变元函数的数据变换可以使用一个统一的方式完成,使用preproccessing库的FunctionTransformer对数据进行对数函数转换的代码如下:
from numpy import log1p
from sklearn.preprocessing import FunctionTransformer
#自定义转换函数为对数函数的数据变换
#第一个参数是单变元函数
FunctionTransformer(log1p).fit_transform(iris.data)
参考:http://www.cnblogs.com/chaosimple/p/4153158.html
http://www.cnblogs.com/chaosimple/p/4153167.html