机器学习、流程、K-近邻算法
一机器学习
算法模型对象:特殊的对象,在该对象中已经集成好一个方程(没有求出解的方程)
模型对象的作用:通过方程实现预测或者分类
样本数据(df,np):
特征数据: 自变量
目标(标签)数据: 因变量
模型对象的分类:
有监督学习: 模型需要的样本数据中存在特征和目标
无监督学习: 模型需要的样本数据中存在特征
半监督学习: 模型需要的样本数据部分需要有特征和目标,部分只需要特征数据
sklearn模块: 封装了多种模型对象。
导入 sklearn ,建立线性回归算法模型对象
#1.导包 from sklearn.linear_model import LinearRegression #2.实例化模型对象 linner = LinearRegression() #3.提取样本数据 #4.训练模型 linner.fit(near_city_dist.reshape(-1,1),near_city_max_temp) #5.预测 linner.predict(38) linner.score(near_city_dist.reshape(-1,1),near_city_max_temp) #绘制回归曲线 x = np.linspace(10,70,num=100) y = linner.predict(x.reshape(-1,1)) plt.scatter(near_city_dist,near_city_max_temp) plt.scatter(x,y,marker=1)
样本集:用于对机器学习算法模型对象进行训练,样本集通常为一个DataFrame
特征数据: 特征数据的变化会影响目标数据的变化,通常为多列
目标数据: 结果, 通常为一列
二个机器学习项目流程
1.实际问题抽象成数学问题
指的我们明确可以获得什么样的数据,目标是一个分类还是回归或者是聚类的问题,如果都不是的话,划归到其中的某类问题
2.获取数据
获取数据包括获取原始数据以及从原始数据中经过特征工程从原始数据中提取训练,测试数据。机器学习比赛中元素数据都是直接提供的,但是实际问题需要自己获得原始数据。“数据决定机器学习结果的上限,而算法只是尽可能的逼近这个上限”,
3.特征工程
特征工程包括从原始数据中特征构建,特征提取,特征选择。特征工程做的好能发挥原始数据的最大效力,往往能够使得算法的效果和性能得到显著的提升,有时能使简单的模型的效果比复杂的模型效果好。数据挖掘的大部分时间就花在特征工程上面,是机器学习非常基础而又必备的步骤。数据预处理、数据清洗、筛选显著特征、摒弃非显著特征等等都非常重要。
4.训练模型、诊断、调优
模型诊断中至关重要的是判断过拟合、欠拟合,常见的方法是绘制学习曲线,交叉验证。通过增加训练的数据量、降低模型复杂度来降低过拟合的风险,提高特征的数量和质量、增加模型复杂来防止欠拟合。诊断后的模型需要进行进一步调优,调优后的新模型需要重新诊断,这是一个反复迭代不断逼近的过程,需要不断的尝试,进而达到最优的状态。
5.模型验证、误差分析
通过测试数据,验证模型的有效性,观察误差样本,分析误差产生的原因,往往能使得我们找到提升算法性能的突破点。误差分析主要是分析出误差来源与数据、特征、算法。
6.模型融合
提升算法的准确度主要方法是模型的前端(特征工程、清洗、预处理、采样)和后端的模型融合。在机器学习比赛中模型融合非常常见,基本都能使得效果有一定的提升。
7.上线运行
这一部分内容主要跟工程实现的相关性比较大。工程上是结果导向,模型在线上运行的效果直接决定模型的成败。 不单纯包括其准确程度、误差等情况,还包括其运行的速度(时间复杂度)、资源消耗程度(空间复杂度)、稳定性是否可接受。
三.K-近邻算法(KNN)
1、k-近邻算法原理
简单地说,K-近邻算法采用测量不同特征值之间的距离方法进行分类。
缺点:时间复杂度高、空间复杂度高。
适用数据范围:数值型和标称型。
工作原理
存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据 与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们 只选择样本数据集中前K个最相似的数据,这就是K-近邻算法中K的出处,通常K是不大于20的整数。 最后 ,选择K个最相似数据中出现次数最多的分类,作为新数据的分类。
回到前面电影分类的例子,使用K-近邻算法分类爱情片和动作片。有人曾经统计过很多电影的打斗镜头和接吻镜头,下图显示了6部电影的打斗和接吻次数。假如有一部未看过的电影,如何确定它是爱情片还是动作片呢?我们可以使用K-近邻算法来解决这个问题。
首先我们需要知道这个未知电影存在多少个打斗镜头和接吻镜头,上图中问号位置是该未知电影出现的镜头数图形化展示,具体数字参见下表。
即使不知道未知电影属于哪种类型,我们也可以通过某种方法计算出来。首先计算未知电影与样本集中其他电影的距离,如图所示。
现在我们得到了样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到K个距 离最近的电影。假定k=3,则三个最靠近的电影依次是California Man、He's Not Really into Dudes、Beautiful Woman。K-近邻算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。
欧几里得距离(Euclidean Distance
欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:
2、在scikit-learn库中使用k-近邻算法
Type Markdown and LaTeX: α2α2
一个最简单的例子
身高、体重、鞋子尺码数据对应性别
import numpy as np import pandas as pd from pandas import DataFrame,Series feature = np.array([[170,75,41],[166,65,38],[177,80,43],[179,80,43],[170,60,40],[160,55,38]]) target = np.array(['男','女','男','男','女','女']) from sklearn.neighbors import KNeighborsClassifier knn = KNeighborsClassifier(n_neighbors=3) knn.fit(feature,target) knn.score(feature,target) knn.predict(np.array([[176,71,38]]))
用于分类
导包,机器学习的算数KNN,数据蓝蝴蝶
import sklearn.datasets as datasets iris = datasets.load_iris() iris
提取样本数据
feature = iris['data'] target = iris['target']
将样本数据进行随机打乱
np.random.seed(1) np.random.shuffle(feature) np.random.seed(1) np.random.shuffle(target)
feature.shape
获取训练样本数据和测试样本数据
#训练数据 x_train = feature[:140] y_train = target[:140] #测试数据 x_test = feature[-10:] y_test =target[-10:]
实例化模型对象 训练模型
knn = KNeighborsClassifier(n_neighbors=10)
knn.fit(x_train,y_train)
knn.score(x_train,y_train)
print('预测分类:',knn.predict(x_test))
print('真实分类:',y_test)