Python的十大机器学习算法

55 阅读11分钟

简单地说,机器学习(ML)是采用算法来帮助计算机系统逐步提高其对某些特定任务的性能的过程。基于软件的ML可以追溯到20世纪50年代,但自21世纪初以来,ML算法的数量和普遍性已经爆炸性增长,主要是由于Python编程语言的不断普及,它继续推动ML的进步。

卫冕的ML算法冠军可以说是Python的 scikit-learn 包,它提供了简单易行的语法和多种算法的宝库。虽然有些算法更适合于特定的任务,但其他的算法却广泛适用于任何项目。

在这篇文章中,我将向你展示十大机器学习算法,这些算法总是能拯救我的生活!

在你开始之前。安装十大算法的Python环境

为了跟上本文的代码,你可以下载并安装我们预建 的十大算法 环境,其中包含Python 3.9版本和本文中使用的软件包。

Runtime

为了下载这个随时可用的Python环境,你需要创建一个 ActiveState Platform 账户。只要用你的GitHub凭证或你的电子邮件地址来注册。注册很简单,它可以为你解锁ActiveState平台的许多好处

或者你也可以使用我们的 State工具 来安装这个运行时环境。

对于Windows用户,在CMD提示下运行以下程序,可以自动下载并安装我们的CLI、状态工具以及 十大算法 到一个虚拟环境中。

powershell -Command "& $([scriptblock]::Create((New-Object Net.WebClient).DownloadString('https://platform.activestate.com/dl/cli/install.ps1'))) -activate-default Pizza-Team/Top-Algorithms"

对于Linux用户,运行下面的程序来自动下载和安装我们的CLI、状态工具 以及十大算法 到一个虚拟环境中。

sh <(curl -q https://platform.activestate.com/dl/cli/install.sh) --activate-default Pizza-Team/Top-Algorithms

选择一个数据集

为了展示不同的算法是如何工作的,我们将把它们应用于一个标准的数据集。人们常说,ML实验的结果更依赖于你使用的数据集,而不是你选择的算法。考虑到这一点,我们将从Kaggle选择一个著名的分类数据集,名为 "泰坦尼克号--从灾难中学习机器"。

探索一个数据集

通过查阅Kaggle上的数据字典,我们可以看到,该数据集包含以下信息。

变量定义关键
存活率存活率0=否,1=是
pclass票类1 = 第一级, 2 = 第二级, 3 = 第三级
性别性别
年龄年龄(岁)
sibsp在泰坦尼克号上的兄弟姐妹/配偶的#个数
parch父母/子女在泰坦尼克号上的人数
船票票号
票价乘客票价
船舱舱位号
已登船登船港C = 瑟堡
Q = 皇后镇
S = 南安普敦

在这个阶段,你通常会对数据集进行探索性数据分析。如果你想深入了解这个问题,你可以暂停这篇文章,阅读我的 "使用Python的探索性数据分析"博客,然后马上回来。

清洗和准备数据集

在我们对这些数据应用任何算法之前,需要对其进行清理。这意味着剔除缺失的数值,转换标签数据,规范化数值,有时甚至要甩掉我们不需要的列。

为了节省时间(和长度),我将略过这一部分。如果你想阅读更详细的方法,你可以探索我的另一篇博客。"如何使用Pandas清理机器学习数据集",我从那里学到了本文中的一些概念。

第一步:删除不必要的列

有几列要么是数据缺失,要么是文字信息太多,我们不容易使用。我们可以像这样丢掉它们。

def

需要注意的是,这些列中有许多可以被利用来进一步加强结果。然而,这将涉及大量的预处理工作。

第2步:对标签进行编码

这一步将标签转换为可比较的数字数据。

def

第3步:填入缺失值

你可以使用 self.df.isna().any() 来发现数据集是否有缺失或NaN列。

Survived        False

正如你所看到的, 年龄 变量有缺失值。我们可以通过获取整个数据集的平均年龄来填补这些缺失。

ef

第4步 - 分割数据集

现在,让我们用sklearn的 _train_test_split_将数据集分成训练和测试数据 。

@

很好!现在我们已经清理了数据集。现在,我们已经清理了数据并进行了分割,现在是学习的时候了--或者说,是机器学习的时候了!

Scikit-Learn中的顶级ML算法

决策树算法

决策树算法广泛适用于大多数场景,而且对于这样一个简单的算法来说,它的有效性令人惊讶。它需要最少的数据准备,甚至可以与空白值一起工作。这个算法的重点是学习从数据中推断出的简单决策规则。然后,它将这些规则编译成一套 "如果--那么--否则 "的决策规则。

from

这就是结果。

[Running]

现在,让我们绘制一个树本身的可视化图。这很容易做到,因为 sklearn 提供了 export_graphviz 作为其树模块的一部分。

from

现在你有了这个文件,只要把它转换成PNG图像就可以了。

dot -Tpng decision_tree.dot -o decision_tree.png

Decision Tree

你也可以 在这里查看一个更详细的版本 。

随机森林分类器算法

如果你认为一棵决策树很好,那么想象一下由它们组成的森林能做什么!这基本上就是随机森林分类法的特点。这基本上就是随机森林分类器的作用。分类开始时,使用多棵树的训练数据略有不同。然后对所有树的预测进行平均,从而获得比模型中任何一棵树更好的性能。

随机森林可以用来解决分类或回归问题。让我们来看看它是如何解决以下分类问题的。

from

现在来看看结果。

[Running]

K-最近的邻居算法

K-近邻(KNN)算法是一种简单而高效的算法,可以用来解决分类和回归问题。如果你知道 "物以类聚 "这句话,你就会明白KNN的本质。它假定类似的 "事物 "存在于彼此之间的近距离内。

尽管在应用该算法之前,你需要进行一定的数据清理,但其好处超过了负担。让我们来看看。

from

正如你所看到的,你可以调整超参数以达到最高精度。当上述代码只用1个邻居执行时,准确率下降到70%。

[Running]

现在让我们把它可视化。这一部分有点棘手,因为我们需要减少模型的维度,以便能够在散点图上将结果可视化。你可能想阅读更多关于 主成分分析 (PCA)的内容,但就本文而言,你只需要知道PCA是用来降低维度的,同时保留数据的意义。

# Transforming n-features into 2

现在我们来绘制我们的数据。我们将用绿色的点表示幸存的乘客,用红色的点表示没有幸存的乘客。

Titanic Survivors

袋式分类器算法

在我们研究袋式分类器之前,我们必须了解集合学习。在之前的随机森林和决策树的例子中,我们了解到前者是对后者结果的平均化。

这本质上就是袋法:这是一种范式,多个 "弱 "学习者被平行训练以解决同一问题,然后组合起来以获得更好的结果。

from

为了给多个学习者分割数据,我们使用线性支持向量分类器(SVC)来拟合并尽可能平等地分割数据。这意味着没有一组数据会过于倚重某一列,或者数据之间的差异性太大。

让我们来看看会发生什么。

[Running]

Boosting分类器算法

Boosting与bagging非常相似,因为它将多个弱学习者的结果平均化。然而,在提升的情况下,这些学习者是以顺序的方式执行的,这样最新的模型就取决于以前的模型。这导致了较低的偏差,意味着它可以处理更大的数据差异。

from

下面是结果。

[Running]

Naive Bayes算法

现在是时候回忆一下你的高中概率课程了。奈何贝叶斯算法确定了每个特征集的概率,并以此来确定分类本身的概率。

这里有一个来自 Naive Bayes for Dummies的奇妙例子 。

"如果一个水果是红色的、圆形的、直径约3英寸的,就可以认为是苹果。Naive Bayes分类器认为这些 "特征"(红色、圆形、直径3英寸)中的每一个都对水果是苹果的概率有独立贡献,而不考虑特征之间的任何关联。

现在我们来看看代码。

from

准确率得分没有显示的是假阳性和假阴性的概率。我们只能捕捉到 "我们有多正确"。然而,更重要的是要知道在许多情况下(包括生活!)"我们有多错 "的程度。

我们可以用混淆矩阵来绘制这一点。这个矩阵显示了真阳性、真阴性、假阳性和假阴性的分布。

mat = confusion_matrix(ytest, ypred)

Confusion Matrix

现在,我们可以看到,假阳性的可能性比假阴性高。

支持向量机

支持向量机(SVMs)是稳健的、非概率模型,可用于预测分类和回归问题。SVMs最大限度地扩大空间,以扩大类别之间的差距,提高准确性。

让我们看一看。

from

正如你所看到的,SVMs通常比其他方法更准确。如果应用甚至更好的数据清洗方法,我们可以争取达到更高的准确性。

[Running]

现在,我们不看模型数据的可视化,而是看模型的性能。我们可以用scikit learn的度量模块看一下分类报告。

             precision    recall  f1-score   support

随机梯度下降分类

随机梯度下降(SGD)在神经网络领域很流行,它被用来优化成本函数。然而,我们也可以用它来对数据进行分类。SGD非常适用于你有一个具有非常大的特征集的大型数据集的情况。它可以帮助减少从高度可变的数据中学习的复杂性。

from

让我们来看看它的准确性如何。

[Running]

Logistic 回归

这是一个非常基本的模型,但仍能提供体面的结果。它是一个使用逻辑(sigmoid)函数来准确预测数据的统计模型。

在你使用这个模型之前,你需要确保你的训练数据是干净的,有较少的噪音。显著的差异可能会降低模型的准确性。

from

现在,让我们为这个模型绘制接受者操作特征(ROC)曲线。该曲线通过在Y轴上绘制真阳性率,在X轴上绘制假阳性率,帮助我们直观地了解准确性。曲线下的面积越 "大",模型就越准确。

Receiver Operating Characteristics

投票式分类器

投票分类法是另一种集合方法,我们不使用同一类型的 "弱 "学习者,而选择非常不同的模型。这个想法是结合概念上不同的ML算法,并使用多数票来预测类标签。这对于一组表现同样好的模型是很有用的,因为它可以平衡个别的弱点。

在这个集合中,我将结合一个逻辑回归模型、一个Naive Bayes模型和一个随机森林模型。

from

让我们看看它的表现如何。

[Running]

正如你所看到的,投票合集从所有三个模型中学习,并超过了它们的表现。

结论。正确的算法适用于正确的工作

让算法相互竞争是很不公平的。它们都有自己独特的方式,而且都有自己的一套优势和劣势。在选择哪个模型最适合你之前,你应该确保你了解基础数据集和特征集。在你尝试模型之前,绘制出方差和相关关系。如果你在这之后仍然被卡住,也许投票分类器可以拯救你。

  • 你可以在GitHub上查看所有这些代码。
  • 下载我们的十大算法Python环境,并针对你的数据集尝试这些算法,看看它们的表现如何。

Top Algorithms Configuration

通过ActiveState Platform,你可以在几分钟内创建你的Python环境,就像我们为这个项目建立的一样。自己尝试一下,或者了解更多关于它如何帮助Python开发者提高生产力的信息。

相关阅读

如何用Python构建一个算法交易机器人

比较决策树算法。随机森林vs.XGBoost