[机器学习]-[数据预处理]-中心化 缩放 KNN(二)
上次我们使用精度评估得到的成绩是 61%,成绩并不理想,再使 recall 和 f1 看下成绩如何?
首先我们先了解一下 召回率和 f1。
|
真实结果 |
预测结果 |
预测结果 |
|---|---|---|
|
正例 |
反例 |
|
|
正例 |
TP 真正例 |
FN 假反例 |
|
反例 |
FP 假正例 |
TN 真反例 |
召回率:TP/(TP+FN)
f1:2TP/(2TP+FN+FP)
我们使用scikit-learn的分类报告来查看各种其他指标:

现在我们来介绍一下缩放和中心化,他们是预处理数值数据最基本的方法,接下来,看看它们是否对模型有影响,以及怎样的影响。
预处理的机制:缩放和中心化
在运行模型(如回归(预测连续变量)或分类(预测离散变量))之前,我们还是需要对数据进行一些预处理。对于数值变量,规范化或标准化数据是很常见的。这些术语是什么意思?
规范化手段就是缩放数据集,使其数据取值的范围压缩到0,1。我们的做法就是转换每个数据点:规范化结果=(数据点-数据最小值)/(数据最大值-数据最小值)。
标准化则略有不同, 它的最终结果就是将数据集中在0左右,并按照标准偏差进行缩放:标准化结果=(数据点-均值)/标准差。
有一点需要强调,这些转换只是改变了数据的范围而不是分布。当然,你也可以根据自己的需要使用其他的转换方式(如对数转换换或正太转换)来达到数据的高斯分布形式(如钟形曲线)。
现在我们思考几个重要的问题:
- 为什么我们要调整数据?
- 什么时机处理更合适?
- 分类问题和回归问题哪个更重要?
下面我们就具体看下缩放对 KNN 的影响。
预处理:缩放的预处理
下面是我们的处理步骤
- 缩放数据
- 使用 KNN
- 查看模型结果
使用scikit-learn的缩放函数,它会将传给它的数组中所有的特征(列)标准化。

通过上面的处理之后提高了0.1,这就说明预处理的很成功,同时也说明预处理很重要!!!如上所述,在缩放之前,存在许多具有不同数量级范围的预测变量,这意味着它们中的某一个或几个可能在,如 KNN 算法处理中占主导地位。缩放数据的一般是基于以下两个原因:
- 预测变量可能有明显不同的范围,并且在某些情况下(例如使用 KNN),需要削弱某些特征对算法的主导;
- 功能与单位无关,即不依赖于所涉及的规模:例如,我使用米来表示测量的特征,你使用厘米来表示相同的特征。如果我们都缩放各自的数据,那么,这个特征对我们每个人都是一样的。
到目前位置,我们已经了解了缩放和中心化在整个机器学习中的基本位置,我们这样做主要的目的就是提高机器学习的学习能力。我希望后续,我能和大家分享一些其他类型的预处理。在进入这个之前,在下一篇文章中,我将探讨缩放在回归分类方法中的作用。
最后,有兴趣的同学可以自行设置 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(二)的更多相关文章
- [数据预处理]-中心化 缩放 KNN(一)
据预处理是总称,涵盖了数据分析师使用它将数据转处理成想要的数据的一系列操作.例如,对某个网站进行分析的时候,可能会去掉 html 标签,空格,缩进以及提取相关关键字.分析空间数据的时候,一般会把带单位 ...
- 机器学习 —— 数据预处理
对于学习机器学习算法来说,肯定会涉及到数据的处理,因此一开始,对数据的预处理进行学习 对于数据的预处理,大概有如下几步: 步骤1 -- 导入所需库 导入处理数据所需要的python库,有如下两个库是非 ...
- 机器学习实战基础(九):sklearn中的数据预处理和特征工程(二) 数据预处理 Preprocessing & Impute 之 数据无量纲化
1 数据无量纲化 在机器学习算法实践中,我们往往有着将不同规格的数据转换到同一规格,或不同分布的数据转换到某个特定分布的需求,这种需求统称为将数据“无量纲化”.譬如梯度和矩阵为核心的算法中,譬如逻辑回 ...
- 数据预处理:规范化(Normalize)和二值化(Binarize)
注:本文是人工智能研究网的学习笔记 规范化(Normalization) Normalization: scaling individual to have unit norm 规范化是指,将单个的样 ...
- 吴裕雄 python 机器学习——数据预处理二元化OneHotEncoder模型
from sklearn.preprocessing import OneHotEncoder #数据预处理二元化OneHotEncoder模型 def test_OneHotEncoder(): X ...
- 吴裕雄 python 机器学习——数据预处理二元化Binarizer模型
from sklearn.preprocessing import Binarizer #数据预处理二元化Binarizer模型 def test_Binarizer(): X=[[1,2,3,4,5 ...
- python大战机器学习——数据预处理
数据预处理的常用流程: 1)去除唯一属性 2)处理缺失值 3)属性编码 4)数据标准化.正则化 5)特征选择 6)主成分分析 1.去除唯一属性 如id属性,是唯一属性,直接去除就好 2.处理缺失值 ( ...
- 吴裕雄 python 机器学习——数据预处理过滤式特征选取SelectPercentile模型
from sklearn.feature_selection import SelectPercentile,f_classif #数据预处理过滤式特征选取SelectPercentile模型 def ...
- 吴裕雄 python 机器学习——数据预处理过滤式特征选取VarianceThreshold模型
from sklearn.feature_selection import VarianceThreshold #数据预处理过滤式特征选取VarianceThreshold模型 def test_Va ...
随机推荐
- C#保留2位小数的做法
第一 算法实现 保留两位的话,就用一个浮点型先乘以100,然后取整,取整完了之后,再乘以1.0,然后再除以100. 上面这种做法是保留n位,不会四舍五入的.因为这 ...
- Adb+.net 实现微信跳一跳自动化
第一次用adb,一开始只是想试试看能不能解析出,没有看网上的现有解析方式. 需要安卓机开启usb 调试+电脑运行.打开跳一跳的界面 点击程序 [开始]按钮即可开始,别的按钮都是调试用的 主要流程是用a ...
- Lucene.net(4.8.0) 学习问题记录三: 索引的创建 IndexWriter 和索引速度的优化
前言:目前自己在做使用Lucene.net和PanGu分词实现全文检索的工作,不过自己是把别人做好的项目进行迁移.因为项目整体要迁移到ASP.NET Core 2.0版本,而Lucene使用的版本是3 ...
- ${param.name}和${name}的区别
${param.name} == request.getParam("name") ${name} == request.getAttribute("name" ...
- 商业智能(BI)选型手册(转载)
摘自http://articles.e-works.net.cn/bi/Article126429.htm 1.前言 互联网时代企业数据呈现爆发式增长,全面考验着企业的数据处理和分析能力.面对大容量. ...
- 基于2-channel network的图片相似度判别
一.相关理论 本篇博文主要讲解2015年CVPR的一篇关于图像相似度计算的文章:<Learning to Compare Image Patches via Convolutional Neur ...
- 如何在开发时部署和运行前后端分离的JavaWeb项目
在开发中大型的JavaEE项目时,前后端分离的框架逐渐成为业界的主流,传统的单机部署前后端在同一个项目中的工程项目越来越少.这类JavaWeb项目的后端通常都采用微服务的架构,后端会被分解为诸多个小项 ...
- 【python3之文件操作】
一.文件操作 1.文件处理的流程 1)打开文件,得到文件句柄并赋值给一个变量 2)通过句柄对文件进行操作 3)关闭文件 例如: f = open('chenli.txt') #打开文件 first_l ...
- Spark算子篇 --Spark算子之combineByKey详解
一.概念 rdd.combineByKey(lambda x:"%d_" %x, lambda a,b:"%s@%s" %(a,b), lambda a,b:& ...
- [Spark内核] 第33课:Spark Executor内幕彻底解密:Executor工作原理图、ExecutorBackend注册源码解密、Executor实例化内幕、Executor具体工作内幕
本課主題 Spark Executor 工作原理图 ExecutorBackend 注册源码鉴赏和 Executor 实例化内幕 Executor 具体是如何工作的 [引言部份:你希望读者看完这篇博客 ...