• 使用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:datasetsionosphere.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% 与上式结果是一样的
  • 相关阅读:
    软件测试 -- 在配置测试中,如何判断发现的缺陷是普通问题还是特定的配置问题?
    软件测试 -- 测试中的“杀虫剂怪事”是指什么?
    软件测试 -- 配置和兼容性测试的区别
    软件测试 -- 和用户共同测试(UAT测试)的注意点有哪些
    软件测试 -- 测试人员和QA的区别
    软件测试 -- 所有的软件缺陷都能修复吗?所有的软件缺陷都要修复吗?
    软件测试 -- 发现的缺陷越多,说明软件缺陷越多吗?
    软件测试 -- 软件测试的风险主要体现在哪里
    软件测试 -- 什么是软件测试以及软件测试的目的是什么
    微信公众平台开发
  • 原文地址:https://www.cnblogs.com/junge-mike/p/9335050.html
Copyright © 2020-2023  润新知