您好、欢迎来到现金彩票网!
当前位置:红彩会 > 分类器 >

用Sklearn创建ML分类器模型不用数学公式也可以

发布时间:2019-05-06 04:40 来源:未知 编辑:admin

  雷克大会(2017机器人与人工智能大会)即将于2017年6月21日在北京新云南皇冠假日酒店召开,活动报名渠道全面开启,报名参会请点击活动行链接

  「机器人圈」导览:如果你对机器学习感兴趣,你一定不要错过此文,作者以一个生动的例子,详细阐述了Sklearn在创建分类器中的作用。文章编译自作者是Kasper Fredenslund,文章略长,时长大约15分钟,请耐心阅读。

  如果你热爱机器学习,但是你又不知道该从何入手,也许你已经阅读了一些理论,掌握了一定的基础知识,可是你并不知道该如何将你学到的理论付诸实践。

  本教程的出发点就是助你“破冰”,引导你完成从导入和分析数据集到实施和训练几种不同的知名分类算法,并评估其性能的完整过程。

  我将使用最小量的离散数学,旨在使用直觉来表达细节,使用生动具体的例子而不是密集的数学公式来传达思想。如果你想知道为什么,可以查看详情。

  我们将使用你可以从Kaggle下载的鸢尾花数据集(Iris flower dataset),根据其萼片和花瓣特征对花种进行分类。

  也许你没有听说过Kaggle,那我来介绍一下,Kaggle拥有大量酷炫的数据集,是数据科学家分享他们研究成果的地方,对于初学者来说,这可是学习时可能用到的宝贵资源。

  鸢尾花数据集相当小(仅由150个均匀分布的样本组成),而且表现良好,从而使其成为该项目的理想选择。

  你可能会问,为什么使用这个毫无意义的数据集,而放弃其他那些有趣的数据集?原因是当我们学习数据分析时,使用简单,表现良好的数据可以减少认知负荷,使我们能够更好地理解我们正在使用的数据,从而使调试变得更容易。

  一旦我们下载了数据,我们首先要做的就是加载它并检查其结构。为此,我们将使用pandas。

  Pandas是一个python库,为我们提供了一个称为DataFrame的数据处理通用接口。DataFrames本质上是具有行和列的excel电子表格,但是它没有UI excel那么花哨。相反,我们以编程方式进行所有数据操作。

  除此之外,Pandas还具有附加的优点,从而使其可以以超级简单的方式导入数据,因为它支持许多不同的格式,包括excel电子表格、csv文件,甚至HTML文档。

  <(ggplot) # make plots look better

  导入我们要使用的库之后,我们现在可以使用pandas中的read_csv()方法来读取数据文件。

  Pandas自动地将第一行解释为列标题。如果你的数据集没有指定第一行中的列标题,则可以将参数header=None传递给read_csv()函数,以将整个文档解释为数据。或者,你还可以传递列名称作为header参数。

  要确认pandas已经正确读取csv文件,我们可以调用df.head()来显示前五行。

  我们可以看到,pandas确实正确地导入了数据。Pandas还有一个整洁的函数,df.describe()来计算每一列的描述性统计,如下所示:

  由于我们可以重新确认没有缺失的值,我们准备开始分析数据,目的是选择最相关的功能。

  在熟悉数据集之后,现在是时候选择我们将要用于我们的机器学习模型的特征了。

  其实,你有足够的理由来询问为什么要进行特征选择?我们不能只是抛出我们在模型中的所有数据,并且让它弄清楚什么是相关的吗?

  假设你想从一组特征中预测房子的价格。我们可以问问自己,知道房子里有多少个灯具和电源插座真的很重要吗?人们买房子时有什么想法吗?它是否添加了任何信息,还是只是为了数据而考虑数据?

  添加许多不包含任何信息的特征使得模型不必要地变慢,并且冒着弄乱模型来尝试适应无信息的特征的风险。除此之外,具有许多特征会增加你的模型过度拟合(稍后详解)的风险。

  我们也可以使用诸如主成分分析(PCA)这样的组合技术,将诸如房间数、居住面积和窗户数量的相关特征从上述示例组合到更高级别的主要组件中去,例如大小。虽然我们在本教程中不会使用这些技术,但应该知道它们是存在的。

  确定特征相关性的一个有效方式是,通过绘制它们与其他特征的关系来实现。下面我们使用plot.scatter()子类方法绘制两轴之间的关系。

  上图正确地显示了萼片长度和萼片宽度之间的关系,然而,很难看出是否有任何的分组,因为没有指示一个数据点所代表的花的真实种类。

  不过幸运的是,使用seaborn FacetGrid是很容易实现这一点的,我们可以使用列来驱动散点的颜色或色调。

  使用上述函数与不同特征的组合,你会发现PetalLengthCm和PetalWidthCm聚集在相当明确的组中,如下图所示。

  不过值得注意的是,为何iris-versicolor和iris-virginca之间的界限直观看起来是很模糊的。这可能会给一些分类器带来麻烦,而且这值得在训练时被牢记。

  在搜索机器学习的时候,你会发现能够查找到的东西是至关重要的。有无数的东西要记住。花费大量时间尝试记住这些事情是非常低效的。而查看你所不确定的东西则会显得更有效率,并且会让你的大脑自动记住你经常使用的东西。

  好的一面是,sklearn是可扩展的记录,组织良好,且容易查找。除此之外,Sklearn还有一个非常和谐一致的界面;你可能会在整个教程中注意到它。

  如果关联不同的特征以便选择最好的,这听起来像是一份浩大的工程,需要完成很多工作,不过我们应该注意的是,有自动化的方法可以来完成这个工作的,诸如kbest,和递归特征消除(recursive feature elimination),而这两个都可以在sklearn中得到。

  现在我们已经选择了我们要使用的特征(PetalLengthCm和PetalWidthCm),我们需要准备数据,以便用sklearn使用它。

  目前,所有的数据都是在DataFrame中编码的,但是sklearn并不适用于pandas的DataFrames,所以我们需要提取特征和标签,并将它们转换成numpy数组。

  分离标签是非常简单的,可以使用np.asarray()只用一行就可以完成。

  我们现在可以停止操作,因为我们可以使用上面的标签来训练分类器,但是,由于物种值的数据类型不是数字,而是字符串,我们在评估模型时就会遇到问题。

  幸运的是,sklearn提供了一个漂亮的工具,可以将标签字符串编码为数字表示。 它通过遍历标签数组,并将第一个唯一标签编码为0,然后将下一个唯一标签编码为1,依此类推……

  下表显示了数据转换之前和之后的标签,并使用df.sample(5)进行创建。

  可以看到每个独一的字符串标签现在都有一个与它相关联的独一整数。如果我们想要返回字符串标签,我们可以使用erse_transform(labels)。

  首先,我们要从DataFrame中删除我们不想要的所有特征列。 我们通过使用drop()方法来实现这个操作。

  既然我们已经有了数字特征和标签数组,剩下的要做的最后一件事就是把数据分成训练集和测试集。

  有一个测试集有助于验证模型,并可以检查模型无法从训练数据中泛化的过度拟合,而不是只是记住答案;如果我们希望在未知数据上做得很好的话,其实这不并是理想的做法。测试集的目的是模拟模型即将在现实世界中呈现的未知数据。因此,不使用测试集进行训练非常重要。

  有时候,在使用特别容易过度拟合的算法时,你还可以使用一个验证集,这是你想要避免甚至在考虑的,因为有时在优化模型时,有关测试集的信息可能会从调整模型参数(通常称为超参数)缺失,从而导致测试集以及训练集过度拟合。

  有趣的是test_size和random_state这两个参数。测试大小参数是将保留用于测试的总数据集的数字分数。一个80/20的分配通常被认为是一个很好的经验法则,但可能需要在后来做些调整。

  另一个值得注意的变量是random_state。它的值并不是很重要,因为它只是一个种子数,但随机数据的行为是重要的。

  数据集是按类型进行排序的,因此,如果我们只使用前两种进行训练的话,那么在使用以前从未见过的第三种进行测试时,该模型就不会发挥作用了。

  既然我们已经将数据分成了测试集和训练集,那么我们可以开始选择一个分类器了。

  当考虑我们的数据时,随机森林(Random Forest)分类器是一个很好的起点。随机森林是简单、灵活的,因为它们与各种数据都可以进行很好的执行操作,而且很少出现过度拟合。因此,它们往往是一个很好的起点。

  随机森林的一个显著的缺点是它们在本质上是非确定性的,所以每次训练它们时都不一定会产生相同的结果。

  虽然随机森林是一个很好的起点,但在实际操作中,你将经常使用多个分类器,并查看哪些会获得良好的结果。

  你可以培养一种感觉,哪些算法通常在什么问题表现得出色,从而来限制猜测;当然,从数学表达式出发做第一原则分析也是有助于这一点的实现的。

  我们可以通过在分类器上使用score()方法,从而快速了解该模型对数据的有效性。

  这个结果对于三行代码来说还是不错的。当然这不是最难的问题,但考虑到这是我们的第一次尝试,98%的结果还是很好的。

  注意:如果得到一个稍微不同的结果,你不必担心,它可以通过生成一个随机决策树,并对其预测进行平均,从而预期这个分类器是可以起作用的。

  我们还可以计算训练数据的准确性,并比较两者以了解模型过度拟合的程度。该方法类似于我们如何计算测试精度,只有这次我们使用训练数据作为评估。

  假设我们测量长度为5.2cm,宽度为0.9cm,我们怎样才能找出哪种才是使用我们的新训练模型的呢?

  记得之前标签编码器上的inverse_transform()吗?我们可以使用它来解码ID组,如下所示:

  即使我们可以看到测试的准确度在98%,但模型会造成什么样的错误呢?这看起来似乎也非常有趣。

  分类模型有两种方法无法预测正确的结果:假阳性(False Positive) 和假阴性(False Negative)。

  既然我们没有运行一个二进制分类器(预测“是”或“否”),而是一个分类器,猜测一系列标签中的属于哪一个,每个错误都将是对某些标签来说是假阳性,而对其它标签来说是假阴性。

  在机器学习中,我们经常使用精确率(Precision)和召回率(Recall)来代替假阳性和假阴性。

  精确率试图尝试减少假阳性,而召回率尝试减少假阴性。它们都是0到1之间的十进制数或分数,越高越好。

  目前,我们的Random Forests分类器仅使用默认参数值。然而,为了增加控制,我们可以改变一些或所有的值。

  一个有趣的参数是min_samples_split。 此参数表示拆分决策树所需的最小样本。

  从根本上说,模型捕获的细节越少,同时也增加了过度拟合的可能性。而如果你给它一个很高的值,你将更好地记录趋势,而忽略细节。

  降低参数值没有什么意义,而且模型似乎没有过度拟合,但是我们仍然可以尝试将参数值从2提高到4。

  当我们重新训练模型时,我们看到测试精度已经提高到完美的100%,但训练准确率仍然在98%,表明还有更多的信息需要提取。

  默认情况下,它设置为测量杂质的“gini”,但是sklearn也支持测量信息增益的熵。

  我们可以使用熵来训练分类器,而不是像我们之前那样设置参数min_samples_split。

  当我们用新的参数重新训练模型时,没有任何改变,这表明可能标准函数不是这种类型的数据/问题的重要影响因素。

  使用sklearn的支持向量分类器只需要我们改变两行代码:导入和初始化。你可以阅读所有调整参数为Sklearn的文档页面Random Forest Classifier。

  我们已经涵盖了从数据读取到pandas数据框架中的所有内容,以使用sklearn的数据中的相关功能来训练分类器,并评估模型的精度来调整参数,如有必要,更改分类器算法。

  你现在应该用必要的工具来调查未知数据集,并构建简单的分类模型,即使我们还不熟悉的算法。

http://m3-ctech.com/fenleiqi/235.html
锟斤拷锟斤拷锟斤拷QQ微锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷微锟斤拷
关于我们|联系我们|版权声明|网站地图|
Copyright © 2002-2019 现金彩票 版权所有