0 准备
这里接着 Python数据挖掘 #存用scikit-learn估计器分类 [实验:Ionosphere 分类](近邻算法)
这篇文章实验继续做。
1 预处理示例
先对Ionosphere数据集做些破坏。
x_broken = np.array(x)
x_broken[:,::2] /= 10
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))
The original average accuracy for is 82.3%
The broken average accuracy for is 71.5%
我们发现在破坏后的数据集中算法的准确率显著下降。
因此我们需要对特征值规范化,避免特征值差异过大使得算法准确率下降。
2 标准预处理
借助sklearn中的预处理器MinMaxScaler来对特征进行规范化
这个类可以把特征值域规范化到0和1之间
最小值用0,最大值用1代替
使用方法:
from sklearn.preprocessing import MinMaxScaler
x_transformed = MinMaxScaler().fit_transform(x)
3 组装
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))
The average accuracy for is 82.3%
总结:异常值会影响近邻算法,不同算法对值域大小敏感度不同,为了提高近邻算法的准确率,需要先对特征值进行规范化
4 流水线
随着实验的增加,操作的复杂程度也在提高,我们可能需要切分数据集,对特征进行二值化处理,以特征或数据集中的个体为基础规范化数据,除此之外还可能需要其他各种操作。
流水线结构吧这些步骤保存到数据挖掘的工作流中。我们可以在cross_val_score
等接收估计器的函数中使用流水线。
流水线的输入为一连串的数据挖掘步骤,最后一步必须是估计器,前几步是转换器。输入的数据集经过转换器的处理后,作为下一步的输入,最后一步用估计器对数据进行分类。
流水线分为两大步:
1)用MinMaxScaler将特征取值范围规范到0~1
2)制定KNeighborsClassifier分类器
每一步都用元组(‘名称’,步骤)来表示。
流水线的核心是元素是元组的列表。
from sklearn.pipeline import Pipeline
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))
The pipeline scored an average accuracy for is 82.3%