第三章 流水线

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验过程
estimator = KNeighborsClassifier() #交叉检验 #原始数据 original_scores = cross_val_score(estimator, X, y, scoring='accuracy',cv=3) 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',cv=3) print("The 'broken' average accuracy for is {0:.1f}%".format(np.mean(broken_scores) * 100))
• 使每条数据各特征值的和为1
sklearn.preprocessing.StandardScaler
• 使各特征的均值为0,方差为1
sklearn.preprocessing.Binarizer
• 将数值型特征的二值化,大于阈值的为1,反之为0
实验过程
#对副本预处理 X_transformed = MinMaxScaler().fit_transform(X_broken)
#预处理
from sklearn.preprocessing import MinMaxScaler
#如果我们对X数据进行预处理,则是下面这条语句 #X_transformed = MinMaxScaler().fit_transform(X) #对副本预处理 # X_transformed与X行列数相等,为同型矩阵。然而,前 者每列值的值域为0到1。 X_transformed = MinMaxScaler().fit_transform(X_broken)
我们在预处理器MinMaxScaler上 调用转换函数。有些转换器要求像训练 分类器那样先进行训练, 但是 MinMaxScaler 不需要, 直接调用 fit_transform()函数,即可完成训练和 转换。
MinMaxScaler 类
实验过程
预处理补充 小课堂
sklearn.preprocessing.Normalizer
结果: The pipeline scored an average accuracy for is 82.3%
实验过程
#创建副本X——X_broken X_broken = np.array(X)
为了讲解需要,先对数据进行破坏,并交叉检查两份数据的正确率
注意此时的数据是array,如果自己输入数据,注意要把list转换为array;并且注意精度,一般要设置为float, 否则容易报错TypeError: No loop matching the specified signature and casting was found for ufunc true_divide #原PPT对副本的处理为每隔一行,就把第二个特征的值除以10。这样奇数行的第二个特征要比偶数行的大。此时 语句应为下面这条 #X_broken[::2,1] /= 10 #但实验ppt上的给出的语句(下面)实际上是对每行的奇数个除于2,偶数个保持不变 X_broken[:,::2] /= 10
结果: The average accuracy for is 82.3%
MinMaxScaler将特征规范化到相同的值域,这样特征就不会仅仅因为值大而具备更强的区分 度。
实验过程
流水线
随着实验的增加,操作的复杂程度也在提高。 我们可以通过流水线对一些操作进行整合。 #流水线( Pipeline 管道机制)
选择最具区分度的特征、创建新特征等都属于预处理的范 畴。
理论前提 我们可能需要切分数据集,对特征进行二值化处理,以 特征或数据集中的个体为基础规范Biblioteka Baidu数据,除此之外还 可能需要其他各种操作。
流 水 线
流水线结构就是用来解决这些问题的(当然不限于这些)
流水线把这些步骤保存到数据挖掘的工作流中。之后你就 可以用它们读入数据,做各种必要的预处理,然后给出预 测结果。
MinMaxScalerfrom sklearn.pipeline import Pipeline
这里将流水线分为两大步。 (1) 用MinMaxScaler将特征取值范围规范到0~1。 (2) 指定KNeighborsClassifier分类器。 #流水线必须先要经过转换器(预处理),即(scale)规范特征取值。 #最后一步为估计器,例子中为k最邻近算法中使用的KNN分类器 #每一步都用元组(‘名称’,步骤)来表示。可以多个元组,但最后一个必须为估计器 scaling_pipeline = Pipeline([('scale', MinMaxScaler()), ('predict', KNeighborsClassifier())]) 流水线的输入为一 连串的数据挖掘步 骤,其中最后一步 必须是估计器,前 几步是转换器。
流水线在预处理中的应用
理论前提 不同特征的取值范围千差万别,常见的解决方法是对不 同的特征进行规范化,使它们的特征值落在相同的值域 或从属于某几个确定的类别,比如小、中和大。
scikit-learn的预处理工具叫作转换器(Transformer), 它接受原始数据集,返回转换后的数据集。
预 处 理
实验过程
#流水线必须先要经过转换器(预处理),即(scale)规范特征取值。 #最后一步为估计器,例子中为k最邻近算法中使用的KNN分类器 #每一步都用元组(‘名称’,步骤)来表示。可以多个元组,但最后一个必须为估计器 scaling_pipeline = Pipeline([('scale', MinMaxScaler()), ('predict', KNeighborsClassifier())]) • 流水线的核心是元素为元组的列表。第一个元组规范特征取值范围,第二个元组实现预测功能。 • 我们把第一步叫作规范特征取值(scale),第二步叫作预测(predict),也可以用其他名字。 • 元组的第二部分是实际的转换器对象或估计器对象。 检验一下结果: #交叉检验 scores = cross_val_score(scaling_pipeline, X_broken, y,scoring='accuracy',cv=3) print("The pipeline scored an average accuracy for is {0:.1f}%".format(np.mean(transformed_scores) * 100))
结果: The original average accuracy for is 82.3% The 'broken' average accuracy for is 71.5%
简单总结下,异常值会影响近邻算法,不同算法对值域大小的敏感度不同。
实验过程
预处理
这个类可以把每个特征的值域规范化 为0到1之间。最小值用0代替,最大值 用1代替,其余值介于两者之间。
事前准备 import numpy as np import csv import os from sklearn.neighbors import KNeighborsClassifier from sklearn.model_selection import cross_val_score 本次实验是承接 上次实验后继续 进行的。 使用数据相同。 dataFolder=……#自己本地的data文件路径 data_filename = os.path.join(dataFolder, "Ionosphere","ionosphere.data");#添加文 件路径 X = np.zeros((351, 34), dtype='float') y = np.zeros((351,), dtype='bool') with open(data_filename, 'r') as input_file: reader = csv.reader(input_file); #注意这里必须让reader保持未关闭,否则enumerate()报错 for i, row in enumerate(reader): data = [float(datum) for datum in row[:-1]] X[i] = data y[i] = row[-1] == 'g'
#交叉检验 estimator = KNeighborsClassifier() transformed_scores = cross_val_score(estimator, X_transformed, y,scoring='accuracy',cv=3) print("The average accuracy for is {0:.1f}%".format(np.mean(transformed_scores) * 100))
相关文档
最新文档