数据预处理,数据挖掘过程中需要对数据集进行预处理进行数据的转换。
Sklearn提供了很多内置的标准的转换器,比如。
为使每条数据各特征值的和为1,使用sklearn.preprocessing.Normalizer。
为使各特征的均值为0,方差为1,使用sklearn.preprocessing.StandardScaler, 常用作规范化的基准。
为将数值型特征的二值化,使用sklearn.preprocessing.Binarizer,大于阈值的为 1,反之为0。
此外sklearn也提供了流水线,流水线的作用是使数据挖掘步骤标准化。
流水线的输入为一连串的数据挖掘步骤,其中最后一步必须是估计器,前几步是转换器。输入的数据集经过转换器的处理后,输出的结果作为下一步的输入。最后,用位于流水线最后一步的估计器对数据进行分类。
流水线的核心是元素为元组的列表。第一个元组规范特征取值范围,第二个元组实现预测功能。我们把第一步叫作规范特征取值(scale),第二步叫作预测(predict),也可以用其他名字。元组的第二部分是实际的转换器对象或估计器对象。
代码示例
代码语言:javascript复制import numpy as np
import csv
import os
from sklearn.cross_validation import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from matplotlib import pyplot as plt
from sklearn.cross_validation import cross_val_score
from sklearn.preprocessing import MinMaxScaler
from sklearn.pipeline import Pipeline
# 即将用到的数据集叫作电离层(Ionosphere),这些数据是由高频天线收集的。
# 这些天线的目 的是侦测在电离层和高层大气中存不存在由自由电子组成的特殊结构。
# 如果一条数据能给出特殊 结构存在的证据,这条数据就属于好的那一类(在数据集中用“g”表示),否则就是坏的(用“b” 表示)。
# ionosphere.data从http://archive.ics.uci.edu/ml/datasets/Ionosphere,Data Folder下,下载ionosphere.data和ionosphere.names
# 该数据集每行有35个值,前34个为17座天线采集的数据(每座天线采集两个数据)。
# 后一 个值不是“g”就是“b”,表示数据的好坏,即是否提供了有价值的信息。
data_filename=os.path.join('','','ionosphere.data')
# 创建Numpy数组X和y存放数据集。数据集大小已知,共有351行34列。
X=np.zeros((351,34),dtype='float') #float类型的零np数组,默认都是0
y=np.zeros((351,),dtype='bool') #bool类型的np数组,默认都是false
# 用csv模块来导入数据集文件,并创建csv阅读器对象
with open(data_filename,'r') as input_file:
reader=csv.reader(input_file)
# 遍历文件中的每一行数据。每行数据代表一组测量结果,我们可以将其称作数据集中 的一个个体。
# 用枚举函数来获得每行的索引号,在下面更新数据集X中的某一个体时会用到行号
for i,row in enumerate(reader):
# 获取每一个个体的前34个值,将其强制转化为浮点型,保存到X中。
data=[float(datum) for datum in row[:-1]]
X[i]=data
# 获取每个个体后一个表示类别的值,把字母转化为数字,如果类别为“g”,值为1, 否则值为0。
y[i]=row[-1]=='g'
# -------------版本1,数据转换-----------------------------------
X_broken = np.array(X)
X_broken[:,::2] /= 10
# 导入K近邻分类器这个类,并为其初始化一个实例
estimator = KNeighborsClassifier()
# 对初始数据进行交叉检验,得到正确率
original_scores = cross_val_score(estimator, X, y, scoring='accuracy')
print("The original average accuracy for is {0:.1f}%".format(np.mean(original_scores) * 100))
# 对变形后的数据进行交叉检验,得到正确率
broken_scores = cross_val_score(estimator, X_broken, y, scoring='accuracy')
print("The 'broken' average accuracy for is {0:.1f}%".format(np.mean(broken_scores) * 100))
# 对数据集X进行预处理。在预处理器MinMaxScaler上调用转换函数。
# 有些转换器要求像训练分类器那样先进行训练,但是MinMaxScaler 不需要,直接调用 fit_transform()函数,即可完成训练和转换。
# 为使每条数据各特征值的和为1,使用sklearn.preprocessing.Normalizer。
# 为使各特征的均值为0,方差为1,使用sklearn.preprocessing.StandardScaler, 常用作规范化的基准。
# 为将数值型特征的二值化,使用sklearn.preprocessing.Binarizer,大于阈值的为 1,反之为0。
# -------------版本2,转换器-----------------------------------
X_transformed = MinMaxScaler().fit_transform(X_broken)
estimator = KNeighborsClassifier()
transformed_scores = cross_val_score(estimator, X_transformed, y, scoring='accuracy')
print("The average accuracy for is {0:.1f}%".format(np.mean(transformed_scores) * 100))
# -------------版本2,流水线-----------------------------------
# 流水线的输入为一连串的数据挖掘步骤,其中最后一步必须是估计器,前几步是转换器。
# 输入的数据集经过转换器的处理后,输出的结果作为下一步的输入
# 最后,用位于流水线后一步的估计器对数据进行分类。
scaling_pipeline = Pipeline([('scale', MinMaxScaler()), ('predict', KNeighborsClassifier())])
scores = cross_val_score(scaling_pipeline, X_broken, y, scoring='accuracy')
print("The pipeline scored an average accuracy for is {0:.1f}%". format(np.mean(transformed_scores) * 100))
# ---------------------------------------------------------------