博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[机器学习]-[数据预处理]-中心化 缩放 KNN(二)
阅读量:5371 次
发布时间:2019-06-15

本文共 2835 字,大约阅读时间需要 9 分钟。

上次我们使用精度评估得到的成绩是 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 inlineimport matplotlib.pyplot as plt#from sklearn.cross_validation import train_test_splitfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import classification_reportfrom sklearn import neighbors, linear_modelplt.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).valuesy1 = df['quality'].valuespd.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))

知乎:

云+社区:

 

转载于:https://www.cnblogs.com/BoyceYang/p/8372999.html

你可能感兴趣的文章
spring 知识体系积累
查看>>
字符串笔记
查看>>
模块导入路径的两种方法
查看>>
Sql学习笔记3——集合运算、空值和聚集函数
查看>>
用表单写兴趣爱好的程序
查看>>
winform程序操作或执行javascript程序
查看>>
如果将markdown视作一门编程语言可以做哪些有趣的事情?
查看>>
第三次作业
查看>>
数据结构--树
查看>>
underline
查看>>
主要日期函数的分类
查看>>
Glide 下载Gif文件
查看>>
全排列
查看>>
c# 对SOAP返回XML字符串的解析方法
查看>>
线程Thread
查看>>
最长公共子串_暴力解法(不会正解)36行
查看>>
摆棋子
查看>>
冲刺二------个人任务
查看>>
[HIve - LanguageManual] Joins
查看>>
unity里的c#
查看>>