数据挖掘实战(三)--用scikit-learn 估计器分类

一、数据挖掘通用框架

估计器:用于分类聚类回归分析

转换器:用于数据预处理数据转换

流水线:组合数据挖掘流程,便于再次使用。

二、scikit-learn估计器

支持向量机SVM、随机森林、神经网络等,本节用近邻算法估计器分类。主要包括fit()predict()函数。用fit方法在训练集上完成模型的创建,用predict方法在测试集上评估效果。

近邻算法:为了对新个体进行分类,查找训练集,找到与新个体最相似的那些个体,看看这些个体大多属于哪个类别,就把新个体分到哪个类别。

k近邻算法:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个"邻居"的信息来进行预测。

三、近邻算法估计器分类的代码实现

  1. 数据集加载并处理

ionosphere数据集下载链接:http://archive.ics.uci.edu/ml/datasets/Ionosphere

将特征读入数组x中,类别读入数组y中(351行34列)

import os
import numpy as np
import csv
data_filename = os.path.join('.\data', '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)
    for i, row in enumerate(reader):
        data = [float(datum) for datum in row[:-1]]
        x[i] = data
        y[i] = row[-1] == 'g'
  1. 创建训练集和测试集

from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=14)
  1. 导入k近邻分类器

from sklearn.neighbors import KNeighborsClassifier
estimator = KNeighborsClassifier()
  1. 用训练集训练数据

# K近邻估计器分析训练集中的数据,比较待分类的新数据点和训练集中的数据,找到新数据点的近邻
estimator.fit(x_train, y_train)
  1. 测试集测试

y_predicted = estimator.predict(x_test)
accuracy = np.mean(y_test == y_predicted) * 100
print("The accuracy is {0:1f}%".format(accuracy))

测试结果截图

  1. 提升分类精度

(1)通过交叉验证提升分类精度

cross_val_score : sklearn.model_selection.cross_val_score,默认折数为5,得到K折验证中每一折的得分,K个得分取平均值就是模型的平均性能。

from sklearn.model_selection import cross_val_score
scores = cross_val_score(estimator, x, y, scoring='accuracy')
average_score = np.mean(scores) * 100
print("The accuracy is {0:1f}%".format(average_score))

(2)通过调整参数提升分类精度

近邻算法有多个参数,最重要的就是选取多少个近邻作为预测依据。scikit-learn管这个参数叫n_neighbors。观察1-20的n_neighbors所带来的结果之间的差异。

from matplotlib import pyplot as plt
avg_scores = []
all_scores = []
paramter_neighbors = list(range(1, 21))
for neighbors in paramter_neighbors:
    estimator = KNeighborsClassifier(n_neighbors=neighbors)
    scores = cross_val_score(estimator, x, y, scoring='accuracy')
    avg_scores.append(np.mean(scores))
    all_scores.append(scores)
# 用图表来表示n_neighbors的不同取值和分类正确率之间的关系
plt.plot(paramter_neighbors, avg_scores, '-o')
plt.show()

四、scikit-learn转换器Transformer

用来处理数值型特征和抽取特征。

sklearn.preprocessing.MinMaxScaler:基于特征的规范化,以把每个特征的值域规范化为0到1之间。

sklearn.preprocessing.Normalizer:为使每条数据各特征值的和为1。

sklearn.preprocessing.StandardScaler:使各特征的均值为0,方差为1,常用作规范化的基准。

sklearn.preprocessing.Binarizer:将数值型特征的二值化,大于阈值的为1,反之为0。

# 破坏后的数据集准确率从原来未破坏的86.4% 降到 73.8%
x_broken = np.array(x)
x_broken[:, ::2] /= 10
estimator = KNeighborsClassifier()
original_score = cross_val_score(estimator, x, y, scoring='accuracy')
print("The original score is {0:1f}%".format(np.mean(original_score)*100))
broken_score = cross_val_score(estimator, x_broken, y, scoring='accuracy')
print("The broken score is {0:1f}%".format(np.mean(broken_score)*100))
# 经过转换后的数据集准确率又回到了82.9%
from sklearn.preprocessing import MinMaxScaler
x_transform = MinMaxScaler().fit_transform(x_broken)
estimator = KNeighborsClassifier()
transform_score = cross_val_score(estimator, x_transform, y, scoring='accuracy')
print('The transform score is {0:1f}%'.format(np.mean(transform_score)*100))

五、流水线结构

流水线的输入为一连串的数据挖掘步骤,其中最后一步必须是估计器,前几步是转换器。

输入的数据集经过转换器的处理后,输出的结果作为下一步的输入。最后,用位于流水线最后一步的估计器对数据进行分类。

  1. 创建流水线

(1) 用MinMaxScaler将特征取值范围规范到0~1。

(2) 指定KNeighborsClassifier分类器。

每一步都用元组(‘名称’,步骤)来表示,现在来创建流水线 ,sklearn.Pipline.Pipeline。

from sklearn.pipeline import Pipeline
scaling_pipline = Pipeline([('scale', MinMaxScaler()), ('predict', KNeighborsClassifier())])

2.运用流水线

transformed_scores = cross_val_score(scaling_pipline, x_broken, y, scoring='accuracy')
print("The pipeline scored an average accuracy for is {0:.2f}%".format(np.mean(transformed_scores) * 100))

六、小结

  1. 用scikit-learn库提供的几个方法,创建了运行和评估数据挖掘模型的标准工作流。

  1. 介绍了近邻算法。

  1. 通过解决不同特征值域影响分类效果的问题,讲解了预处理方法,主要用到了转换器对象和MinMaxScaler类。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值