前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >机器学习-如何训练数据调整参数让准确率更高?

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

作者头像
XXXX-user
发布2019-09-04 15:24:38
1.6K0
发布2019-09-04 15:24:38
举报
文章被收录于专栏:不仅仅是python不仅仅是python

背景介绍

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

示例代码

上文中的实例代码块:

代码语言:javascript
复制
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))

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-08-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 yale记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景介绍
    • 示例代码
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档