zoukankan      html  css  js  c++  java
  • [机器学习]-[数据预处理]-中心化 缩放 KNN(二)

    上次我们使用精度评估得到的成绩是 61%,成绩并不理想,再使 recall 和 f1 看下成绩如何?

    首先我们先了解一下 召回率和 f1。

    真实结果

    预测结果

    预测结果

     

    正例

    反例

    正例

    TP 真正例

    FN 假反例

    反例

    FP 假正例

    TN 真反例

    召回率:TP/(TP+FN)

    f1:2TP/(2TP+FN+FP)

    我们使用scikit-learn的分类报告来查看各种其他指标:

    现在我们来介绍一下缩放和中心化,他们是预处理数值数据最基本的方法,接下来,看看它们是否对模型有影响,以及怎样的影响。

    预处理的机制:缩放和中心化

    在运行模型(如回归(预测连续变量)或分类(预测离散变量))之前,我们还是需要对数据进行一些预处理。对于数值变量,规范化标准化数据是很常见的。这些术语是什么意思?

    规范化手段就是缩放数据集,使其数据取值的范围压缩到0,1。我们的做法就是转换每个数据点:规范化结果=(数据点-数据最小值)/(数据最大值-数据最小值)。

    标准化则略有不同, 它的最终结果就是将数据集中在0左右,并按照标准偏差进行缩放:标准化结果=(数据点-均值)/标准差。

    有一点需要强调,这些转换只是改变了数据的范围而不是分布。当然,你也可以根据自己的需要使用其他的转换方式(如对数转换换或正太转换)来达到数据的高斯分布形式(如钟形曲线)。

    现在我们思考几个重要的问题:

    • 为什么我们要调整数据?
    • 什么时机处理更合适?
    • 分类问题和回归问题哪个更重要?

    下面我们就具体看下缩放对 KNN 的影响。

    预处理:缩放的预处理

    下面是我们的处理步骤

    1. 缩放数据
    2. 使用 KNN
    3. 查看模型结果

    使用scikit-learn的缩放函数,它会将传给它的数组中所有的特征(列)标准化。

    通过上面的处理之后提高了0.1,这就说明预处理的很成功,同时也说明预处理很重要!!!如上所述,在缩放之前,存在许多具有不同数量级范围的预测变量,这意味着它们中的某一个或几个可能在,如 KNN 算法处理中占主导地位。缩放数据的一般是基于以下两个原因:

    1. 预测变量可能有明显不同的范围,并且在某些情况下(例如使用 KNN),需要削弱某些特征对算法的主导;
    2. 功能与单位无关,即不依赖于所涉及的规模:例如,我使用米来表示测量的特征,你使用厘米来表示相同的特征。如果我们都缩放各自的数据,那么,这个特征对我们每个人都是一样的。

    到目前位置,我们已经了解了缩放和中心化在整个机器学习中的基本位置,我们这样做主要的目的就是提高机器学习的学习能力。我希望后续,我能和大家分享一些其他类型的预处理。在进入这个之前,在下一篇文章中,我将探讨缩放在回归分类方法中的作用。

    最后,有兴趣的同学可以自行设置 KNN 的 n_neighbors 变量,然后观察一下 n_neighbors 对机器学习的影响。

    代码:

    import pandas as pd
    %matplotlib inline
    import matplotlib.pyplot as plt
    #from sklearn.cross_validation import train_test_split
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import classification_report
    from sklearn import neighbors, linear_model
    
    plt.style.use('ggplot')
    df = pd.read_csv('http://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv ' , sep = ';')
    
    # 删除目标结果
    X = df.drop('quality' , 1).values
    y1 = df['quality'].values
    pd.DataFrame.hist(df, figsize = [15,15]);
    
    df.describe()
    
    # 使用 5 作为边界进行分类
    y = y1 <= 5
    
    # 原始目标结果和二分类之后的目标结果
    plt.figure(figsize=(20,5));
    plt.subplot(1, 2, 1 );
    plt.hist(y1);
    plt.xlabel('original target value')
    plt.ylabel('count')
    plt.subplot(1, 2, 2);
    plt.hist(y)
    plt.xlabel('two-category target value')
    plt.show()
    
    # 切分测试数据与训练数据
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
    
    knn = neighbors.KNeighborsClassifier(n_neighbors = 5)
    knn_model_1 = knn.fit(X_train, y_train)
    print('k-NN accuracy: {}'.format(knn_model_1.score(X_test, y_test)))
    
    # 其他评估评分
    y_true, y_pred = y_test, knn_model_1.predict(X_test)
    print(classification_report(y_true, y_pred))
    
    # 预处理数据
    Xs = scale(X)
    
    # 切分测试数据与训练数据
    Xs_train, Xs_test, y_train, y_test = train_test_split(Xs, y, test_size=0.2, random_state=42)
    
    # 可以通过设置 n_neighbors 来进行训练
    knn = neighbors.KNeighborsClassifier(n_neighbors = 5)
    knn_model_2 = knn.fit(Xs_train, y_train)
    print('k-NN test: %f' % knn_model_2.score(Xs_test, y_test))
    print('k-NN training: %f' % knn_model_2.score(Xs_train, y_train))
    y_true, y_pred = y_test, knn_model_2.predict(Xs_test)
    print(classification_report(y_true, y_pred))

    知乎:数据预处理-中心化 缩放 KNN(二)

    云+社区:[机器学习]-[数据预处理]-中心化 缩放 KNN(二)

  • 相关阅读:
    centos7 修复引导
    Django 过滤器
    Django 面向对象orm
    Django models字段查询谓词表
    linux常用的监控命令
    常用SQL语句
    python实现FTP服务器
    用python做一个图片验证码
    rsync
    jsonp的理解
  • 原文地址:https://www.cnblogs.com/BoyceYang/p/8372999.html
Copyright © 2011-2022 走看看