背景介绍
今天我要回顾并强化概念。为此,我们要进行两项探索首先,我们会编码一个基本管道进行监督学习。我会向大家展示多个分类器如何解决同一个问题。然后,我们要锐化直觉关于一个算法从数据中学习的真正含义,因为尽管听起来这很魔幻,实际上一点也不。为了扫平障碍,我们来看一个常见的你可能想要进行的实验。
想象你在建立一个垃圾邮件分类器。这仅仅是一个功能, 把刚收到的邮件标记为垃圾邮件或正常邮件。现在,你已经收集了一些数据,这已经为训练一个模型做好准备。但在使用它之前,首先需要回答一个问题:这个模型究竟可以做到多准确?如果用它来分类你的数据中没有的邮件。我们希望在使用它之前尽可能地确认模型工作正常。我们可以通过一个实验来帮助检验这一点。
一个办法是把已有的数据分成两部分。我们称之为训练数据和测试数据。我们用训练数据来训练我们的模型,使用测试数据来测试模型在新数据上运行的准确度。
这是一个常见的模式, 让我们来看看怎么用代码实现。为了扫除障碍, 我们从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))