Skip to content

Latest commit

 

History

History
183 lines (92 loc) · 8.56 KB

scikit-learn-mlr-machine-learning.md

File metadata and controls

183 lines (92 loc) · 8.56 KB

Scikit-Learn 与 MLR 在机器学习中的对比

原文:www.kdnuggets.com/2019/09/scikit-learn-mlr-machine-learning.html

评论

Scikit-Learn 以其易于理解的 Python 用户 API 而闻名,而 MLR 成为了流行的 Caret 包的替代品,提供了更多的算法库和简单的超参数调整方式。这两个包因许多人在分析工作中倾向于使用 Python 进行机器学习而 R 用于统计分析而处于竞争状态。

使用 Python 的一个原因可能是当前用于机器学习的 R 包通过其他包含算法的包提供。这些包通过 MLR 调用,但仍需额外安装。甚至外部特征选择库也需要,且它们还有其他外部依赖需要满足。

Scikit-Learn 被称为一个统一的 API,提供多个机器学习算法,无需用户调用更多库。

这绝不会贬低 R。 R 在数据科学领域仍然是一个主要组成部分,不论在线调查如何说。任何有统计学或数学背景的人都会知道为什么你应该使用 R(即使他们自己不使用,它们也认识到它的吸引力)。

现在我们将查看用户如何通过典型的机器学习工作流。我们将使用 Scikit-Learn 中的 Logistic Regression 和 MLR 中的决策树。

创建你的训练和测试数据

  • Scikit-Learn

    • x_train, x_test, y_train, y_test = train_test_split(x,y,test_size)

      这是在 Scikit-Learn 中分割数据集的最简单方法。test_size 用于确定数据的百分比进入测试集。train_test_split 将自动在一行代码中创建训练集和测试集。x 是特征集,y 是目标变量。

  • MLR

    • train <- sample(1:nrow(data), 0.8 * nrow(data))

    • test <- setdiff(1:nrow(train), train)

    • MLR 没有内置的函数来子集数据集,因此用户需要依赖其他 R 函数。这是创建 80/20 训练测试集的一个例子。

选择算法

  • Scikit-Learn

    • LogisticRegression()

      分类器可以通过调用一个明显命名的函数来选择和初始化,这样便于识别。

  • MLR

    • makeLearner('classif.rpart') 算法被称为学习器,这个函数被调用以初始化它。

    • makeClassifTask(data=, target=) 如果我们进行分类,我们需要调用此函数来初始化分类任务。此函数将接受两个参数:训练数据和目标变量的名称。

超参数调整

在任何一个软件包中,调整超参数都有一个流程。你首先需要指定要改变哪些参数以及这些参数的范围。然后进行网格搜索或随机搜索,以找到最佳的参数组合,从而获得最佳结果(即,最小化错误或最大化准确度)。

  • Scikit-Learn

    • penalty = ['l2']

    • C = np.logspace(0, 4, 10)

    • dual= [False]

    • max_iter= [100,110,120,130,140]

    • hyperparameters = dict(C=C, penalty=penalty, dual=dual, max_iter=max_iter)

    • GridSearchCV(logreg, hyperparameters, cv=5, verbose=0)

    • clf.fit(x_train, y_train)

  • MLR

    • makeParamSet( makeDiscreteParam("minsplit", values=seq(5,10,1)), makeDiscreteParam("minbucket", values=seq(round(5/3,0), round(10/3,0), 1)), makeNumericParam("cp", lower = 0.01, upper = 0.05), makeDiscreteParam("maxcompete", values=6), makeDiscreteParam("usesurrogate", values=0), makeDiscreteParam("maxdepth", values=10) )

    • ctrl = makeTuneControlGrid()

    • rdesc = makeResampleDesc("CV", iters = 3L, stratify=TRUE)

    • tuneParams(learner=dt_prob, resampling=rdesc, measures=list(tpr,auc, fnr, mmce, tnr, setAggregation(tpr, test.sd)), par.set=dt_param, control=ctrl, task=dt_task, show.info = TRUE) )

    • setHyperPars(learner, par.vals = tuneParams$x)

训练

两个软件包都提供了一行代码来训练模型。

  • Scikit-Learn

    • LogisticRegression().fit(x_train50, y_train50)
  • MLR

    • train(learner, task)

这可以说是过程中的较简单步骤。最艰巨的步骤是调整超参数和特征选择。

预测

就像训练模型一样,预测也可以通过一行代码完成。

  • Scikit-Learn

    • LogisticRegression().predict(x_test)
  • MLR

    • predict(trained model, newdata)

Scikit-learn 将返回一个预测标签的数组,而 MLR 将返回一个预测标签的数据框。

模型评估

评估监督分类器最流行的方法是混淆矩阵,从中可以获得准确度、错误率、精确度、召回率等。

  • Scikit-Learn

    • confusion_matrix(y_test, prediction) OR

    • classification_report(y_test,prediction)

  • MLR

    • performance(prediction, measures = list(tpr,auc,mmce, acc,tnr)) OR

    • calculateROCMeasures(prediction)

两个软件包都提供了多种获取混淆矩阵的方法。然而,为了以最简单的方式获得信息性视图,Python 可能没有 R 那么直观。第一个 Python 代码只会返回一个没有标签的矩阵。用户必须返回文档中解读哪些列和行对应于哪些类别。 第二种方法提供了更好且更具信息性的输出,但它仅会生成精确度、召回率、F1 分数和支持度。这些也是在不平衡分类问题中更重要的性能衡量标准。

决策阈值调整(即,改变分类阈值)

分类问题中的阈值是将每个实例分类到预测类别的给定概率。默认阈值通常为 0.5(即 50%)。这是在 Python 和 R 中进行机器学习时的一个主要差异。R 提供了一行代码解决方案来调整阈值以应对类别不平衡。而 Python 没有内置函数来实现这一点,用户需要通过定义自定义脚本/函数来编程操作阈值。

一对显示决策阈值的图表。

  • Scikit-Learn

    • 在 Scikit-Learn 中没有一种标准的阈值设置方式。查看这篇文章了解你可以自己实现的一种方法:在 Scikit-Learn 中微调分类器
  • MLR

    • setThreshold(prediction, threshold)

      这行mlr中的代码将自动更改你的阈值,并可以作为参数传递,以计算你的新性能指标(即混淆矩阵)。

结论

最终,MLR 和 Scikit-Learn 在处理机器学习时各有优缺点。我们的比较集中在使用其中一种进行机器学习,并不意味着使用其中一种而不是另一种。了解这两者能为该领域的人提供真正的竞争优势。对过程的概念性理解将使得使用这两种工具更为容易。

原文。经许可转载。

相关:


我们的三大课程推荐

1. 谷歌网络安全证书 - 快速进入网络安全职业生涯。

2. 谷歌数据分析专业证书 - 提升你的数据分析技能

3. 谷歌 IT 支持专业证书 - 支持你的组织的 IT 需求


更多相关主题