目录
1>理解监督学习
2>OpenCV中的监督学习
3>使用评分函数评估模型性能
1>理解监督学习
标签:
在简单线性回归中,标签是我们要预测的事物,即因变量y。标签可以是未来的房价、图片中显示的物种以及其他任何事物。
特征:
在简单线性回归中,特征是输入变量,即自变量X。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:
在垃圾邮件检测器的例子中,特征可能包括:
- 发件人的地址。
- 发送电子邮件的时段。
- 电子邮件文本中的字词。
监督学习的目标是要预测一些数据的标签或者目标值,故监督学习可以划分为两种形式:
- 分类:使用数据来预测类别的这些监督学习就叫作分类。比如:预测一张图像中是否包含一只狗或一只猫。在这里,数据的标签就是类别,只能是其中一类或者是另一类,而不可能是两类的混合结果。当只有两种选择时,就叫作二分类或者二值分类。当多于两类时,比如:预测第二天的天气,就叫作多类分类。
- 回归:使用数据预测真实值的这些监督学习就叫作回归。比如:当我们预测股票价值的时候,并不像预测股票的类别那样,回归的目标是尽可能准确地去预测目标值。
2>OpenCV中的监督学习
在OpenCV中构建一个机器学习模型总是遵照下面的逻辑:
- 初始化:通过名字调用模型来创建一个模型的空实例。
- 设置参数:如果模型需要一些参数,可以通过设值函数进行设置。
- 训练模型:每个模型必须提供一个叫作train的类函数,用于让模型拟合一些数据。
- 预测新的标签:每个模型必须提供一个叫作predict的类函数,用于让模型预测新数据的标签。
- 评估模型:每个模型必须提供一个叫作calcError的类函数,用于评估模型的性能。
3>使用评分函数评估模型性能
在二值分类的任务中,有几种不同的方法来评估分类的效果,一些常见的指标如下所示:
- 准确率(accuracy_score):正例和负例中预测正确的数量占总数量的比例。比如:在把图片分为猫或者狗的类别时,准确率表示的就是那些被正确分为包含猫或者狗的图片的比例。
- 精确率(precision_score):预测为正例的样本中预测正确的比例。比如:在所有预测包含猫的图片中,真正包含猫的图片的比例。
- 召回率(recall_score):实际为正例的样本中预测正确的比例。比如:在所有实际包含猫的图片中,已经被正确识别为猫的图片的比例。
打开一个新的IPython会话:
ipython
用一些只包含0或者1的类标签来模拟,首先,把随机数生成器的种子设置为固定值:
import numpy as np
np.random.seed(42)
通过在0~(2-1)的范围内随机取整数的方式,生成5个不是0就是1的随机标签:
y_true=np.random.randint(0, 2, size=5)
y_true
#结果:array([0, 1, 0, 0, 0])
假设有一个尝试预测类标签的分类器,为了方便说明,我们假设这个分类器并不准确,并且总是预测标签1:
y_pred=np.ones(5, dtype=np.int32)
y_pred
#结果:array([1, 1, 1, 1, 1])
计算准确率(两种方法):
np.sum(y_true==y_pred)/len(y_true)
#结果:0.2
from sklearn import metrics
metrics.accuracy_score(y_true, y_pred)
#结果:0.2
混淆矩阵:
预测结果(True/False) | 真实情况 | ||
正例(Positive) | 负例(Negative) | ||
正例 | TP(真正例) | FN(假负例) | |
负例 | FP(假正例) | TN(真负例) |
计算TP(真正例,即我们预测为1,标签也为1):
true_a_positive=(y_true==1)
pred_a_positive=(y_pred==1)
true_positive=np.sum(pred_a_positive*true_a_positive)
true_positive
#结果:1
计算TN(真负例,即我们预测为0,标签也为0):
true_negative=np.sum((y_pred==0)*(y_true==0))
true_negative
#结果:0
false_positive=np.sum((y_pred==1)*(y_true==0))
false_positive
#结果:4
计算FN(假负例,即我们预测为0,但标签为1):
false_negative=np.sum((y_pred==0)*(y_true==1))
false_negative
#结果:0
为确保没有出错,再计算一次准确率:
accuracy=(true_positive+true_negative)/len(y_true)
accuracy
#结果:0.2
计算精确率:
precision=true_positive/(true_positive+false_positive)
precision
#结果:0.2
用scikit-learn来检查我们的数学结果:
metrics.precision_score(y_true, y_pred)
#结果:0.2
计算召回率:
recall=true_positive/(true_positive+false_negative)
recall
#结果:1.0
用scikit-learn来检查我们的数学结果:
metrics.recall_score(y_true, y_pred)
#结果:1.0
使用均方误差、可释方差和R方值的相关评分函数对回归器评分:
- mean_squared_error(均方误差):各数据预测值与真实值之差的平方和的平均数,均方误差的值越接近0,表示预测值与真实值的分散分布程度越相近。
- explained_variance_score(可释方差):可释方差的值越接近1,表示预测值与真实值的分散分布程度越相近。
- r2_score(R方值):
也被称作决定系数,决定系数越接近1,表示预测值与真实值的分散分布程度越相近。
创建另一个模拟数据集,在x坐标轴上创建一个从0到10的线性空间,以及100个采样点:
x=np.linspace(0, 10, 100)
真实的数据总是会包含噪声,为了遵照这一事实,我们在目标值y_true上添加噪声,该操作通过在sin函数上添加噪声来实现:
y_true=np.sin(x)+np.random.rand(x.size)-0.5
这里使用NumPy中的rand函数来添加[0,1)范围内的噪声,并减去0.5,让噪声以0为中心。
预测y值:
y_pred=np.sin(x)
使用Matplotlib对它进行可视化处理:
import matplotlib.pyplot as plt
plt.style.use('ggplot')
%matplotlib
plt.plot(x, y_pred, linewidth=4, label='model')
plt.plot(x, y_true, 'o', label='data')
plt.xlabel('x')
plt.ylabel('y')
plt.legend(loc='lower left')
使用均方误差来判定模型的好坏:
mse=np.mean((y_true-y_pred)**2)
mse
#结果:0.08531839480842378
用scikit-learn来检查我们的数学结果:
metrics.mean_squared_error(y_true, y_pred)
#结果:0.08531839480842378
使用可释方差来判定模型的好坏:
fvu=np.var(y_true-y_pred)/np.var(y_true)
fvu
#结果:0.163970326266295
fve=1.0-fvu
fve
#结果:0.836029673733705
用scikit-learn来检查我们的数学结果:
metrics.explained_variance_score(y_true, y_pred)
#结果:0.08531839480842378
使用决定系数来判定模型的好坏:
r2=1.0-mse/np.var(y_true)
r2
#结果:0.8358169419264746
用scikit-learn来检查我们的数学结果:
metrics.r2_score(y_true, y_pred)
#结果:0.8358169419264746
不以x的值为基础而预测y的值的常数模型,其值总是为0:
metrics.r2_score(y_true, np.mean(y_true)*np.ones_like(y_true))
#结果:0.0
最后
以上就是怕黑彩虹最近收集整理的关于监督学习入门的全部内容,更多相关监督学习入门内容请搜索靠谱客的其他文章。
发表评论 取消回复