一、问题引入
1.首先明确几个概念目前三大最常见的机器学习任务:
1.回归问题
2.分类问题
3.聚类问题
Machine learning机器学习是Artificial inteligence的核心,分为四类:
1、Supervised learning监督学习
是有特征(feature)和标签(label)的,即便是没有标签的,机器也是可以通过特征和标签之间的关系,判断出标签。举例子理解:高考试题是在考试前就有标准答案的,在学习和做题的过程中,可以对照答案,分析问题找出方法。在高考题没有给出答案的时候,也是可以给出正确的解决。这就是监督学习。
一句话概括:给定数据,预测标签。
通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出,例如分类。
2、Unsupervised learning无监督学习
只有特征,没有标签。举例子理解:高考前的一些模拟试卷,是没有标准答案的,也就是没有参照是对还是错,但是我们还是可以根据这些问题之间的联系将语文、数学、英语分开,这个过程就叫做聚类。在只有特征,没有标签的训练数据集中,通过数据之间的内在联系和相似性将他们分成若干类。
一句话概括:给定数据,寻找隐藏的结构。
直接对数据集建模。
以上两者的区别:监督学习只利用标记的样本集进行学习,而无监督学习只利用未标记的样本集。
3、Semi-Supervised learning半监督学习
使用的数据,一部分是标记过的,而大部分是没有标记的。和监督学习相比较,半监督学习的成本较低,但是又能达到较高的准确度。
综合利用有类标的和没有类标的数据,来生成合适的分类函数。
半监督学习出现的背景:实际问题中,通常只有少量的有标记的数据,因为对数据进行标记的代价有时很高,比如在生物学中,对某种蛋白质的结构分析或者功能鉴定,可能会花上生物学家很多年的工作,而大量的未标记的数据却很容易得到。
4、Reinforcement learning强化学习
强化学习也是使用未标记的数据,但是可以通过一些方法知道你是离正确答案越来越近还是越来越远(奖惩函数)。可以把奖惩函数看作正确答案的一个延迟、稀疏的形式。可以得到一个延迟的反馈,并且只有提示你是离答案越来越近还是越来越远。
2.回归问题
通过已有的一部分输入数据与输出数据之间的对应关系,生成一个函数,将输入映射到合适的输出。
我们通过这组数据,可以得到房屋大小与房价之间的一个关系:
这条蓝色的线就表示了这样一种关系,我们现在的问题就是找出这样一条线,使其能拟合我们的数据。
注:拟合:能最大程度的表现现有数据的规律
所以现在我们的问题就变成了:(从最开始的预测房价变为了纯数学问题)
注:成本函数:(均方误差)误差求和求平均,此处1/2m是为了后续计算的方便。
接下来的问题是:如何找到这样的Θ0,Θ1,使得损失函数J(Θ0,Θ1)最小呢?
接下来通过样本集的数据计算损失函数:
计算损失函数:J(Θ0,Θ1)=2.3
确定一个点(0,2.3)
计算损失函数:J(Θ0,Θ1)=0
确定一个点(1,0)
计算损失函数:J(Θ0,Θ1)=0.58
确定一个点(1.5,0.58)
函数图像:是类似于最低点是(1,0)点的开口向上的一元二次函数图像。(这里就不画了)
类似于:
我们通过不停的计算Θ0,Θ1,求得最小的J(Θ0,Θ1),显然这样的计算工作是巨大的,这就需要用到梯度下降法了:
从图上来看:
我们模拟一下:想象自己在山顶,想要最快下山(应该朝哪个方向,迈多大的步子,每迈一步,继续做同样的判断),这就是梯度下降法要做的事情。
这每一步,在二维平面上看就像这样:
直到找到这样一个最低点,就是局部最优解,或最优解。
那么,我们在遇到一个线性回归问题时,是不是需要我们每次都写一个预测函数,再定义一个损失函数,最后再实现梯度下降算法呢?并不是这样的,Python中有一个sklearn包都已经封装好了这些常用的机器学习算法,我们只需要用就好了。
二、代码演示
接下来我们用sklearn实现一下这个案例:
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
#此处x是房屋面积,y是房价,我们简化了数据,我们有真实的数据,直接替换就好了
x=np.array([1,2,3,4])
y=np.array([4,6,10,16])
from sklearn.linear_model import LinearRegression
# 创建一个线性回归模型
model=LinearRegression()
# 对数据做一个变换(sklearn包的要求)
# reshape(-1,1)数据变为一列,reshape(1,-1)数据变为一行
x=x.reshape(-1,1)
y=y.reshape(-1,1)
# 训练模型
model.fit(x,y)
# 该线性回归模型的训练得分(可以理解为该模型在数据集上的一个准确率)
train_score=model.score(x,y)
# 绘画散点图
plt.scatter(x,y)
plt.plot(x,model.predict(x),'r-')
#模型的训练得分,可以理解为该模型在数据集上的一个准确率
train_score
0.9523809523809523
在机器学习中我们训练模型后,需要把模型保存到本地,这里我们采用joblib来保存
from sklearn.externals import joblib
#保存模型
joblib.dump()
#加载模型
joblib.load()
#通过该模型继续预测
model.predict()