机器学习-如何训练数据调整参数让准确率更高?

背景介绍

今天我要回顾并强化概念。为此,我们要进行两项探索首先,我们会编码一个基本管道进行监督学习。我会向大家展示多个分类器如何解决同一个问题。然后,我们要锐化直觉关于一个算法从数据中学习的真正含义,因为尽管听起来这很魔幻,实际上一点也不。为了扫平障碍,我们来看一个常见的你可能想要进行的实验。

想象你在建立一个垃圾邮件分类器。这仅仅是一个功能, 把刚收到的邮件标记为垃圾邮件或正常邮件。现在,你已经收集了一些数据,这已经为训练一个模型做好准备。但在使用它之前,首先需要回答一个问题:这个模型究竟可以做到多准确?如果用它来分类你的数据中没有的邮件。我们希望在使用它之前尽可能地确认模型工作正常。我们可以通过一个实验来帮助检验这一点。

一个办法是把已有的数据分成两部分。我们称之为训练数据和测试数据。我们用训练数据来训练我们的模型,使用测试数据来测试模型在新数据上运行的准确度。

这是一个常见的模式, 让我们来看看怎么用代码实现。为了扫除障碍, 我们从scikit中导入数据集。我们要再次用Iris, 它的数据已经包含其中 非常方便。

但我们之前没有见到的是我将两个术语称作特征x与标签y。为什么呢?这是因为看待分类器的一种方式是看成一种函数。在更高层面,你可以认为x是输入,y是输出。我们导入了数据集,第一步要做的就是把它分成训练数据和测试数据。为此,我们可以导入一个方便的实体,来看代码实现:

另外要注意的是, 尽管有各种类型的分类器在更高层次上, 它们拥有相似的接口。现在我们深入讲述从数据中学习意味着什么。之前,我说过特征x与标签y,它们是一个函数的输入和输出。

当然,函数是一种我们在编程中已经了解的东西。def classify--这就是函数。

正如我们在监督学习中了解的,我们并不想亲自去写上这些东西。我们想要一个算法来从训练数据中学习。所以学习一个函数是什么意思呢?函数仅仅是一种映射,从输入到输出值。这是一个函数,你之前可能看到过 y=mx+b。这是一条直线的方程,有两个参数:m代表斜率,b代表y轴截距。

给定这些参数,我们就可以画出不同x值的函数值。现在,在监督学习下,我们的分类函数也可能有一些参数,但输入x是一个要分类样本的特征输出y则是一个标签,像垃圾邮件、正常邮件,或者花的种类。

那么函数主体是什么样的呢?这部分就是我们要写的算法,或者说,学习算法。在这里,我们需要理解的重要一点,即我们并非从头开始从无到有得到函数主体。相反,我们从模型开始。你可以把模型当成一个原型用做定义我们函数主体的规则。一般的,一个模型具有参数,参数根据训练数据作调整。

关于这部分如何运行,来看这个高级的例子。我们来看一个玩具数据集,想想什么样的模型可以用作分类器。假设我们想要区分红点和绿点,有一些我已经画出来了。

为此,我们需要用到两种特征每个点的x轴和y轴坐标。现在考虑该如何区分这两种点。我们需要一个函数,当有一个新的没见过的点到来,可以区分它是红的还是绿的。

事实上,我们可能有很多的数据想要分类。这里我画了一些测试样本用浅红色和浅绿色。这些点并不存在于训练数据中。分类器也从没见过他们,那它是怎么预测出正确的标签呢?

想象我们可以以一种方式画一条线像这样穿过数据。

然后我们可以说线左侧的是绿的,右侧的是红的。这条线可以当成一个分类器。

所以我们怎么学习这条线呢?一个办法就是利用训练数据来调整模型的参数。而且我们认为使用的模型是一条简单的直线如之前所示。

也就是说我们有两个参数要调整:m和b。通过改变它们,我们可以改变直线所在的位置。

那么我们如何学习得到正确的参数呢?一个想法是通过迭代利用训练数据来调整得到。比如,初始时我们用一条随机的直线,然后用它来分类第一个训练数据。

如果是正确的,就不用改变直线,接着分类下一个训练数据。而相反,如果出错:

我们可以轻微地改变模型的参数使之更准确。这一点需格外注意。

看待学习的一种方式就是用训练数据调整模型的参数。

示例代码

上文中的实例代码块:

from sklearn import datasets
iris = datasets.load_iris()
x = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
x_train,x_test,y_train,y_test = train_test_split(x,y,test_size =.5)
from sklearn import tree
from sklearn.neighbors import KNeighborsClassifier
my_classifier = tree.DecisionTreeClassifier()
#my_classifier = KNeighborsClassifier()
my_classifier.fit(x_train,y_train)
predictions = my_classifier.predict(x_test)
print(predictions)
from sklearn.metrics import accuracy_score
print("DecisionTreeClassifier:",accuracy_score(y_test,predictions))

原文发布于微信公众号 - yale记(python_yale_learning)

原文发表时间:2019-08-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券