机器学习
何为机器学习
人能通过以往的学习经验知道,下足了功夫、弄清楚概念、做足了功课、自然就会取得好成绩,这是因为我们人能够做出有效的预测,是因为我们已经积累的许多经验,而通过经验的利用,就能通过对新情况做出有效的决策。同样的机器学习就是利用计算机来实现对经验的利用,对新的情况做出有效的决策。
机器学习致力于研究如何人通过计算的手段;利用经验来改善系统自身的性能。在计算机系统中,”经验“通常以”数据“形式存在,因此机器学习所研究的主要内容,是在关于在计算机上从数据上从数据中产生”模型“(model)的算法,即为”学习算法“(learning algorithm),有了学习算法,我们把经验数据提供给TA,TA就能基于这些数据产生模型;在面对新的情况时,模型就会给我们提供相应的判断。
进行机器学习,需要先有”经验“,即数据,假设我们采集好了一堆关于树叶的数据,如形状,大小,厚度,颜色等等,这组数据的集合称为“数据集”(data set),其中每条记录是关于一个事件或是对象(一片树叶)的描述,称为一个”示例”(instance)或“样本”(sample),反映事件或对象在某方面的表现或性质的事项,如”颜色”,“材质”,“大小”称为“属性”(attribute)或“特征”(feature);属性上的取取值称为“属性空间”(attribute space)、样本空间(sample value)或输入空间。
例如我们把”颜色”,“材质”,“大小”量化,作为三个坐标轴,则它们张成一个描述树叶的三维空间,每一片树叶都可以在这个空间找到自己对应的坐标轴,因空间中的每一个点对应一个坐标向量,因此我们也把一个示例称为一个“特征向量”(feature vector)
实现机器学习主要流程
数据采集和标记
在数据采集阶段,需要收集尽量多的特征的,特征越多,数据越多,训练出来的模型才会越准确。
如在房价评估系统中,我们需要最真实的交易价格,因此我们采集了房子的实际成交价格,这一过程称为数据标记,标记可以是人工标记,也可以是自动标记,如通过分析数据,找出房产评估中心给的房子评估价格和真实成交价格匹配关系,直接算出来。数据标记对有监督算法是必须的。
模型训练和测试
把数据集分成训练集和测试集(一般按照8:2或7:3来划分),然后用训练集来训练模型,训练出参数后再使用测试集来测试准确度。目的是为了测试模型的准确性,用新的、‘没见过’的数据测试。
[理论上更为合理是划分成3个,多一个交叉验证集]
模型选择
房价评估系统是属于有监督学习的回归学习类型,我们可选择最简单的线性方程来模拟,选择哪个模型,问题领域,数据量大小,训练时长,模型的准确度等多方面有关。
模型性能评估和优化
模型出来后需要对机器学习的算法模型进行评估。性能评估包括很多方面
训练时长 是指花费多少时间来训练这个模型。
训练数据量,一般对于复杂特征的系统,训练数据集越大越好。然后还需判断模型的准确性,即对一个新的数据能否准确的预测【泛化能力】.最后需要判断模型能否满足应用场景的性能要求,如不能满足则需要优化,然后继续训练和评估,或更换为其他模型。
模型使用
训练出来的模型可以把参数保存下来,下次使用时直接加载即可。一般来讲,模型训练需要的计算量是很大的,也需要较长的时间来训练,这是因为一个好的的模型参数,需要对大型数据集进行训练后才能得到。而真正使用模型时,其计算量是比较少的,一般是直接把新样本作为输入,然后调用模型即可得出预测结果。
过拟合和欠拟合
过拟合 是指模型能够很好的拟合训练样本,但对新数据的预测准确性很差。 欠拟合 是指模型不能很好的拟合训练样本,且对新数据的预测准确性也不好。
import numpy as np
n_dots = 20
x = np.linspace(0, 1, n_dots) # [0,1]之间创建20个点
y = np.sqrt(x) + 0.2 * np.random.rand(n_dots) - 0.1
训练样本是
其中r是[-0.1,0.1]之间的一个随机数。
然后分别用一阶多项式、三阶多项式和十阶多项式3个模型来拟合这个数据集,得到的结果如图000所示
Tip:图中的点是我们生成的20个训练样本;虚线中实际的模型
实线是用训练样本拟合出来的模型。
![这里写图片描述](https://i-blog.csdnimg.cn/blog_migrate/82c5a735a1a870e59a1e6723d788f114.png)
在图中左边是欠拟合(underfitting),也称为高偏差(high bias),因为我们尝试用一条线来拟合样本数据。右边是过拟合(overfitting),也称高方差(high variance),用来十阶多项式来拟合数据,虽然模型对现有的数据集拟合得很好,但对新数据预测误差却很大。只有中间的模型较好的拟合了数据集,可以看出虚线和实现基本拟合。
通过例子是为了读者理解过拟合(高方差)和欠拟合(高偏差)。
完整实现代码:
import matplotlib.pyplot as plt
import numpy as np
n_dots = 20
# [0, 1] 之间创建 20 个点
x = np.linspace(0, 1, n_dots)
y = np.sqrt(x) + 0.2*np.random.rand(n_dots) - 0.1;
def plot_polynomial_fit(x, y, order):
p = np.poly1d(np.polyfit(x, y, order))
# 画出拟合出来的多项式所表达的曲线以及原始的点
t = np.linspace(0, 1, 200)
plt.plot(x, y, 'ro', t, p(t), '-', t, np.sqrt(t), 'r--')
return p
plt.figure(figsize=(18, 4), dpi=200)
titles = ['Under Fitting', 'Fitting', 'Over Fitting']
models = [None, None, None]
for index, order in enumerate([1, 3, 10]):
plt.subplot(1, 3, index + 1)
models[index] = plot_polynomial_fit(x, y, order)
plt.title(titles[index], fontsize=20)
plt.show()
文中代码大量采用了
《机器学习》 -周志华
《scikit-learn机器学习:常用算法原理编程实战及》
代码和例子,请有条件的同学可自行购书支持哦。