任务7,深挖K近邻

任务7 深挖K近邻

一, 缺失值的处理

处理缺失值的方法:需要理解数据,察觉到哪些数据是必要的哪些不必要

1, 删除法:

(1)     删整个列

(2)     删整行(丢弃此记录)

2, 填补法

(1)     用平均值来填补缺失值

(2)     均值,中位数填补

二,特征编码

——机器学习的核心是建模,基础是数据,且输入一定是数值类型的,因此要把字符串转为字符类型,向量或矩阵类型

——这个转换的过程叫类别特征

——最常用的编码技术叫 独热编码

对于标签编码,用0,1,2表示特征的取值,但数字之间有大小区别,影响较大

因此用向量来表示,

——在标签特征的基础上需要创建一个向量。这个向量的长度跟类别种类的个数相同。除了一个位置是1,其他位置均为0, 1的位置对应的是相应类别出现的位置。

三,数值型变量

——数值间有大小的区别,大小关系也是程度上的好坏

——常见的处理方式是直接看作数值型变量处理

四,KNN解决回归

首先明白什么是KNN的分类和回归

KNN(K近邻法)

输入为实例的特征向量,计算新数据与训练数据之间的距离选取K个距离最近的数据进行分类或回归判断

对于分类问题:输出为实例的类别。分类时,对于新的实例,根据其k个最近邻的训练实例的类别,通过多数表决等方式进行预测。(计算该输入属于哪一类)

对于回归问题:输出为实例的值。回归时,对于新的实例,取其k个最近邻的训练实例的平均值为预测值。(已知该输入属于哪一类,根据它的类判断它的预测结果)

数据

下面探讨如何用KNN来预测

1, 用read_csv(pd的)来读取数据

2, 进行特征处理,把特征型的两个个特征(颜色,类型)用独热编码进行转换

3, 用corr( )函数(独热编码sf.dummies()里的)来计算特征之间(包括全部数据)的相关性,并通过sns模块的heatmap来可视化相关性

4, 因为某些数据之间单位差的比较大(比如Odometer是5位数的,HP是两位数的)所以要对于数据进行特征的归一化,用StandardScaler来进行。

训练集是数值类型特征

测试集是我们要预测的ASK Price

5, 训练KNN模型,并用KNN模型做预测

训练KNN模型用的是训练集(X和y)

测试KNN模型用的是测试集(X和y)

#用X_test来预测(X是自变量)

y_pred = knn.predict(X_test)#作为X轴

y_test作为Y轴

因为X_test,y_test都经过了归一化,所以要化回来才能画图

如果预测值和实际值一样,所有的点会落在坐标轴上

1 #训练模型
2 knn=KNeighborsRegressor(n_neighbors=2)##训练出了模型
3 knn.fit(X_train,y_train.ravel())##把训练集带入?
4             #预测模型
5                #Now we can predict prices:
6 y_pred = knn.predict(X_test)
7 y_pred_inv=y_normalizer.inverse_transform(y_pred)#将标准化后的数据转换为原始数据
8 y_test_inv=y_normalizer.inverse_transform(y_test)#
9 #用KNN算法计算距离的时候要归一化,画图的时候回来

6, 打印最终的结果,即预测值 y_pred_inv

五,KD树

——优化  测试训练集和样本之间的距离  过程

提高KNN搜索的过程:

1, 根源在样本数量太多,所以从每一个类里选取有代表性的样本

2, 使用一种近似KNN的方法https://www.cs.umd.edu/~mount/ANN/

3, 使用KD树来加速搜索过程,一般使用在低维空间

KD树:

——肉眼可以看出哪些点离得比较近,如何使机器也能看出?

——根据它们的位置划分区域,每个区域的点很大可能会离得比较近

可以把KD树看做一种数据结构,每一个区域在KD树里是一个节点

如何基于样本来构造一棵KD树? https://blog.csdn.net/app_12062011/article/details/51986805

KD树小结: 1、通过KD树这样的数据结构尽可能减小搜索空间,从而提升效率。

2、一般只在低维(2、3维)的空间里才会试着使用KD树来提升搜索效率。因为随着特征维度的增加,搜索的时间复杂度会指数级增加。

KD树的经典应用场景:在地图上的搜索。如搜索离当前点最近的加油站、餐馆,等等。

---------------------------------------------------------------------------------------------------------------------------------------------

(1)       打开文件可以用open()函数,open函数有8个参数,不用全部输入也可,较重要的是fileName指定了要打开的文件名称,fileName的数据类型为字符串(单引号),fileName也包含了文件所在的存储路径,存储路径可以是相对路径,也可以是绝对路径。

encoding用于指定文件的编码方式,默认采用utf-8,编码方式主要是指文件中的字符编码。我们经常会碰到这样的情况,当打开一个文件时,内容全部是乱码,这是因为创建文件时采用的编码方式,和打开文件时的编码方式不一样,就会造成字符显示错误,看上去就是乱码。

f=open(‘D:\python3\Lib\二手车价格.csv‘,encoding=‘UTF-8‘)

(2)     独热编码用法:

https://blog.csdn.net/qq_43404784/article/details/89486442

独热编码就是将一列值为字符串的,变为值为0,1之类的数值,从标题为颜色,到标题为是否为红色/绿色

(3)     pandas数据合并与重塑(pd.concat篇)

result = pd.concat([df1, df4], axis=1)

当axis = 1的时候,concat就是行对齐,然后将不同列名称的两张表合并

(4)     df 发现不用print,直接列出变量名就可以得到值,比如给一个变量赋值,然后输入变量名,就可以显示变量的内容

但只能输出最后的一句

(5)     matplotlib 中设置图形大小的语句如下:

fig = plt.figure(figsize=(a, b), dpi=dpi)

其中:

figsize 设置图形的大小,a 为图形的宽, b 为图形的高,单位为英寸

dpi 为设置图形每英寸的点数

则此时图形的像素为:

px, py = a*dpi, b*dpi  # pixels

(6)     热图是数据的图形表示,也就是说,它使用颜色来向读者传达价值。

用df.corr()函数计算df文件的相关性,范围在-1-1间

使每个单元格成方形

square = True,

##通过sns模块来可视化相关性,颜色越深的代表相关性越大。

sns.heatmap(matrix,square=True)

(7)     特征的归一化,把原始特征转换成均值为0方差为1的高斯分布

## 注意:特征的归一化的标准一定要来自于训练数据,之后再把它应用在测试数据上。因为实际情况下,测试数据是我们看不到的,也就是统计不到均值和方差。

(8)    当直接使用df后接一个中括号时,表示取其一列,类型为Series,接2个中括号时,也是取一列,但类型为DataFrame(带有列名)

(9)     shape是查看数据有多少行多少列
reshape()是数组array中的方法,作用是将数据重新组织

Reshape(-1,1)#行任意,列为1的数组

(10)     X->自变量

y->因变量

train->训练集

test->测试集

sklearn.model_selection 中调用train_test_split 函数

X_train,X_test,y_train,y_test = train_test_split(X,y,test_size=0.3,random_state=0)

X_train,X_test, y_train, y_test =sklearn.model_selection.train_test_split(train_data,train_target,test_size=0.4, random_state=0,stratify=y_train)

# train_data:所要划分的样本特征集

# train_target:所要划分的样本结果

# test_size:样本占比,如果是整数的话就是样本的数量

# random_state:是随机数的种子。

# 随机数种子:其实就是该组随机数的编号,在需要重复试验的时候,保证得到一组一样的随机数。比如你每次都填1,其他参数一样的情况下你得到的随机数组是一样的。但填0或不填,每次都会不一样。

(11)     StandardScaler----计算训练集的平均值和标准差,以便测试数据集使用相同的变换

(12)   fit() 预处理的数据,计算矩阵列均值和列标准差

我们在训练集上调用fit_transform(),其实找到了均值μ和方差σ^2,即我们已经找到了转换规则,我们把这个规则利用在训练集上,同样,我们可以直接将其运用到测试集上(甚至交叉验证集),所以在测试集上的处理,我们只需要标准化数据而不需要再次拟合数据

(13)  

  1. # fit_transform()先拟合数据,再标准化
  2. X_train = ss.fit_transform(X_train)
  3. # transform()数据标准化
  4. X_test = ss.transform(X_test)

因为在训练集已经找到转换规则,所以直接用到测试集上

X_train = X_normalizer.fit_transform(X_train)

X_test = X_normalizer.transform(X_test)

(14)     k近邻分类

k-NN 算法最简单的版本是只考虑一个最近邻,即被预测的新的数据点离训练的数据集中的哪个点最近,它将被归类为哪个类别。

五角星为被预测的数据点,根据其离得最近的训练数据集,通过设置参数n_neighbors=1来设定“最近邻”的个数。

从上图我们就能明白,新数据离得谁最近,他就会被归类为哪一类。

左上角的五角星其实应该属于三角星一类,为了提高准确率,这里可以提高“最近邻”个数,即n_neighbors值。再来看一下当n_neighbors=3时的情况:

当提高“最近邻”的个数后,可以看到,对于新数据的预测更准确了,左上角的五角星近相近的是一个圆和两个三角星,因此它被归类于三角一类。

KNN分类树的类是KNeighborsClassifier,KNN回归树的类是KNeighborsRegressor


参数


KNeighborsClassifier


KNeighborsRegressor


KNN中的K值n_neighbors


K值的选择与样本分布有关,一般选择一个较小的K值,可以通过交叉验证来选择一个比较优的K值,默认值是5。如果数据是三维一下的,如果数据是三维或者三维以下的,可以通过可视化观察来调参。

K近邻(回归)模型同样是无参数模型,只是借助K个最近训练样本的目标数值,对待测样本的回归值进行决策。即根据样本的相似度预测回归值(标准线)。
衡量样本待测样本回归值的不同方式:1)对K个近邻目标数值使用普通的算术平均算法(2)对K个近邻目标数值考虑距离的差异进行加权平均

KNN算法思想

1 计算已知类别中数据集的点与当前点的距离。[即计算所有样本点跟待分类样本之间的距离]

2 按照距离递增次序排序。[计算完样本距离进行排序]

3 选取与当前点距离最小的k个点。[选取距离样本最近的k个点]

4 确定前k个点所在类别的出现频率。[针对这k个点,统计下各个类别分别有多少个]

5 返回前k个点出现频率最高的类别作为当前点的预测分类。[k个点中某个类别最多,就将样本划归改点]

KNN工作原理

1 假设有一个带有标签的样本数据集(训练样本集),其中包含每条数据与所属分类的对应关系。

2 输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较。

3 计算新数据与样本数据集中每条数据的距离。

4 对求得的所有距离进行排序(从小到大,越小表示越相似)。

5 取前 k (k 一般小于等于 20 )个样本数据对应的分类标签。

6 求 k 个数据中出现次数最多的分类标签作为新数据的分类。

KNN算法的实现可以参考

https://www.cnblogs.com/xiaotan-code/p/6680438.html

knn =
KNeighborsClassifier()

#
定义一个knn分类器对象
knn.fit(iris_x_train, iris_y_train) 
#
调用该对象的训练方法,主要接收两个参数:训练数据集及其样本标签

iris_y_predict = knn.predict(iris_x_test)
 #
调用该对象的测试方法,主要接收一个参数:测试数据集

probility=knn.predict_proba(iris_x_test) 
 #计算各测试样本基于概率的预测

neighborpoint=knn.kneighbors(iris_x_test[-1],5,False)
#计算与最后一个测试样本距离在最近的5个点,返回的是这些样本的序号组成的数组

score=knn.score(iris_x_test,iris_y_test,sample_weight=None)
#调用该对象的打分方法,计算出准确率


print(‘iris_y_predict = ‘) 
print(iris_y_predict) 
#
输出测试的结果

(1)   
plt.scatter(x,y)#绘制散点图

(2)     np.linspace主要用来创建等差数列。

(17)     plt.plot()函数的本质就是根据点连接线。根据x(数组或者列表) 和 y(数组或者列表)组成点,然后连接成线。

颜色控制符

要想使用丰富,炫酷的图标,我们可以使用更复杂的格式设置,主要颜色,线的样式,点的样式。

默认的情况下,只有一条线,是蓝色实线。多条线的情况下,生成不同颜色的实线。


字符


颜色


‘b‘


blue


‘g‘


green


‘r‘


red


‘c‘


cyan 青色


‘m‘


magenta平红


‘y‘


yellow


‘k‘


black


‘w‘


white

线形控制符


字符


类型


‘-‘


实线


‘--‘


虚线


‘-.‘


虚点线


‘:‘


点线


‘ ‘


空类型,不显示线

diagonal = np.linspace(500,1500,100)

plt.plot(diagonal,diagonal,‘-r‘)

---------------------------------------------------------------------------------------

总结:

可以一行一行来运行代码,更直观地了解每一行代码的作用

原文地址:https://www.cnblogs.com/tann/p/12173228.html

时间: 2024-10-10 20:25:39

任务7,深挖K近邻的相关文章

scikit-learn K近邻法类库使用小结

在K近邻法(KNN)原理小结这篇文章,我们讨论了KNN的原理和优缺点,这里我们就从实践出发,对scikit-learn 中KNN相关的类库使用做一个小结.主要关注于类库调参时的一个经验总结. 一.scikit-learn 中KNN相关的类库概述 在scikit-learn 中,与近邻法这一大类相关的类库都在sklearn.neighbors包之中.KNN分类树的类是KNeighborsClassifier,KNN回归树的类是KNeighborsRegressor.除此之外,还有KNN的扩展,即限

k近邻(KNN)复习总结

摘要: 1.算法概述 2.算法推导 3.算法特性及优缺点 4.注意事项 5.实现和具体例子 6.适用场合内容: 1.算法概述 K近邻算法是一种基本分类和回归方法:分类时,根据其K个最近邻的训练实例的类别,通过多数表决等方式进行预测:k近邻法实际上利用训练数据集对特征向量空间进行划分,并作为其分类的"模型".(Cover和Hart 在1968)--参考自<统计学习方法> 2.算法推导 2.1 kNN三要素 k值的选择:当k值较小时,预测结果对近邻的实例点非常敏感,容易发生过拟

python实现k近邻

k近邻分类器大概想法是  在已知许多样本分好类的情况下,给定一个新样本i, 计算得到与i最接近的k个样本,那么假设这k个样本为a1, a2, ... , ak ,总共五个类别{1,2,3,4,5}, 其中就有{a1:3, a2:4, a3:1, ... ,  ak:2},a1 所对的值3 就为它的类别,现在如果在这个k个样本里,属于类别3 的样本最多,那么我们就可以把样本i 归为类别3 现在来用python 简单实现下这个分类器 首先定义一下数据集结构 数据矩阵 X_train表示训练样本矩阵,

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&amp;交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b

K 近邻算法

声明: 1,本篇为个人对<2012.李航.统计学习方法.pdf>的学习总结,不得用作商用,欢迎转载,但请注明出处(即:本帖地址). 2,因为本人在学习初始时有非常多数学知识都已忘记,所以为了弄懂当中的内容查阅了非常多资料.所以里面应该会有引用其它帖子的小部分内容,假设原作者看到能够私信我,我会将您的帖子的地址付到以下. 3.假设有内容错误或不准确欢迎大家指正. 4.假设能帮到你.那真是太好了. 描写叙述 给定一个训练数据集,对新的输入实例.在训练数据集中找到与该实例最邻近的K个实例,若这K个实

spark-机器学习实践-K近邻应用实践一

K近邻应用-异常检测应用 原理: 根据数据样本进行KMeans机器学习模型的建立,获取簇心点,以簇为单位,离簇心最远的第五个点的距离为阈值,大于这个值的为异常点,即获得数据异常. 如图: 数据样本: 1,2.43,2.3899999 2,2.38,2.12 3,2.8,2.51 4,2.01,2.69 5,2.71,2.45 6,2.55,2.34 7,2.46,2.31 8,2.27,2.38 9,2.87,2.55 10,2.75,2.07 11,2.3899999,2.6100001 12

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

K近邻法(KNN)原理小结

K近邻法(k-nearst neighbors,KNN)是一种很基本的机器学习方法了,在我们平常的生活中也会不自主的应用.比如,我们判断一个人的人品,只需要观察他来往最密切的几个人的人品好坏就可以得出了.这里就运用了KNN的思想.KNN方法既可以做分类,也可以做回归,这点和决策树算法相同. KNN做回归和分类的主要区别在于最后做预测时候的决策方式不同.KNN做分类预测时,一般是选择多数表决法,即训练集里和预测的样本特征最近的K个样本,预测为里面有最多类别数的类别.而KNN做回归时,一般是选择平均

Machine Learning—k-nearest neighbor classification(k近邻分类)

印象笔记同步分享:Machine Learning-k-nearest neighbor classification(k近邻分类)