Python数据挖掘入门与实践---使用scikit-learn 估计器分类

本章的几个概念:

           估计器(estimator) 用于分类、聚类和回归分析
          转换器(transformer):用于数据预处理回来数据转换
          流水线(pipeline): 组合数据挖掘流程, 便于在此使用

 1.scikit-learn估计器

数据集下载地址:UCI

加载数据集:

#coding=gbk 
#python 数据挖掘入门与实践  
#第2章: 使用scikit-learn 估计器分类

#估计器(estimator) 用于分类、聚类和回归分析
#转换器(transformer):用于数据预处理回来数据转换
#流水线(pipeline): 组合数据挖掘流程, 便于在此使用
import numpy as np
import csv 
X = np.zeros((351,34), dtype = 'float')
y = np.zeros((351,), dtype = 'int') #原文中dtype 为'float' ,此处应该为 int 类型,其自动将true 转换成 1 ,false转换成 0  

#加载数据集
with open(r'D:\datasets\ionosphere.csv','r') as input_file:
    reader = csv.reader(input_file)
    for i , row in enumerate(reader):
        data = [float(datum) for datum in row[:-1]]     #将前34个特征保存到x 中
        X[i]= data
        y[i] = row[-1]=='g'    #把字母型转换成数值型
print(X[:5])
print(y[:9])

实现流程的标准化:

#创建训练集和测试集
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state= 14)

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier()    #使用KNN 算法
knn.fit(X_train, y_train)
y_predicted = knn.predict(X_test)
accuracy = np.mean(y_predicted == y_test) *100 
print('the accuracy is %.1f'%accuracy)      # the accuracy is 86.4

#使用交叉验证
from sklearn.model_selection import cross_val_score
scores = cross_val_score(knn, X, y, scoring= 'accuracy')
average_score = np.mean(scores) * 100
print('the average accuracy is %.1f'%average_score+'%')     # the average accuracy is 82.3%
#作者say:考虑到还没有进行调参数, 这个结果还是相当不错     

设置参数:

#设置参数

#测试一系列的n_neighbors 一系列的值, 进行重复多次试验, 观察参数值带来的结果之间的差异
ave_score =[]
all_score = []
for n_neighbors in range(1,21):
    estimator = KNeighborsClassifier(n_neighbors=n_neighbors)
    scores = cross_val_score(estimator, X, y, scoring= 'accuracy')
    all_score.append(scores)
    ave_score.append(np.mean(scores))
    
print(ave_score)

import matplotlib.pyplot as plt 
x1 = range(1,21)
plt.plot(x1, ave_score, '-o')
plt.show()          #有图知道, 随着 K 值得增大 , 整体的正确率趋势是下降的

2.流水线在预处理中的使用

不同特征的取值范围千差万别, 常见的方法是对不同的特征进行规范化,使他们的特征值落在相同的值域或者是属于某几个确定的类别
一旦解决这个问题, 不同的特征类型对算法的影响将大大降低, 分类的正确率就有大大的提升
sckit-learn 的预处理工具 称为 转换器(Transfomer),它接受原始数据集, 返回的是转换后的数据集。除了,处理数值型的特征还能用于抽取特征

X_broken = np.array(X)
X_broken[:,::2] /=10    #每隔一行, 就把第二个特征的值除以10

knn2 = KNeighborsClassifier()
broken_score = cross_val_score(knn2, X_broken, y, scoring='accuracy')
ave_broken_score = np.mean(broken_score)
print('the broken score accuracy is %.3f'%ave_broken_score) # the broken score accuracy is 0.715

#将特征值转换成 0 到1 之间,以解决问题
#标准预处理:使用MinMaxScalar 类进行规范化处理,规范到0到1 之间

#对X 进行预处理, 有些转换器要求像训练分类器那样先进行训练, 但是MinMaxScalar 不需要, 直接调用 fit_transform 函数,即可以完成训练和转换
from sklearn.preprocessing import MinMaxScaler
X_transform = MinMaxScaler().fit_transform(X_broken)

knn2 = KNeighborsClassifier()
transform_scores = cross_val_score(knn2, X_transform, y, scoring='accuracy')
ave_transform_scores = np.mean(transform_scores) * 100
#MinMaxScaler 将特征规范到相同的值域, 这样特征就不会仅仅因为值大二具备更强的区分度
print('the x_transformed average score is %.2f'%ave_transform_scores)   #the x_transformed average score is 82.34

#流水线
#流水线的输入为一系列的数据挖掘的步骤, 其中最后一步必须是估计器, 前几部是转换器。
from sklearn.pipeline import Pipeline
scailing_pipeline = Pipeline([('scale', MinMaxScaler()),
                              ('knn', KNeighborsClassifier())])
scores1 = cross_val_score(scailing_pipeline, X_broken, y, scoring= 'accuracy')
pipeline_score = np.mean(scores1) *100
print('the accuracy is %.2f'%pipeline_score+'%')    # the accuracy is 82.34% 与上式结果是一样的

猜你喜欢

转载自blog.csdn.net/qq_40587575/article/details/81068145