机器学习应用——监督学习(上)(实例:人体运动状态预测&人体运动状态预测&房价与房屋尺寸关系的线性拟合与非线性拟合&交通流量预测)

前言

机器学习应用博客中,将核心介绍三大类学习,即:无监督学习、监督学习、强化学习。

本篇将简要介绍:
1.监督学习概念(最常应用场景:分类和回归)
2.分类——k近邻分类器、决策树、朴素贝叶斯(人体运动状态预测)、SVM(人体运动状态预测)
3.回归——线性回归(Linear Regression)(房价与房屋尺寸关系的线性拟合);多项式回归(Polynomial Regression)(房价与房屋尺寸的非线性拟合);岭回归(ridge regression)(交通流量预测)

一、监督学习

1.监督学习的目标

①利用一组带有标签的数据,学习从输入到输出的映射,然后将这种映射关系应用到未知数据上,达到分类或回归的目的
②分类:当输出是离散的,学习任务为分类任务
③回归:当输出是连续的,学习任务为回归任务

2.分类学习

(1)输入输出
①输入:一组有标签的训练数据(也称观察和评估),标签表明了这些数据(观察)的所属类别
②输出:分类模型根据这些训练数据,训练自己的模型参数,学习出一个适合这组数据的分类器,当有新数据(非训练数据)需要进行类别判断,就可以将这组新数据作为输人送给学好的分类器进行判断。

(2)分类学习–评价
1)训练集(training set):顾名思义用来训练模型的已标注数据,用来建立模型,发现规律
2)测试集(testing set):也是已标注数据,通常做法是将标注隐藏,输送给训练好的模型,通过结果与真实标注进行对比,评估模型的学习能力
3)训练集/测试集的划分方法:根据已有标注数据,随机选出一部分(70%)数据作为训练数据,余下的作为测试数据,此外还有交叉验证法,自助法用来评估分类模型。

(3)分类学习–评价标准

1)精确率:精确率是针对我们预测结果而言的,(以二分类为例)它表示的是预测为正的样本中有多少是真正的正样本。那么预测为正就有两种可能了,一种就是把正类预测为正类(TP),另一种就是把负类预测为正类(FP)。
P = TP/(TP+FP)

2)召回率:是针对我们原来的样本而言的,它表示的是样本中的正例有多少被预测正确了。那也有两种可能,一种是把原来的正类预测成正类(TP),另一种就是把原来的正类预测为负类(FN)。
R = TP/(TP+FN)

(4)举例
①我们手上有60个正样本,40个负样本,我们要找出所有的正样本,分类算法查找出50个,其中只有40个是真正的正样本
②TP:将正类预测为正类数40;FN:将正类预测为负类数20;FP:将负类预测为正类数10;TN:将负类预测为负类数30。
③准确率(accuracy)=预测对的/所有 = (TP+TN)/(TP+TN+FN+FP) = 70%

(5)Sklearn vs. 分类
①与聚类算法被统一封装在sklearn.cluster模块不同,sklearn库中的分类算法并未被统一封装在一个子模块中,因此对分类算法的import方式各有不同。

②sklearn提供的分类函数
1)k近邻(knn)
2)朴素贝叶斯(naivebayes)
3)支持向量机(svm)
4)决策树(decision tree)
5)神经网络模型(Neural networks)
其中有线性分类器,也有非线性分类器

(6)分类算法的应用
①金融:贷款是否批准进行评估
②医疗诊断:判断一个肿瘤是恶性还是良性
③欺诈检测:判断一笔银行的交易是否涉嫌欺诈
④网页分类:判断网页的所属类别,财经或者是娱乐?

3.回归分析

(1)定义
①回归:统计学分析数据的方法,目的在于了解两个或多个变数间是否相关、研究其相关方向与强度,并建立数学模型以便观察特定变数来预测研究者感兴趣的变数。

②回归分析可以帮助人们了解在自变量变化时因变量的变化量。一般来说,通过回归分析我们可以由给出的自变量估计因变量的条件期望。

(2)Sklearn vs. 回归

①Sklearn提供的回归函数主要被封装在两个子模块中,分别是sklearn.linear_model和sklearn.preprocessing。sklearn.linear_modlel封装的是一些线性函数。

②线性回归函数
1)普通线性回归函数(LinearRegression)
2)岭回归(Ridge)
3)Lasso(Lasso)

③非线性回归函数:多项式回归则通过调用sklearn.preprocessing子模块进行拟合。

(3)回归应用
①回归方法适合对一些带有时序信息的数据进行预测或者趋势拟合,常用在金融及其他涉及时间序列分析的领域。
②股票趋势预测
③交通流量预测

二、分类

1.人体运动状态预测–实例分析

(1)背景介绍
①可穿戴式设备的流行,让我们可以更便利地使用传感器获取人体的各项数据,甚至生理数据。
②当传感器采集到大量数据后,我们就可以通过对数据进行分析和建模,通过各项特征的数值进行用户状态的判断,根据用户所处的状态提供给用户更加精准、便利的服务。

(2)数据介绍
①我们现在收集了来自A,B,C,D,E5位用户的可穿戴设备上的传感器数据,每位用户的数据集包含一个特征文件(a.feature)和一个标签文件(a.label)。
②特征文件中每一行对应一个时刻的所有传感器数值,标签文件中每行记录了和特征文件中对应时刻的标记过的用户姿态,两个文件的行数相同,相同行之间互相对应。

(3)数据构成
①特征文件共包含41列特征,数据内容如下图。
在这里插入图片描述

②数据文件的各项特征
1)第一列:记录的时间戳
2)第二列:用户心率
3)3-15、16-28、29-41列:分别为3个姿态传感器的数据
4)文件中的问号代表缺失值

③传感器1的数据特征
在这里插入图片描述
1项温度数据、3项一型三轴加速度数据、3项二型三轴加速度数据、3面三轴陀螺仪数据和3项三轴磁场数据。

(4)数据详解
①人体的温度数据可以反映当前活动的剧烈程度,一般在静止状态时,体温趋于稳定在36.5度上下;当温度高于37度时,可能是进行短时间的剧烈运动,比如跑步和骑行。

②在数据中有两个型号的加速度传感器,可以通过互相印证的方式,保证数据的完整性和准确性。通过加速度传感器对应的三个数值,可以知道空间中x、y、z三个轴上对应的加速度,而空间上的加速度和用户的姿态有密切的关系,比如用户向上起跳时,z轴上的加速度会激增。

③陀螺仪是角运动检测的常用仪器,可以判断出用户佩戴传感器时的身体角度是水平、倾斜还是垂直。直观地,通过这些数值都是推断姿态的重要指标。

④磁场传感器可以检测用户周围的磁场强度和数值大小,这些数据可以帮助我们理解用户所处的环境。比如在一个办公场所,用户座位附近的磁场是大体上固定的,当磁场发生改变时,我们可以推断用户的位置和场景发生了变化。

(5)标签文件的介绍
①标签文件内容如图所示,每一行代表与特征文件中对应行的用户姿态类别。总共有0-24共25种身体姿态,如,无活动状态,坐态、跑态等。
②标签文件作为训练集的标准参考准则,可以进行特征的监督学习。
在这里插入图片描述
(6)任务介绍
①假设现在出现了一个新用户,但我们只有传感器采集的数据,那么该如何得到这个新用户的姿态呢?
②又或者对同一用户如果传感器采集了新的数据,怎么样根据新的数据判断当前用户处于什么样的姿态呢?
③在明确这是一个分类问题的情况下,我们可以选定某种分类模型(或者说是算法),通过使用训练数据进行模型学习,然后对每个测试样本给出对应的分类结果。

(7)机器学习的分类算法众多,在接下来的学习中我们将会详细介绍经典的分类算法,如K近邻、决策树和朴素贝叶斯的原理和实现。

2.基本分类模型——k近邻分类器

(1)k近邻分类器
①KNN:通过计算待分类数据点,与已有数据集中的所有数据点的距离。取距离最小的前K个点,根据“少数服从多数”的原则,将这个数据点划分为出现次数最多的那个类别。
②sklearn中的K近邻分类器:在sklearn库中,可使用sklearn.neighbors.KNeighborsClassifier创建一个K近邻分类器

主要参数:
1)n_neighbbors:用于指定分类器中K的大小(默认值Wie5,注意与kmeans的区别)
2)weights:设置选中的K个点对分类结果影响的权重(默认值为平均权重“uniform",可以选择distance代表越近的点权重越高,或者传入自己编写的以距离为参数的权重计算函数)

3)algorithm:设置用于计算临近点的方法,因为当数据量很大的情况下计算当前点和所有点的距离再选出最近的k各点,这个计算量是很费时的,所以选项中有ball_tree、kd_tree和brute,分别代表不同的寻找邻居的优化算法,默认值为auto,根据训练数据自动选择。

(2)K近邻分类器的使用

①创建一组数据X和它对应的标签y
X = [[0],[1],[2],[3]]
y = [0,0,1,1]

②使用import语句导入K近邻分类器
from sklearn.neighbors import KNeighborsClassifier

③参数n neighbors设置为3,即使用最近的3个邻居作为分类的依据,其他参数保持默认值,并将创建好的实例赋给变量neigh。
neigh = KNeighborsClassifier(n_neighbors=3)

④调用fit()函数,将训练数据X和标签y送入分类器进行学习
neigh.fix(X,y)

⑤调用predict(函数,对未知分类样本[1.1]分类,可以直接并将需要分类的数据构造为数组形式作为参数传入,得到分类标签作为返回值。
print(neigh.predict([[1,1]]))

⑥样例输出值是0,表示K近邻分类器通过计算样本[1.1]与训练数据的距离,取0,1,2这3个邻居作为依据,根据“投票法”最终将样本分为类别0。

from sklearn.neighbors import KNeighborsClassifier
X = [[0],[1],[2],[3]]
y = [0,0,1,1]
neigh = KNeighborsClassifier(n_neighbors=3)
neigh.fit(X,y)
print(neigh.predict([[1.1]]))

(3)KNN的使用经验
①在实际使用时,我们可以使用所有训练数据构成特征X和标签y,使用fit(函数进行训练。
②在正式分类时,通过—次性构造测试集或者一个一个输人样本的方式,得到样本对应的分类结果。
③有关K的取值:
1)如果较大,相当于使用较大邻域中的训练实例进行预测,可以减小估计误差,但是距离较远的样本也会对预测起作用,导致预测错误。
2)相反地,如果K较小,相当于使用较小的邻域进行预测,如果邻居恰好是噪声点,会导致过拟合。
3)—般情况下,K会倾向选取较小的值,并使用交叉验证法选取最优K值。

3.基本分类模型——决策树

(1)决策树
①决策树是一种树形结构的分类器,通过顺序询问分类点的属性决定分类点最终的类别。
②通常根据特征的信息增益或其他指标,构建一颗决策树。
③在分类时,只需要按照决策树中的结点依次进行判断,即可得到样本所属类别。
④举例:例如,根据下图这个构造好的分类决策树,一个无房产,单身,年收入55K的人的会被归人无法偿还信用卡这个类
在这里插入图片描述

(2)sklearn中的决策树
①在sklearn库中,可使用sklearn.tree.DecisionTreeClassifier创建一个决策树用于分类
②主要参数
1)criterion:用于选择属性的准则,可传入“gini”代表基尼系数,或者entropy代表信息增益
2)max_features:表示在决策树结点进行分裂时,从多少个特征中选择最优特征。可以设定固定数目、百分比或其他标准。它的默认值是使用所有特征个数。

(3)决策树的使用
①决策树本质上是寻找一种对特征空间上的划分,旨在构建一个训练数据拟合的好,并且复杂度小的决策树。
②实际使用中,需要根据数据情况,调整DecisionTreeClassifier类中传入的参数,比如选择合适的criterion,设置随机变量等。

# 导入sklearn内嵌的鸢尾花数据集
from sklearn.datasets import load_iris

# 使用import语句导入决策树分类器,同时导入计算交叉验证值的函数cross_val score
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score

# 使用默认参数,创建一颗基于基尼系数的决策树,并将该决策树分类器赋值给变量clf
clf = DecisionTreeClassifier()

# 将鸢尾花数据赋值给变量iris
iris = load_iris()

# 将决策树分类器做为待评估的模型,iris.data鸢尾花数据做为特征,iris.target鸢尾 花分类标签做为目标结果,通过设定cv为10,使用10折交叉验证。得到最终的交叉验证得分
cross_val_score(clf,iris.data,iris.target,cv=10)

# 可以仿照之前K近邻分类器的使用方法,利用fit()函数训练模型并使用predict()函数预测
# clf.fit(X,y)
# clf.predict(x)

4.基本分类模型——朴素贝叶斯

(1)朴素贝叶斯
①朴素贝叶斯分类器是一个以贝叶斯定理为基础的多分类的分类器。
②对于给定数据,首先基于特征的条件独立性假设,学习输入输出的联合概率分布,然后基于此模型,对给定的输入x,利用贝叶斯定理求出后验概率最大的输出y。
在这里插入图片描述

(2)sklearn中的朴素贝叶斯
①在sklearn库中,实现了三个朴素贝叶斯分类器
在这里插入图片描述
②区别在于假设某一特征的所有属于某个类别的观测值符合特定分布
③如分类问题的特征包括人的身高,身高符合高斯分布,则这类问题适合高斯朴素贝叶斯
④在sklearn库中,可使用sklearn.naive.bayes.GaussianNB创建一个高斯朴素贝叶斯分类器
⑤参数
priors:给定各个类别的先验概率。如果为空,则按训练数据的实际情况进行统计;如果给定先验概率,则在训练过程中不能更改。

(3)朴素贝叶斯的使用

①朴素贝叶斯是典型的生成学习方法,由训练数据学习联合概率分布,并求得后验概率分布。
②朴素贝叶斯一般在小规模数据上的表现很好,适合进行多分类任务。

# 导入numpy库,并构造训练数据X和y
import numpy as np
X = np.array([[-1,-1],[-2,-1],[-3,-2],[1,1],[2,1],[3,2]])
Y = np.array([1,1,1
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

柠檬茶@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值