监督学习入门

目录

1>理解监督学习

2>OpenCV中的监督学习

3>使用评分函数评估模型性能


1>理解监督学习

标签:

在简单线性回归中,标签是我们要预测的事物,即因变量y。标签可以是未来的房价、图片中显示的物种以及其他任何事物。

特征:

在简单线性回归中,特征是输入变量,即自变量X。简单的机器学习项目可能会使用单个特征,而比较复杂的机器学习项目可能会使用数百万个特征,按如下方式指定:

\left \{ X_{1},X_{2},...,X_{n} \right \}

在垃圾邮件检测器的例子中,特征可能包括:

  • 发件人的地址。
  • 发送电子邮件的时段。
  • 电子邮件文本中的字词。

监督学习的目标是要预测一些数据的标签或者目标值,故监督学习可以划分为两种形式:

  • 分类:使用数据来预测类别的这些监督学习就叫作分类。比如:预测一张图像中是否包含一只狗或一只猫。在这里,数据的标签就是类别,只能是其中一类或者是另一类,而不可能是两类的混合结果。当只有两种选择时,就叫作二分类或者二值分类。当多于两类时,比如:预测第二天的天气,就叫作多类分类。
  • 回归:使用数据预测真实值的这些监督学习就叫作回归。比如:当我们预测股票价值的时候,并不像预测股票的类别那样,回归的目标是尽可能准确地去预测目标值。

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
计算FP(假正例,即我们预测为1,但标签为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=\frac{TP+TN}{TP+TN+FP+FN}

accuracy=(true_positive+true_negative)/len(y_true)
accuracy
#结果:0.2

计算精确率:

Precision=\frac{TP}{TP+FP}

precision=true_positive/(true_positive+false_positive)
precision
#结果:0.2

用scikit-learn来检查我们的数学结果:

metrics.precision_score(y_true, y_pred)
#结果:0.2

计算召回率:

Recall=\frac{TP}{TP+FN}

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,表示预测值与真实值的分散分布程度越相近。

MSE=\frac{1}{n}\sum_{i=1}^{n} \left ( y_{i} - \hat{y_{i}}\right )

  • explained_variance_score(可释方差):可释方差的值越接近1,表示预测值与真实值的分散分布程度越相近。
  • r2_score(R方值)R^{2}也被称作决定系数,决定系数越接近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的值的常数模型,其R^{2}值总是为0:

metrics.r2_score(y_true, np.mean(y_true)*np.ones_like(y_true))
#结果:0.0
  • 7
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

真的想不出名字

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

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

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

打赏作者

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

抵扣说明:

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

余额充值