python机器学习(二)特征工程、K-近邻算法、KNN工作流程、scikit-learn实现K近邻算法、K值选择、距离计算、KD树

特征工程

把特征转换为机器容易识别的数据,把特征a转化为机器容易读懂、量化的语言

归一化Min-Max

将原始数据映射到[0,1]之间
X ′ = x − m i n m a x − m i n X'= \frac{x-min}{max-min} X′=max−minx−min

但是归一化是有弊端的,比如有一个值错误,就会影响整体的数值,并且归一化是无法解决这个异常值。所以归一化只适合传统精确小数据场景。

标准化

通过对原始数据进行变换把数据变换到均值为0,标准差为1范围内。也就是服从正态分布的数据。
X ′ = x − m e a n σ X'=\frac{x-mean}{\sigma} X′=σx−mean

K-近邻算法(K-Nearest Neighboor)

定义

如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

理念

取近的邻居,本质为近朱者赤近墨者黑,比如可以通过身边的住户预测本区域送外卖的是哪些人。所以就要用欧式距离计算出跟邻居的距离,找出最近的邻居(k=1)。

问题:只有1个的话数据不够精准,被噪点的干扰太强,数据有误差的话就会被完全带偏。

解决:要找k个邻居,自己写代码实现knn。knn算法也可以用于动态加载的字体反爬。

理解K近邻

已知《战狼》、《红海行动》、《碟中谍6》是动作片,而《前任3》、《春娇与志明》、《泰坦尼克号》是爱情片。每一行(一部电影)为一个数据样本,特征列为打斗次数、接吻次数,根据打斗次数和接吻次数来区分是爱情片和动作片。如果新的电影如《美人鱼》,人可以根据自己经验将电影进行分类,也可以让机器也可以掌握一个分类的规则,自动的将新电影进行分类。

对图中的数据进行整理,绘制散点图如下:

通过分析结果可以看出,动作片的打斗场景非常多,根据《美人鱼》电影的数据,可以大致判断出在图中红色圆圈的位置。现在就要判断出红色圆圈距离哪一个样本点比较近,如果距离《春娇与志明》比较近,就可以归类为爱情片,如果距离《红海行动》比较近的话就可以归类为动作片。

两点之间的直线距离最近。

在机器学习中说到两点之间的距离,通常指的是欧式距离,二维欧式距离公式如下:
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d12=(x1−x2)2+(y1−y2)2

特征不可能说只有两个,每个特征代表一个维度,同理衍生三维欧氏距离公式如下:
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} d12=(x1−x2)2+(y1−y2)2+(z1−z2)2

如果是四维或者更高维度,归纳N维欧式距离公式如下:
d 12 = ∑ k = 1 n ( x i − y i ) 2 d_{12} = \sqrt{\sum_{k=1}^n(x_i-y_i)^2} d12=k=1∑n(xi−yi)2

对距离进行精准计算,以两点(美人鱼、碟中谍6)为例进行求解,

python 复制代码
# 美人鱼:5  29
# 碟中谍6: 105 31
np.sqrt((105-5)**2+(31-29)**2)  # 100.0199980003999

如果要算出最近距离,则需要算《美人鱼》与各个特征点之间的距离。从计算结果可以看出,距离《美人鱼》最近的电影是《前任3》,如果只从一个特征点去判定的话,结果可能会不精确。这时要选择更多(K值)的附近特征值进行比较,如果选择K=3,选择距离最近的3个,选择的特征值为《前任3》、《春娇与志明》、《泰坦尼克号》,这三个都是爱情电影,可以把《美人鱼》归类为爱情电影。如果选择K=4,就会出现3个爱情电影,1个动作电影,此时就选择众数,将数据归类为出现次数最多的特征里。

如果只用一个特征点的距离就判断类型的话是不可靠的,如下图

xiaoming其实是在二七区,但是跟B同学的距离最近,这是一个分类的问题,在K近邻算法中,以半径的方式划圈,但是并不能说xiaoming就在中原区,分类问题不能算成均值。如果选择五名同学进行计算,分别计算跟每个同学的距离,要选择类别为众数的,才能更加可靠的来判断出xiaoming所在的区域。xiaoming距离C、D同学最近,E、F同学较远,才能准确的判断xiaoming在哪个区域。

KNN工作流程

  • 计算待分类物体与其他物体之间的距离;
  • 统计距离最近的 K 个邻居;
  • 对于 K 个最近的邻居,它们属于哪个分类最多,待分类物体就属于哪一类。
    基于流程使用numpy和pandas去实现算法。


    用编程来实现,就要用到面向对象的编程思想,可以实现动态传参、继承等,避免了函数间的反复接受和调用,实例属性在所有的实例方法立都可以使用。要先封装一个类然后定义一个main()方法,在主程序的方法里进行实例化、调用方法的过程。
    在main()方法里读取数据后,并不能将所有的数据传进去做处理,要把数据划分为初始化的特征,训练特征:打斗次数、亲吻次数;训练目标:电影类型;预测数据;实例化类,传入训练特征、目标数据和K值。
    要把得到的数据传到类中,在类里创建初始化的方法来初始化属性。
    创建预测方法,实现预测《美人鱼》电影属于哪个分类,计算预测数据和真实数据的欧式距离,获取距离最小的前K 个值,对K个点的分类进行统计。此时统计的是当k为确定的值时得到的结果,如果要测试多个,可以进行循环遍历,k最好取奇数。

小结

  1. 计算欧式距离
  2. 取最近的k个邻居
  3. 利用numpy和pandas的广播机制,效率比python的循环要高
  4. 选择数据。
    *
    1. df.loc[行标签,列标签],通过标签选择数据
    • 2.df.iloc[行下表,列下标],通过下标/索引选择数据
  5. 1个邻居不可靠,需要选择多个邻居,求的是类别,不是均值。

K-近邻算法api介绍

scikit-learn工具介绍

scikit-learn是基于python语言的机器学习工具。参考说明文档:http://scikitlearn.com.cn

  • Python语言是简单高效的数据挖掘和数据分析工具
  • Scikit-learn包括许多知名的机器学习算法的实现
  • Scikit-learn文档完善,容易上手,有丰富的API

scikit-learn的安装

python 复制代码
pip3 install scikit-learn

注意:安装scikit-learn,需要提前安装numpy,Scipy等库

scikit-learn实现K近邻算法--分类问题

从sklearn包下的neighbors模块,调用所用到的KNeighborsClassifier分类器,n_neighbors为指定的K值,

python 复制代码
sklearn.neighbors.KNeighborsClassifier(n_neighbors=5, weights='uniform', algorithm='auto')
n_neighbors:查询默认使用的邻居数(默认为 5) 
weights:默认为 "uniform" 表示为每个近邻分配同一权重;
可指定为 "distance" 表示分配权重与查询点的距离成反比;同时还可以自定义权重。

从题目中看到1-,-2是同类别的,为0类别;2,3为同类别的,为1类别。传入的1特征,选择了2个近邻,不仅会找到跟1最近的2,还会找到跟1次近的-1,此时-1和2是同权重的,根据现有的特征数据和结果去训练模型,按距离近的用 weights='distance' 增加权重。

实现电影分类的案例

scikit-learn实现K近邻算法--总结

  • 构建特征数据与目标数据
  • 构建k个近邻的分类器(两个参数:n_neighbors,weights)
  • 使用fit进行训练
  • 预测数据

K值选择

如果 K 值比较小就相当于未分类物体与它的邻居非常接近才行。这样产生的一个问题就是,如果邻居点是个噪声点,那么未分类物体的分类也会产生误差,这样 KNN 分类就会产生过拟合。通过输入的数据去预测类别,输入的数据要与训练的实例接近才会有结果,如果只取了一个实例(k的取值过小),好比每天只练习一种题型,考试的时候遇到复杂的题型就会不知所措,只会记住自己训练出来的模板,对一种题型训练过度,就出现过拟合的现象。

如果 K 值比较大,相当于距离过远的点也会对未知物体的分类产生影响,虽然这种情况的好处是鲁棒性强,但是不足也很明显,会受到样本均衡的影响,产生欠拟合情况,也就是没有把未分类物体真正分类出来。k值过大,抗风险能力比较强,好比备考的时候,什么题型都看(海纳百川),那任何一部电影传进来,都会见过类似的。考试的知识点是初中的,备考的时候复习了小学、初中、高中、大学的内容,考试的时候就不知道用初中、高中、还是大学的知识去解题(都接触过,又都不那么深入),分不清对应的考点,就会有欠拟合的现象。

用N个K值从小到大进行测试,选择结果最好的那个K值,人为的一个一个的测试会很繁琐,可以用交叉验证。交叉验证的思路就是,把样本集中的大部分样本作为训练集,剩余的小部分样本用于预测,来验证分类模型的准确性。所以在 KNN 算法中,我们一般会把 K 值选取在较小的范围内,同时在验证集上准确率最高的那一个最终确定作为 K 值。

距离计算

  • 欧氏距离(欧几里得距离)
  • 曼哈顿距离
  • 闵可夫斯基距离
  • 切比雪夫距离
  • 余弦距离

欧式距离

欧式距离代表的是两点之间的距离作为的衍生,比如现在在408教室上课,有位同学要去隔壁的508教室,不能根据距离直接穿过去,二维欧式距离公式如下:
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2} d12=(x1−x2)2+(y1−y2)2

衍生三维欧氏距离公式如下:
d 12 = ( x 1 − x 2 ) 2 + ( y 1 − y 2 ) 2 + ( z 1 − z 2 ) 2 d_{12} = \sqrt{(x_1-x_2)^2+(y_1-y_2)^2+(z_1-z_2)^2} d12=(x1−x2)2+(y1−y2)2+(z1−z2)2

归纳N维欧式距离公式如下:
d 12 = ∑ k = 1 n ( x i − y i ) 2 d_{12} = \sqrt{\sum_{k=1}^n(x_i-y_i)^2} d12=k=1∑n(xi−yi)2

  • 涉及到开根号,就会涉及到浮点数,甚至是无线无限循环小数。在机器学习中的特征一般都是高纬(超越了3个维度)的,再涉及到小数,就会有误差,对内存的消耗很大,计算机的运行速度就会很慢。为了解决这个问题,就尽量的进行整数的计算,引入曼哈顿距离。

曼哈顿距离

在几何空间中用的比较多,比如a同学在408,b同学在512,从a到达b,中间的格子都是墙,不可能从a走绿色的线穿墙而过,最终目的也要使得路程最短。可以从a点先往上走,距离为 y 2 y_2 y2和 y 1 y_1 y1的差值,然后横向走,距离为 x 2 x_2 x2和 x 1 x_1 x1的差值,才能到达最终的终点。通过两段距离的和,求出两点之间的距离。

通过下图可以看出,不管如何顺着格子走,两点之间的距离是一定的。

二维平面两点 a ( x 1 , y 1 ) a(x_1,y_1) a(x1,y1)与 b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2)间的曼哈顿距离:
d 12 = ∣ x 1 − x 2 ∣ + ∣ y 1 − y 2 ∣ d_{12}=| x_1-x_2 | +\mid y_1-y_2 \mid d12=∣x1−x2∣+∣y1−y2∣

n维空间点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n)与 b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n)的曼哈顿距离:
d 12 = ∑ k = 1 n ( x 1 k − x 2 k ) d_{12} = {\sum_{k=1}^n(x_{1k}-x_{2k})} d12=k=1∑n(x1k−x2k)

  • 曼哈顿距离也被称为出租车几何,在城市中开车不能穿墙而过,只能根据房子周边的路线去走。在高维中进行整数计算,只用到了加减的运算,避免了小数的计算(不至于出现无线循环小数,或者是无理数),运算速度比较快,并且误差很小。

切比雪夫距离

在国际象棋中,国王可以直行、横行、斜行,所以国王走一步可以移动到相邻8个方格中的任意一个。国王从格子 ( x 1 , y 1 ) (x_1,y_1) (x1,y1)走到格子 ( x 2 , y 2 ) (x_2,y_2) (x2,y2)最少需要走多少步?这个距离就叫切比雪夫距离。

从上图可以看出从2A到5C点所经过的距离,可以是先从2A走到2C(2步),然后从2C走到5C(3步);也可以是先从2A走到4C(2步),然后从4C走到5C(1步)。第二种走的步数刚好为第一中走的两部分步数的最大值。

二维平面两点 a ( x 1 , x 2 ) a(x_1,x_2) a(x1,x2)与 b ( x 2 , y 2 ) b(x_2,y_2) b(x2,y2)间的切比雪夫距离:
d 12 = m a x ( ∣ x 1 − x 2 ∣ , ∣ y 1 − y 2 ∣ ) d_{12}=max(| x_1-x_2 | ,\mid y_1-y_2 \mid) d12=max(∣x1−x2∣,∣y1−y2∣)

n维空间点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n)与 b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n)的切比雪夫距离:
d 12 = m a x ( ∣ x 1 i − x 2 i ∣ ) d_{12}=max(| x_{1i}-x_{2i} | ) d12=max(∣x1i−x2i∣)

闵可夫斯基距离

闵式距离是一类距离的同城,是对多个距离度量公式的概括性的表述。闵可夫斯基距离是个通过的指标,通过变换参数来更换极限形式,

两个n维变量 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n)与 b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n)的闵可夫斯基距离定义为:
d 12 = ∑ k = 1 n ∣ x 1 k − x 2 k ∣ p p d_{12} = \sqrt[p]{\sum_{k=1}^n|x_{1k}-x_{2k}|^p} d12=pk=1∑n∣x1k−x2k∣p

其中p是一个变参数:

  • 当 p = 1 p=1 p=1时,根号就不存在了,就是曼哈顿距离;
  • 当 p = 2 p=2 p=2时,就是欧式距离;
  • 当 p → ∞ p\to \infty p→∞时,取极限的最大值,忽略最小值,就是切比雪夫距离

余弦距离

余弦距离实际上计算的是两个向量的夹角,是在方向上计算两者之间的差异,对绝对数值不敏感。sin函数是对边比斜边,cos函数是临边比斜边,引申出来两个向量之间的夹角余弦公式。夹角余弦的取值为-1到1,余弦越大就表示向量的夹角越小。

二维空间中向量 A ( x 1 , y 1 ) A(x_1,y_1) A(x1,y1)与向量 B ( x 2 , y 2 ) B(x_2,y_2) B(x2,y2)的夹角余弦公式:
c o s θ = x 1 x 2 + y 1 y 2 x 1 2 + y 1 2 x 2 2 + y 2 2 cosθ=\frac{x_1x_2+y_1y_2}{\sqrt{x_1^2+y_1^2}\sqrt{x_2^2+y_2^2}} cosθ=x12+y12 x22+y22 x1x2+y1y2

两个n维样本点 a ( x 11 , x 12 , . . . , x 1 n ) a(x_{11},x_{12},...,x_{1n}) a(x11,x12,...,x1n)与 b ( x 21 , x 22 , . . . , x 2 n ) b(x_{21},x_{22},...,x_{2n}) b(x21,x22,...,x2n)的夹角余弦为:
c o s θ = a ⋅ b ∣ a ∣ ∣ b ∣ cosθ=\frac{a \cdot b}{|a||b|} cosθ=∣a∣∣b∣a⋅b

即: c o s ( θ ) = ∑ k = 1 n x 1 k x 2 k ∑ k = 1 n x 1 k 2 ∑ k = 1 n x 2 k 2 cos(θ)=\frac{\sum_{k=1}^nx_{1k}x_{2k}}{\sqrt{\sum_{k=1}^nx_{1k}^2}\sqrt{\sum_{k=1}^nx_{2k}^2}} cos(θ)=∑k=1nx1k2 ∑k=1nx2k2 ∑k=1nx1kx2k

  • 余弦距离也被称为余弦相似度,可以判断两个物品间的相关性,
    比如3个人去超市买物品,用表格表示,买的为1,没有买的为0。
物品人员 a b c d e
A 1 1 0 0 1
B 0 1 1 0 0
C 1 0 0 0 1

A与B的相似度: c o s ( θ ) = 1 ∗ 0 + 1 ∗ 1 + 0 ∗ 1 + 0 ∗ 0 + 1 ∗ 0 1 2 + 1 2 + 0 2 + 0 2 + 1 2 0 2 + 1 2 + 1 2 + 0 2 + 0 2 = 1 6 = 0.408 cos(θ)=\frac{1*0+1*1+0*1+0*0+1*0}{\sqrt{1^2+1^2+0^2+0^2+1^2}\sqrt{0^2+1^2+1^2+0^2+0^2}}=\frac{1}{\sqrt{6}}=0.408 cos(θ)=12+12+02+02+12 02+12+12+02+02 1∗0+1∗1+0∗1+0∗0+1∗0=6 1=0.408

A与C的相似度: c o s ( θ ) = 1 ∗ 1 + 1 ∗ 0 + 0 ∗ 0 + 0 ∗ 0 + 1 ∗ 1 1 2 + 1 2 + 0 2 + 0 2 + 1 2 1 2 + 0 2 + 0 2 + 0 2 + 1 2 = 2 6 = 0.816 cos(θ)=\frac{1*1+1*0+0*0+0*0+1*1}{\sqrt{1^2+1^2+0^2+0^2+1^2}\sqrt{1^2+0^2+0^2+0^2+1^2}}=\frac{2}{\sqrt{6}}=0.816 cos(θ)=12+12+02+02+12 12+02+02+02+12 1∗1+1∗0+0∗0+0∗0+1∗1=6 2=0.816

B与C的相似度: c o s ( θ ) = 0 ∗ 1 + 1 ∗ 0 + 1 ∗ 0 + 0 ∗ 0 + 0 ∗ 1 0 2 + 1 2 + 1 2 + 0 2 + 0 2 1 2 + 0 2 + 0 2 + 0 2 + 1 2 = 0 4 = 0 cos(θ)=\frac{0*1+1*0+1*0+0*0+0*1}{\sqrt{0^2+1^2+1^2+0^2+0^2}\sqrt{1^2+0^2+0^2+0^2+1^2}}=\frac{0}{\sqrt{4}}=0 cos(θ)=02+12+12+02+02 12+02+02+02+12 0∗1+1∗0+1∗0+0∗0+0∗1=4 0=0

由此可见,A与C的相似度较高,可以根据A用户购买的物品给与A相似度较高的C进行推荐。

KD树

有位置的数据想要去预测类别,找到跟他最临近的k个邻居,把这个点跟所有邻居的距离都算一下,进行排序,找到最近的k个来取众数,以此来划分到最多的类别中。对于数据比较少的情况,计算速度比较快,如果要训练好一个数据模型,数据量必然是很大的,再去一个一个的计算预测数据与每个邻居之间的距离,计算量就会特别的大,可以使用KD树进行优化。

KNN 的计算过程是大量计算样本点之间的距离。为了减少计算距离次数,提升 KNN 的搜索效率,提出了 KD 树(K-Dimensional 的缩写)。KD 树是对数据点在 K 维空间中划分的一种数据结构。在 KD 树的构造中,每个节点都是 k 维数值点的二叉树。既然是二叉树,就可以采用二叉树的增删改查操作,这样就大大提升了搜索效率。

  • 例题1:有数据集{(2,3),(5,4),(9,6),(4,7),(8,1),(7,2)},构造kd树。

    六个数据点为二维的点,呈现在二维的坐标轴上,kd树的划分:
  • 1.以x1轴的中位数作为切分标准,2,4,5,7,8,9,把几个数从小到大排序,个数为偶数的话,选取中间的两个点,相加求中位数,(5+7)/2=6,
    • 1.(5,4)与(7,2)距离6同样近,取任意的一个点如取(7,2)作为根节点
    • 2.做一条过(7,2)点垂直于x1轴的线,把二维的屏幕划分为左右两部分
  • 2.以x2轴来划分左边区域,找到中位数,做x2的垂直线,
    • 1.左边区域有3个点,x2的值分别为3,4,7,中位数点为(5,4),
    • 2.过(5,4)做一条垂直于x2的线,把左边的区域分为上下两部分,
    • 3.以x1轴划分下区域,除了已成为节点的点,下区域就剩下了(2,3)点,通过(2,3)向x1做垂线,
    • 4.以x1轴划分上区域,除了已成为节点的点,上区域就剩下了(4,7)点,通过(4,7)向x1做垂线,
    • 5.在二叉树上放置的点是左小右大,所以把(2,3)点放在左侧,(4,7)点放在右侧
  • 3.以x2轴来划分右边区域,找到中位数,做x2的垂直线
    • 1.只剩下(8,1)与(9,6),所以中位数距离两个点的距离一致,随意取一个点作为节点,如取(9,6)
    • 2.过 (9,6)向x2轴做垂线,把右边区域也分为上下两部分,上部分已经没有点了
    • 3.下半部分找到(8,1)的中位数,只有一个点,这个点就是中位数,通过这个点向x1轴做垂线,得到的最后一个节点为(8,1)
  • 例题2,有目标点(3,4.5),请问如何在数据集中搜索目标点的最近邻?

    如果取计算每个点的距离,就要去计算6次,如果数据量很大的话,计算量就会越来越多。用kd树进行计算,本身就是个递归,重复的过程。
  • 1.从根节点(7,2)来判断,点(3,4.5)x1轴上的数为3,3小于7,左边为较小的数,就找到了点(5,4),x2维度上的数为4,4.5大于4,会往右侧方向找(较大的数),找到了点(4,7),此时暂时的最近邻为(4,7),
  • 2.以(3,4.5)为圆心,到点(4,7)的距离为半径画圆,得到了蓝色的圆,很显然(4,7)不是点(3,4.5)的最近邻,此时算法要进行回溯,以目标点为圆心,以到暂时的临近点为半径,做圆,两点间的半径为2.69
  • 3.回溯到上个节点(5,4),以目标点为圆心,以到暂时的临近点(5,4)为半径,做圆,两点间的半径为2.06
  • 4.继续进行回溯到(2,3),以目标点为圆心,以到暂时的临近点(2,3)为半径,做圆,两点间的半径为1.8,
    得到(2,3)才是最近邻的点,此时就不需要去计算距离(7,2),(9,6),(8,1)的距离了,减少了计算量。

数据集获取

要测试一些算法,如果不是在真实的环境中,缺少特征工程的数据,学这些模型的时候就可以借鉴已经做好处理的数据来进行学习。

获取函数

获取数据的接口

python 复制代码
sklearn.datasets 加载获取流行数据集
datasets.load_***() 获取小规模数据集,数据包含在datasets里
datasets.fetch_***(data_home=None) 获取大规模数据集,需要从网络上下载,
函数的第一个参数是data_home,表示数据集下载的目录,默认是 ~/scikit_learn_data/

返回集

python 复制代码
load 和 fetch 返回的数据类型(字典格式)
data:特征数据数组
target:标签数组
DESCR:数据描述
feature_names:特征名
target_names:标签名

数据分割

训练模型需要一部分数据,评估模型的好坏需要一部分新的数据,两份数据重合的时候会产生状况,导致结果不真实,所以把数据分为训练集、测试集以及验证集,在没有调参之前把数据分为训练集和测试集。数据分割的方式:留出法,直接以二八或者三七分数据;K折交叉验证,把数据集分为10份,依次以1份作为测试集,其他的作为训练集,得出10次的结果求平均;自助法,训练集随机进行有放回的抽取。最常用的是留出法。

留出法api

用程序实现,把数据集分为3份和7份,用numpy、pandas的选择数据来做,求出数据的总长度,然后做切割,用sklearn来做训练集的测试分割。

python 复制代码
sklearn.model_selection.train_test_split(arrays,*options)
x 数据集的特征值
y 数据集的标签值
test_size 测试集的大小,一般为float
random_state 随机数种子,不同的种子会造成不同的随机采样结果。相同的种子采样结果相同。
return 训练特征值,测试特征值,训练目标值,测试目标值

算法、模型都存在随机性,同一个算法、同一个数据集运行多次的时候结果是不一样的,同一个代码、同一个模型不同人训练出来的结果会有差异。数据分割同样也具有随机性,可以使用random_state参数,保证每次训练出来的结果是一样的。

相关推荐
鹏码纵横2 小时前
已解决:java.lang.ClassNotFoundException: com.mysql.jdbc.Driver 异常的正确解决方法,亲测有效!!!
java·python·mysql
仙人掌_lz2 小时前
Qwen-3 微调实战:用 Python 和 Unsloth 打造专属 AI 模型
人工智能·python·ai·lora·llm·微调·qwen3
猎人everest3 小时前
快速搭建运行Django第一个应用—投票
后端·python·django
猎人everest3 小时前
Django的HelloWorld程序
开发语言·python·django
chusheng18403 小时前
2025最新版!Windows Python3 超详细安装图文教程(支持 Python3 全版本)
windows·python·python3下载·python 安装教程·python3 安装教程
别勉.3 小时前
Python Day50
开发语言·python
硅谷秋水3 小时前
NORA:一个用于具身任务的小型开源通才视觉-语言-动作模型
人工智能·深度学习·机器学习·计算机视觉·语言模型·机器人
xiaohanbao094 小时前
day54 python对抗生成网络
网络·python·深度学习·学习
爬虫程序猿4 小时前
利用 Python 爬虫按关键字搜索 1688 商品
开发语言·爬虫·python
英杰.王4 小时前
深入 Java 泛型:基础应用与实战技巧
java·windows·python