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

本文共 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 Boot读取配置的几种方式
查看>>
冲刺NO.3
查看>>
Java Reflection(二):Classes
查看>>
移动APP测试流程
查看>>
SqlServer中创建非聚集索引和非聚集索引
查看>>
单件模式
查看>>
html5 新标签
查看>>
预加载显示图片的艺术
查看>>
MyEclipse使用总结——MyEclipse去除网上复制下来的来代码带有的行号
查看>>
订餐系统之获取淘宝外卖订单
查看>>
会计基础第一节内容概述
查看>>
AE开发中出现无spatial analysis和3D分析等的licence情况
查看>>
嵊州D2T1 “我只是来打个电话”
查看>>
第十周进度条
查看>>
[詹兴致矩阵论习题参考解答]习题2.1
查看>>
切换用户后,/etc/profile的配置不起效
查看>>
ceph<一>安装
查看>>
redis密码管理
查看>>
Json:Restful
查看>>
【iOS】Quartz2D基本图形
查看>>