00:01
2.3.2K近0KNN算法可以说是最简单的机器学习算法,构建模型只需要保存训练数据集即可。想要对新数据点做出预测,算法会在训练数据集中找到最近的数据点,也就是他的最近零。K近邻分类KNN算法最简单的版本只考虑一个精灵。也就是与我们想要预测的数据点最近的训练数据点预测结果就是这个训练数据点的已知输出。下面给出这种方法在for数据集上的应用。这里我们添加了三个新数据点,用五角星表示。对于每个新数据点,我们标记了训练集中与它最近的点单一最近算法的预测结果就是那个点的标签对应五角星的颜色。除了仅考虑最近邻,我们还可以考虑任意一个K个邻居,这也是K近邻算法名字的来历。在考虑多余一个邻居的情况时,我们用投票法屋ing来指定标签。也就是说,对于每个测试点,我们数一数多少个邻居属于类别零,多少个邻居属于类别一,然后将出现次数更多的类别,也就是K歌精灵中占多数的类别作为预测结果。
01:32
下面的例子用到了三个定理。和上面一样,预测结果可以从五角星的颜色看出。你可以发现左上角星数据点的预测结果与只用一个邻居时的预测结果是不同的。
02:00
虽然这张图对应的是一个二分类问题,但方法同样适用于多分类的数据集。对于多分类问题,我们数一数每个类别分别有多少个邻居,然后将最常见的类别作为预测结果。现在看一下如何通过s learn来应用K进行算法。首先正如第一章所述,将数据集分为训练集和测试集,以便评估泛化性能。
03:25
然后导入类,并将其实例化,这时可以设定参数,比如邻居的个数,这里我们将其设为三。
04:01
现在利用训练集对这个分类器进行拟合,对于k nes class file来说,就是保存数据集,以便在预测时计算与邻居之间的距离。调用predict方法来对测试数据进行预测。对于测试集中的每个数据点,都要计算它在训练集的最近里,然后找出其中出现次数最多的类别。
05:07
为了评估模型的泛化能力好坏,我们可以对测试数据和测试标签调用方法。可以看到,我们的模型精度约为86%,也就是说,在测试数据其中,模型对其中86%的样本预测类别都是正确的。分析,Kables class file。对于二维数据集,我们还可以在XY平面上画出所有可能的测试点的预测结果。我们根据平面中每个点所属的类别对平面进行着色,这样可以查看决策边界点C性帮助及算法对类别零和类别一的分界线。
06:11
下列代码分别将一个、三个和九个邻居三种情况的角色边界可视化。
09:46
从左图可以看出,使用单一邻居绘制的决策边界紧跟着训练数据。随着邻居个数越来越多,决策边界也越来越平滑。更平滑的边界对应更简单的模型,一般来说都是如此。换句话说,使用更少的邻居对应更高的模型,复杂度如图二杠一右侧所示,而使用更多的邻居对应更低的模型,复杂度如图二杠一左侧所示。假如考虑极端情况及邻居个数等于训练集中所有数据点的个数,那么每个测试点的邻居都完全相同,即所有训练点所有预测结果也完全相同及训练集中出现次数最多的类别。
10:25
我们来研究一下,能否证实之前讨论过的模型复杂度。和泛化能力之间的关系。我们将在现实世界的乳腺癌数据集上进行研究,先将数据集分成训练集和测试集,然后用不同的邻居个数对训练集和测试集的性能进行评估。
15:09
在这一段代码中。纯test split的参数stratify。可能有很多人不知道是什么意思。所以在讲这幅图之前。先来把这个参数解决掉。点model selection点。传入,先传入多个可变参数,然后再传入多个关键字参数。它表示什么意思?它表示打乱数据集并进行拆分,最后分成训练集和测试集两个子集。参数。星号R多个等长数组,允许输入多个列表,多个囊派数组、多个撒派叙述矩阵、多个panda.data frame对象。两个星号,Options。
16:01
多个关键的参数。主要有这几个关键字,Text size。一个浮点数或者一个非负整数,默认呢?如果是一个浮点数及范围是0.0~1.0的B区间,它代表的测试集在原来数据集的占比,如果是一个整数,表示测试集的数据量,如果是none,就要看出形size设置,如果出形赛也是none,它就会设置成0.25。Size,一个浮点数或一个整数或一个非负整数默认为now。如果是一个浮点数,其范围是0.0~1.0的B区间,它代表着训练集在原来数据的占比,如果是一个整数,表示训练集的数据量,如果是now,就要看text size的设置。Random state,一个整数或者一个random state的实例默认为,那如果修改了默认值,就是指定了随机数种子,这样函数的输出就是固定不变的。相布尔类型默认为now在拆分之前是否打乱数据,如果不打乱数据,也就是下F等于false的情况。
17:06
参数stratify必须为nu stratify,一个类似于数组的对象,默认为nu,如果不是,那就按照对应的比例进行划分。例如,我有20个数据,特征矩阵即为X,类别值即为Y,四个属于类别零,16个属于类别一,类别零比上类别一,1:4。像这样调用该方法进行拆分,除text split X逗号Y逗号stra等于Y,会把20乘以一减去0.25的差等于15个数据放在训练集。当然这15个数据。不是随便乱想出来的。而是在这15个数数据中,在这个训练集中必须保持类别零比上,类别一等于1:4,剩余五个放在测试集。当然,如果特征矩阵的第列只能取少数几个离散值,那么也可以按照这一列的取值的比例进行划分,像这样调用就行了。Ify等于X的Di列。
18:05
回到这幅图,下面我来讲一下这幅图。图像的X轴是enables y轴是训练级精度和测试级精度。虽然现实世界的图像很少有非常平滑的,但我们仍可以看出过拟和与嵌拟合的一些特征。注意,由于更少的邻居对应更复杂的模型,所以此图相对于图二杠一做了。水平的翻转。仅考虑单一进零时,训练集上的预测结果十分完美,但随着邻居个数的增多,模型变得更简单,训练及精度也随之下降。单一零居时,测试及精度比更多邻居时要低,这表示单一邻居的模型过于复杂。与之相反,当考虑十个邻居时,模型又过于简单,性能甚至变得更差,最佳性能在中间的某处。邻居个数大约为六,不过最好记住这张图的坐标轴刻度,最差的性能约为88%的精度,这个结果仍然是可以接受的。
19:02
K精灵回归K精灵算法还可以用于回归,我们还是从单一的近灵开始。这次使用web数据集,我们添加三个测试数据点,在X轴上用绿色五角星表示,利用单一邻居的预测结果,就是最近零的目标值。在图中用蓝色的五角星来表示。同样也可以用多个精灵进行回归。在使用多个静音时,预测结果为这些邻居的平均值。
20:16
用于回归的K近零算法再次XKS类中实现,其用法与ks classify类似。
22:33
现在可以对测试集进行预测。
23:03
我们还可以用score方法来评估模型。对于回归问题,这一方法返回的是二方分数,二方分数也叫做决定系数,是回归模型预测的优度,度量位于零到一之间。阿方等于一对应完美预测阿方等于零对应常数模型,即总是预测训练集响应Y除以的平均值。下面简单的说一下。阿方分数怎么计算?计算公式在这里。其中y ti表示Di和真实目标值,YT表示Di的预测目标值,阿方等于一减去U除以V,其中U等于I等于一到A西格玛y ti减去YPI括弧的平方,求和viv等于。I等于一到N西格玛。Y ti减去YT拔跨弧的平方求和YT8等于1/0西格玛。I等于一到n y ti的求和。
24:18
稍微把它放大一点。大家可以自己看一下公式。通过公式可以得出。R方在什么情况下会等于一?当U等于零的时候。它不就等于一了吗,这个时候。预测值跟真实值。
25:01
相减的平方不就是零吗?对应完美预测。R方等于零,什么情况会等于零?U等于V的情况下会等于零。不也,这不也就表示着。预测值不就是。真实值的平均吗?所以记住公式。书上讲的。R方等于零对应完美预测阿方,阿方等于一对应完美预测R方等于零对应常数模型,这句话就没有必要去死记硬背。
26:17
这里的分数是0.83,表示模型拟合的相对较好。分析k ness对于我们的一维数据集,可以查看所有特征取值对应的预测结果。为了便于绘图,我们创建一个由许多年组成的测试数据集。
33:06
至尊代码中。The shape。这个方法。有很多人可能是第一次看到。对一个朗派数组调用方法表示什么意思?我们先来看一下。对,一个冷派数组电动设计方法等价于。直接去用朗派中的IP这么一个函数。他的原型。传入三个参数。它表示什么意思?再不改变输入数组,也就是参数A中元素的情况下,把这个数组进行重塑。例如我有一个长度为四的一维数组A,像这样调用该函数就可以生成一个两行两列的二维数组。
34:01
朗派点A。元组二逗号二。A就对应这里的参数A。New就对应这个元组。参数A,一个类似于数组的对象new shape,一个整数或者由多个整数构成的元组。如果是。一个正整数或者是。一个由正整数构成的元组。必须确保其乘积和输入数组对应的形状中的每个数的乘积相等。比如说。我这里有。一个四行两列的。华为叔叔。我就可以把它new ship里面写上两行两列两层2223个二的三元组。这是可以的,因为二的三次方,也就是二乘二再乘二等于四乘以二。如果是一个整数,这个值可以是负一,如果是由多个整数构成的元素,其中只能有一个负一。在这种情况下。
35:06
会自动帮你推算出这个值到底是多少,如果推算不出来就会报错。例如我有一个长度为八的一位数度A通过冷派点。A3负一元组。重塑乘一个三行的一个二维数组就会报错。你数组中总共只有八个元素。你想把它排成三排?这肯定排不了呀。A当创建一个多维数组时,选择行优先,存满一行,接着再存下一行,还是列优先存满一列,接着再存下一列,三个取值。CF或者AC表示行优先,也就是C语言风格F表示列优先,也就是说语言风格A表示自动选择。返回值是重塑之后的新数组。朗派数组对象的方法recipe。
36:03
一个党派数组对象可以直接调用方法进行数组的重塑。就像这样。这是一个朗派数组,直接调用方法进行重塑。不做就地,不做就地修改,它不是就地修改这个数组,而是返回一个新数组。而且参数设置没有必要像朗派别人的那么死板。能快点,这个new元组必须得用括号括起来。好在这地方就没有这个要求。例如我有一个长度为四的一位数组A,像这样调用该方法就可以生成一个二二行二列的二维数组。A点二逗号二。没有必要写成A点,把它用括号括起来。没有必要这么去想。
37:04
好,看到这个图。从图中可以看出,仅使用单一邻居训练,其中每个每个点都对预测结果有显著影响,预测结果的图像经过所有的数据点。这导致预测结果非常不稳定,考虑更多邻居后,预测结果变得更加的平滑,但对训练数据拟合的也不好。优点、缺点和参数一般来说,K nes分类器或者回归器有两个重要参数,邻居各数据数据点之间距离的度量方法。在实践中,使用较小的邻居个数,比如三个或五个,往往可以得到比较好的结果,但你应该调节这个参数。选择合适的距离度量方法超出了本书的范围,默认使用欧式距离。它在许多情况下效果都很好。虽然说距离度量方法超出了本书的范围,但还是简单的提一下。
38:10
哪些参数?用来设置距离的度量方法。这三个参数是用来设置距离的度量方法的。他们在不管是K精灵分类还是回归中。都可以使用。首先看到参数P,它是一个整数,默认为二,用来设置明可夫斯基距离的参数。当P等于一时,对应曼哈顿距离,当P等于二时,对应O距离的距离也就是欧式距离。当P取其他值时。米科夫斯基距离。参数metric,一个字符串或者一个可调用对象默认为。宁可夫斯基。距离算法。默认使用明客夫斯基距离。如果magic等于preut。
39:00
X就被假设成为一个距离矩阵。从数据结构中看,它就是一个无相带全图的临街矩阵。必然是对称方阵,主对角线全为零,因为自己跟自己的距离。就是零。X也可以是一个稀疏矩阵。参数ma,一个字典默认为now距离算法的额外参数。距离算法,下面我们来看到有哪些距离算法。在看距离算法之前。首先来看到这个表格。总共有三类空间时,空间数据点的每一个特征都是一个实数。整空间数据点的每一个特征都是一个整数,布尔空间数据点中的每一个特征都是一个布尔值,如果不是,会自动转换。下面总共有。
40:02
1234总共有四大类距离二维十空间实际上就是N维时空间的一个特例。首先看N维时空间的距离。米可夫斯基距离参数设置,Ma等于米可夫斯基,P等于任意一个整数。就是上面讲的参数P。计算公式。其中德尔塔Xi表示两个同为,在这里是N为向量第个分量的差,P对应的就是参数P。DP等于。I等于一到N西格玛。德尔塔I德尔塔Xi绝对值的P次方求和整体的P分之一次方。通过公式显然可以看出,P应该让它尽量取正整数,因为如果是负数,当德尔塔Xi等于零的时候就会报错。如果是零。P分之一,这里的P分之一就没有任何意义。
41:02
下面来看到第二个距离度量方式,曼哈顿距离参数设置,美克等于曼哈,当然也可以,美克等于米克夫斯基,P等于一也一样。P等于一带入米可夫斯基距离公式DP集合划简公式,则有de等于I等于一到A西格玛。德尔塔Xi的绝对值。OG里的距离参数设置ma等于OG里德。当然也可以,美克等于米可夫斯基P等于二。P等于二带入米克夫斯基距离公式AP几和化简公式等于。第二等于根号下。I等于一到西格玛德尔塔Xi平方的求和。切比雪夫距离参数设置,Ma等于切比雪夫计算公式。其中德尔塔X表示两个N为向量的差。也是一个N位向量。
42:00
求的是德尔塔X中。每个数据的最大值。带全明克夫斯基距离参数设置,Ma克等于W,米克夫斯基T等于一个整数。Magic等于。字典W冒号。其中metric w等于是一个类似于一维数组的对象,其中每个元素是一个数,长度为A。计算公式,其中W对应每W中第个元素的取值。I等于一导西格玛。Wi乘上德尔塔Xi整体的绝对值的P次方,求和整体的P分之一次方。标准化OG里的距离参数设置ma等于OD里的。等于V。Ma para v是一个类似于一维数组的对象,其中每个元素是都是大于零的数。计算公式,其中V对应magic para v中Di个元素的取值。
43:07
根号下。I等于一到西格玛。德尔塔Xi的平方除以VI。整体的求和。马氏距离参数设置等。马哈拉诺比斯。MAS等于V。其中这个V。是一个类似于N阶对称可逆方程主对角线上的元素全部非负的一个对象计算公式,其中德尔塔X表示两个N为列向量的差,V就是ma v也就是一个斜方差矩阵。计算公式很简单,根号下德尔塔X的转值。乘上V的力,然后再乘上德尔塔X。斜方差矩阵,下面简单的说一下这个斜方差矩阵是什么?N个随机变量即为X1 x21直到XN之间的斜方差构成的矩阵,就像这样排列的。
44:05
斜方差公式,总体的斜方差公式。Co v X y等于EXXY减去EXEY。样本的斜方差公式。为了跟总体区分,这里的C改成小写Co v X y等于1/0,西格玛I等于一到零,Xi减去X8。乘上Yi减去Y8,其中X8等于N分之一,I等于一到N西格玛Xi,求和。下面来看二维十空间距离,当然二维十空间距离这些距离也可以使用。我们来看一个特例的半正式距离参数设置met等于S。设有两个点坐标分别为X1 x2和Y1 Y2,其中X1 x2 Y1 Y2均为任意实数。计算公式。两倍的X sin根号下sin平方X1减去Y1的整体除以二。加上Co桑X1 cos y1。
45:02
三一平方。X2减Y2除以二整体除以二。这里有些人可能会想,X1 x2 Y1 Y2怎么可能会是任意实数?出现任意实数,如果是任意实数,会不会出现没有定义的情况?在这里我直接给出结论,不会,没有定义,它确实能够满足根号下面的式子。在零到一之间。可以尝试去证明。为了时间关系,我就不做证明,N为整空间距离。直接来看到N为整空间距离,下面介绍的这种距离算法虽然主要用在整空间,但在时空间当中也可以使用汉明距离。参数设置mari等于汉米计算公式,其中Xi表示第个点的。第一个点。表示第一个点的第个分量,Y表示第二个点的第个分量。
46:02
公式N分之一西格玛I等于一到a Xie或Yi,其中ae或B等于一,当A不等于B时,等于零,当A等于B时。坎贝拉距离参数设置,Ma等于坎贝拉计算公式,西格玛I等于一到零。Xi减去Yi整体的绝对值除以。Xi加上Yi的整体。布雷克蒂斯距离参数设置,Mari等于布雷克蒂斯计算公式。实际上就是坎贝拉距离这地方只有一个西格玛,我把它看成我把它写成三个西格玛的形式。就行了。西格玛I等于一到N。Xi的绝对值加上西格玛I等于一到零,Y的绝对值整体分支西格玛I等于一到零。绝对值Xi减去Yi的整体。下面看到N为布尔空间的距离。
47:01
任何能被解释成true的值都会被解释成true,否则解释成false。假设有两个值为不都不要点。A和B。这些东西。这四个NTTNTFNFTNFF,大家可能一开始看看不太懂。先来解释一下它们到底是什么N?为数在上列中,N等于十,NTT2个值都为处的为数。在上列中,NTT等于三。实际上就是两个值都为处,也就是两个值都为一嘛。零一对应的NTD是001得010得000得011得一。所以NTT在这地方总共有三个一。把这一行进行相加,就对应这里的NTT,也就是3NTF第一个值为处,第二个值为false的为数,再上那种NTF等于一。
48:10
第一个为处,第二个为false,也就是一零得一。把这一列进行相加,一带下来。NFT第一个值为false,第二个值为true的为数。也就是零一得一。在上列中,NFT等于三,这个三怎么来的?把这一行的所有数据一,零,零,零这些数组。做个求和。有三个一,所以它是三。N f2个值都为false的为数。在上列中,NFF等于三。怎么算出来的?两个就都为false,表示的意思是零零得一,其余都是零。把这一行数据相加,就是NFF的值。NEQ不等为数NNEQ等于NTF加上NFT,再上面说NNEQ等于四。
49:04
NNZ非零位数NNZ等于NTF加上NFT加上NTT,再上面说NNZ等于七。上述七个变量取值的范围都是零到零的整数,零和零均可取。下面我们来看这一些距离。这些距离比较,计算方式比较简单,不单独写公式了。NKNZ。就是这上面的对应的缩写。大家可以自己看一下这个表格。参数,事实很简单。Ma等于标识当中的任意一个就行了。我们看仔细看这张表格,我们会发现,当两个N为布尔数据点相等,并且其中每个元素都是零或者说false。我们发现解卡的距离,骰子距离。呵。
50:00
索克尼,Julie。会无法计算,为什么无法计算?因为分母是零。当遇到这种情况时,会算出什么结果?可以看一下下面这个表格。如果是解卡的距离,结果就是零,如果是骰子距离,结果是。那如果是fo斯距离结果也是那。我们还可以自定义距离,假设自定义的距离函数为DXY。关键字参数KWX,其中K的KWX用来定义超参数,类似于米可夫斯基距离中的参数P。如果定义了,只需要把它传给ma p即可,此时参数设置magic等于D。Magic等于KWX,如果没有定义参数设置,就是magic等于D。自定义距离需要满足以下要求,非负性。DXY大于等于零唯一性,当接近到X等于Y时,DXY等于零。对称性DXY等于DYX,三角不等式DXY加上DYZ大于等于DXZ。
51:11
我们可以发现。非负性、唯一性。骰子距离和so距离。都不满足。当然。其他的几个距离算法。全都满足这四个条件。可以自己尝试去证明。时间关系我就不作证明了。下面我们来回到KNN算法。KNN的优点之一就是模型很容易理解,通常不需要过多的参数,通常不需要调过多调节就可以得到不错的性能。再考虑使用更高级的技术之前,尝试此算法是一种很好的基准方法。构建最近离模型的速度通常很快,但如果训练起很大,特征数据很多或者样本数很大,预测速度可能会变慢。
52:06
使用KNN算法时,对数据进行预处理是很重要的。先第三章这一算法对于有很多特征、几百或更多的数据集往往效果不好。对于大多数特征的大多数取值都为零的数据集,所谓系数数据集来说,这一算法的效果尤其的不好。虽然K精灵算法很容易理解,但由于预测速度慢,且不能处理具有很多特征的数据集,所以在实践中往往不会被用到。下面介绍的。这种方法也就是线性模型,下一回我将会介绍线性模型,这种方法就没有这两个缺点。
我来说两句