机器学习
- 机器学习(Machine Learning)通过算法、使⽤历史数据进⾏训练,训练完成后会产⽣模型。未来当有新的数据提 供时,我们可以使⽤训练产⽣的模型进⾏预 测。 机器学习训练⽤的数据是由Feature、Label组成的。 Feature :数据的特征,也叫做特征列,例如湿度、⻛向、季节、⽓压。 Label:数据的标签,也叫做⽬标值,例如降⾬(0.不会下⾬,1.会下⾬),天⽓状况(1.晴天,2.⾬天,3.阴 天,4.雾天)
机器学习->机器学习算法->程序的迭代
代码语言:javascript复制传统机器学习(在公司的数据挖掘中比较适用):有监督(有目标值)
代码语言:javascript复制强化学习:在学习的基础,机器自己训练自己
代码语言:javascript复制深度学习:图像识别,自然语言处理
K-近邻算法(KNN)
- 勾股定理,
如何进行电影分类
众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪 个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问 题。没有哪个电影人会说自己制作的电影和以前的某部电影类似,但我们确实知道每部电影在风格 上的确有可能会和同题材的电影相近。那么动作片具有哪些共有特征,使得动作片之间非常类似, 而与爱情片存在着明显的差别呢?动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们 不能单纯依靠是否存在打斗或者亲吻来判断影片的类型。但是爱情片中的亲吻镜头更多,动作片中 的打斗场景也更频繁,基于此类场景在某部电影中出现的次数可以用来进行电影分类。 本章介绍第一个机器学习算法:K-近邻算法,它非常有效而且易于掌握。
代码语言:javascript复制#KNN算法是有监督的学习,数据必须带有目标值
代码语言:javascript复制#要求数据的样本要平衡
代码语言:javascript复制#要清楚k值的作用:找周围离自己最近的几个数据
代码语言:javascript复制#数据处理
代码语言:javascript复制#建立模型->训练数据->模型评估->预测数据
代码语言:javascript复制
代码语言:javascript复制#机器学习应对的三种数据:结构化数据,半结构化数据(html),非结构化数据
1、k-近邻算法原理
简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
- 优点:精度高、对异常值不敏感、无数据输入假定。
- 优点 : 简单有效 、重新训练的代价低 (重新运行)(分类,结合分布式,可以用多进程)、对于异常值不太敏感
- 特点 :可以做图像识别,文本识别,等,具有不可解释性(人与类聚,物与群分)
- 适用数据范围:数值型(字符串又不能计算)和标称型(ndarray,json等)。
缺点(k值有限制)
- k值不能选择样本的所有数量
- 样本的数量必须相等
- k值不能等于类别的倍数
- 时间复杂度高(程序运算的次数)、空间复杂度高(计算耗费的内存,先将测试的点与模型的点之间的距离计算出来再排序,然后取出相近的点)
- 慢,不low
- 惰性学习、 输出的结果可解释性不强
惰性学习法
也称作基于实例的学习法:给定一个训练元组,简单地存储它,一直等到给定一个检验元组,仅当看到检验元组时,他才进行泛化(是指机器学习算法对新鲜样本的适应能力),以便根据存储的训练元组的相识性对该元组进行分类 优点 : 原理简单,实现起来比较方便。支持增量学习,能对超多边形的复杂决策空间建模 缺点 : 计算开销大,需要有效的存储技术和并行的硬件支撑。
工作原理
代码语言:javascript复制存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据
代码语言:javascript复制与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的
代码语言:javascript复制特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们
代码语言:javascript复制只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常*K是不大于20的整数。
代码语言:javascript复制最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类*。
回到前面电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。
代码语言:javascript复制首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,上图中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见下表。
代码语言:javascript复制![2.PNG](./knn_image/2.PNG)
即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如图所示。
现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到K个距 离最近的电影。假定k=3,则三个最靠近的电影依次是California Man、He's Not Really into Dudes、Beautiful Woman。K-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。
- sklearn : scikit-learn :机器学习
- KNeighborsClassifier : 分类(有监督的学习)算法 (很少遇到回归的算法)
步骤:
- 1.先实例化一个空模型
- knn = KNeighborsClassifier()
- 2.训练数据 X = feature (特征必须是二维的) y = labels
- knn.fit(feature,labels)
- 3.评估
- knn.score(feature,labels)
- 4.预测
- knn.predict(F)
In [24]:
代码语言:javascript复制import numpy as np
代码语言:javascript复制import pandas as pd
代码语言:javascript复制import matplotlib.pyplot as plt
代码语言:javascript复制import seaborn as sns
代码语言:javascript复制from sklearn.neighbors import KNeighborsClassifier
In [25]:
代码语言:javascript复制moive = pd.read_excel('tests.xlsx', sheet_name=1)
代码语言:javascript复制moive
Out[25]:
电影名称 | 武打镜头 | 接吻镜头 | 分类情况 | |
---|---|---|---|---|
0 | 大话西游 | 36 | 1 | 动作片 |
1 | 杀破狼 | 43 | 2 | 动作片 |
2 | 前任3 | 0 | 10 | 爱情片 |
3 | 战狼2 | 59 | 1 | 动作片 |
4 | 泰坦尼克号 | 1 | 15 | 爱情片 |
5 | 星语心愿 | 2 | 19 | 爱情片 |
- feature :特征
- labels : 标签
In [26]:
代码语言:javascript复制feature = moive.iloc[:,1:-1]
代码语言:javascript复制labels = moive.iloc[:,-1]
实例化的是一个空模型 (模型创建好之后,数据保存在‘knn’中)
- KNeighborsClassifier : k邻居分类
In [27]:
代码语言:javascript复制#实例化的是一个空模型
代码语言:javascript复制# k邻居分类
代码语言:javascript复制knn = KNeighborsClassifier()
- fit : 适合
In [28]:
代码语言:javascript复制#训练数据 X = feature (必须是二维的) y = labels
代码语言:javascript复制knn.fit(feature,labels)
Out[28]:
代码语言:javascript复制KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')
In [29]:
代码语言:javascript复制#评估
代码语言:javascript复制knn.score(feature,labels)
Out[29]:
代码语言:javascript复制1.0
In [30]:
代码语言:javascript复制#测试 测试的数据
代码语言:javascript复制new_moive = pd.DataFrame(data=[['功夫',30,1,'动作片'],
代码语言:javascript复制 ['叶问',60,28,'动作片'],
代码语言:javascript复制 ['乡村爱情',3,30,'爱情片'],
代码语言:javascript复制 ['情深雨濛',43,43,'爱情片']
代码语言:javascript复制 ],columns=moive.columns)
In [31]:
代码语言:javascript复制new_moive
Out[31]:
电影名称 | 武打镜头 | 接吻镜头 | 分类情况 | |
---|---|---|---|---|
0 | 功夫 | 30 | 1 | 动作片 |
1 | 叶问 | 60 | 28 | 动作片 |
2 | 乡村爱情 | 3 | 30 | 爱情片 |
3 | 情深雨濛 | 43 | 43 | 爱情片 |
In [32]:
代码语言:javascript复制F = new_moive.iloc[:,1:-1]
代码语言:javascript复制L = new_moive.iloc[:,-1]
In [33]:
代码语言:javascript复制#预测
代码语言:javascript复制knn.predict(F)
Out[33]:
代码语言:javascript复制array(['动作片', '动作片', '爱情片', '动作片'], dtype=object)
In [34]:
代码语言:javascript复制#(x,y)散点图,c : class ,只认识0,1,2
代码语言:javascript复制plt.scatter(feature.iloc[:,0],feature.iloc[:,1],c=[0,0,1,0,1,1])
代码语言:javascript复制plt.scatter(F.iloc[:,0],F.iloc[:,1],c=[0,0,1,1],cmap='rainbow')
Out[34]:
代码语言:javascript复制<matplotlib.collections.PathCollection at 0x26f3697ddd8>
欧几里得距离(Euclidean Distance)
欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:
2、在scikit-learn库中使用k-近邻算法
- 分类问题:from sklearn.neighbors import KNeighborsClassifier
- 回归问题:from sklearn.neighbors import KNeighborsRegressor
鸢尾花识别
用于分类 导包,机器学习的算法KNN、数据蓝蝴蝶
In [16]:
代码语言:javascript复制iris=sns.load_dataset('iris')
In [14]:
代码语言:javascript复制knn.fit(iris.iloc[:,0:-1],iris.iloc[:,-1])
Out[14]:
代码语言:javascript复制KNeighborsClassifier(algorithm='auto', leaf_size=30, metric='minkowski',
metric_params=None, n_jobs=1, n_neighbors=5, p=2,
weights='uniform')
In [15]:
代码语言:javascript复制knn.score(iris.iloc[:,0:-1],iris.iloc[:,-1])#评估值为0.9666666666666667
Out[15]:
代码语言:javascript复制0.9666666666666667
In [17]:
代码语言:javascript复制data=pd.DataFrame(data=[['6.7','4.5','1.5','0.3','setosa']],columns=iris.columns)
In [18]:
代码语言:javascript复制data
Out[18]:
sepal_length | sepal_width | petal_length | petal_width | species | |
---|---|---|---|---|---|
0 | 6.7 | 4.5 | 1.5 | 0.3 | setosa |
In [19]:
代码语言:javascript复制knn.predict(data.iloc[:,0:-1])
Out[19]:
代码语言:javascript复制array(['setosa'], dtype=object)
In [ ]: