百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

机器学习建模的四个主要过程

toyiye 2024-06-21 12:27 10 浏览 0 评论

摘要

在本文中,我将介绍机器学习(ML)建模中的四个主要过程,作为数据从业者,您应该彻底了解这些过程。

机器学习是人工智能的一个分支,它通过揭示数据模式(即特征和目标变量之间的关系)来模拟人类的学习能力。特征是表示给定观察点或数据点的属性的独立变量。另一方面,目标变量是一个因变量,我们感兴趣的建模作出预测。

机器学习建模是数据科学项目生命周期中的一个重要步骤,也是该项目中最有趣的部分之一。

在上一篇文章中,我讨论了机器学习的主要组成部分,并提供了机器学习建模的额外介绍

机器学习建模中的4个关键过程

现在,让我们深入研究机器学习建模中的四个主要过程。

训练

这是将机器学习算法与数据进行匹配以学习模式的过程,其结果是创建一个模型。另外,算法的选择可能会受到基于现有计算能力的训练时间需求的影响。

在进行进一步试验之前,训练过程通常是针对基线模型进行的,作为项目的基准。基线模型可以是一个简单的算法,例如线性回归或带默认设置的随机森林算法。基线模型的选择很大程度上取决于问题和数据从业者的经验。

大多数机器学习算法通过拟合方法进行训练。

以下是常用的训练术语:

  • 串行训练: 这种类型的训练大多在单个处理器上进行,广泛用于简单到中等的训练工作。
  • 分布式训练:在这里,适合一个算法的工作负载被分解并在多个微处理器之间共享。这就是所谓的并行计算,它有助于加快这一进程。点击这里查看更多详情。
  • 离线学习:在这种情况下,对所有可用数据定期进行训练,只有在性能令人满意时才将模型部署到生产环境中。
  • 在线学习: 在这里,模型权重和参数随着新的数据流的出现而不断实时更新。

调优

这是选择最佳超参数集的过程,给出了最佳模型。这是机器学习建模中最耗时的过程,包括创建几个具有不同超参数值集的模型。相关指标,例如平方平均数误差(RMSE)、平均绝对误差(MAE)和准确度,可用于选择最佳模型。

在调优过程中需要避免的一个常见缺陷是对此过程使用测试集。相反,需要为此创建并使用验证集。更妙的是,需要采用交叉验证等方法来防止过拟合。

Python 中已经实现了一些易于使用的模块,它们可以用于超参数优化,即 GridSearchCV、 Rodd SearchCV 和 BayesSearchCV。

预测

一旦选择了最佳模型,就可以使用测试数据和其他新的数据集进行预测,而不需要在模型的输入数据中提供目标变量。这也被称为机器学习推理。

评估

模型评估是评估机器学习模型预测性能的过程。其主要思想是从模型中量化预测的质量。在超参数优化过程中使用的相同指标可以在这里使用,为了结果表示的目的,也可以添加新的指标。

sklearn有三种不同的API用于评估模型预测的质量:

估计器评分方法: 估计器有一种评分方法,为他们设计要解决的问题提供默认的评估标准。这一点在本次没有讨论,可以通过浏览每个估价器的文档进行学习。

评分参数:使用交叉验证等模型评估工具(如model_selection.cross_val_score和model_slection.GridSearchCV)的内部评分策略。通过scoring参数设置指定评估工具。

度量函数:sklearn.metrics模块实现用于特定目的的预测误差评估功能。这些度量在分类度量、多标签排名度量、回归度量和聚类度量部分中有详细说明。

最后,虚拟估值器有助于获得随机预测的这些指标的基线值。

评分参数:定义模型评价规则

使用model_selection等工具进行模型选择和评估。model_selection.GridSearchCV 和 model_selection. cross_val_score中使用一个scoring参数来控制它们应用于评估的估计器的度量。

class sklearn.model_selection.GridSearchCV(estimator, param_grid, *, scoring=None, 
n_jobs=None, refit=True, cv=None, verbose=0, pre_dispatch='2*n_jobs', error_score=nan, 
return_train_score=False)

sklearn.model_selection.cross_val_score(estimator, X, y=None, *, groups=None, scoring=None, 
cv=None, n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs', error_score=nan)

常见案例:预定义值

对于最常见的用例,您可以使用scoring参数指定一个评分器对象;下表显示了所有可能的值。所有评估器对象都遵循较高返回值优于较低返回值的约定。因此,度量模型与数据之间距离的度量,例如:metrics.mean_squared_error,可以用neg_mean_squared_error返回度量的负值,以满足上面的基本约定。



案例:

from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score

X, y = datasets.load_iris(return_X_y=True)
clf = svm.SVC(random_state=0)
cross_val_score(clf, X, y, cv=5, scoring='recall_macro')

输出:
# array([0.96666667, 0.96666667, 0.96666667, 0.93333333, 1.        ])

根据度量函数定义评分策略

sklearn.metrics模块还公开了一组简单的函数,用于测量给定原始数据和预测的预测误差:

  • 以_score结尾的函数返回一个要最大化的值,越高越好。
  • 以_error或_loss结尾的函数返回一个要最小化的值,越低越好。使用make_scorer转换为scorer对象时,请将greater_is_better参数设置为False(默认为True;请参阅下面的参数描述)。

以下各节详细介绍了各种机器学习任务的可用指标。

许多指标没有指定名称用作评分值,有时因为它们需要额外的参数,例如fbeta_score。在这种情况下,您需要生成适当的评分对象。生成可调用对象进行评分的最简单方法是使用make_scorer。该函数将度量转换为可用于模型评估的可调用项。

一个典型的用例是将库中的现有度量函数包装为其参数的非默认值,例如fbeta_score函数的beta参数:

from sklearn.metrics import fbeta_score, make_scorer
from sklearn.model_selection import GridSearchCV
from sklearn.svm import LinearSVC

# 将度量转换为可用于模型评估的可调用项
ftwo_scorer = make_scorer(fbeta_score, beta=2)

grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]},
                   scoring=ftwo_scorer, cv=5)

第二个用例是使用make_scorer从一个简单的python函数构建一个完全自定义的scorer对象,它可以接受几个参数:

  • 您想要使用的python函数(在下面的示例中为my_custom_loss_func)
  • python函式是返回一个分数(greater_is_better=True,默认值)还是一个损失(greater _is_better=False)。如果是loss,python函数的输出将被scorer对象取负值,这符合scorers为更好的模型返回更高值的交叉验证约定。
  • 仅用于分类度量:您提供的python函数是否需要连续的决策确定性(needs_threshold=True)。默认值为False。
  • 任何其他参数,例如f1score中的beta或labels。

以下是构建自定义记分器和使用greater_is_better参数的示例:

import numpy as np
from sklearn.dummy import DummyClassifier

def my_custom_loss_func(y_true, y_pred):
    diff = np.abs(y_true - y_pred).max()
    return np.log1p(diff)

score = make_scorer(my_custom_loss_func, greater_is_better=False)
X = [[1], [1]]
y = [0, 1]

clf = DummyClassifier(strategy='most_frequent', random_state=0)
clf = clf.fit(X, y)

my_custom_loss_func(y, clf.predict(X))
# 输出:0.6931471805599453

score(clf, X, y)
# 输出:-0.6931471805599453

自定义自己的评分对象

您可以通过从头构建您自己的计分对象,而无需使用make_scorer工厂来生成更灵活的模型评分器。对于可调用的记分器,它需要满足以下两个规则指定的协议:

  • 可以使用参数(estimator,X,y)调用它,其中estimator是应该评估的模型,X是验证数据,y是X的标签(在受监督的情况下)或None(在无监督的情况中);
  • 它返回一个浮点数,用于量化X上的估计器预测质量(参考y)。同样,按照惯例,数字越大越好,因此如果您的记分器返回损失,则该值应为负值。

使用多指标评估

Scikit learn还允许在GridSearchCV、RandomizedSearchCVs和cross_validate中使用多种评估指标。

有三种方法可以为scoring参数指定多个评分指标:

  • 字符串度量指标构成的列表:
scoring = ['accuracy', 'precision']
  • score名称和score函数构成的字典
from sklearn.metrics import accuracy_score
from sklearn.metrics import make_scorer

scoring = {'accuracy': make_scorer(accuracy_score),
          'prec':'precision'}

注意,dict值可以是scorer函数或预定义的度量字符串之一。

  • 作为返回分数字典的可调用函数:
from sklearn.model_selection import cross_validate
from sklearn import datasets
from sklearn.metrics import confusion_matrix
from sklearn.svm import LinearSVC

X, y = datasets.make_classification(n_classes=2, random_state=0)
svm = LinearSVC(random_state=0)

def confusion_matrix_scorer(clf, X, y):
    y_pre = clf.predict(X)
    cm = confusion_matrix(y, y_pre)
    return {'tn': cm[0, 0], 'fp': cm[0, 1],
            'fn': cm[1, 0], 'tp': cm[1, 1]
        
    }

cv_result = cross_validate(svm, X, y, cv=5, scoring=confusion_matrix_scorer)

print(cv_result)
# 输出
{'fit_time': array([0.0045774 , 0.00227857, 0.00192642, 0.00206995, 0.00172496]),
 'score_time': array([0.00096321, 0.00078726, 0.0006187 , 0.00059295, 0.00057411]),
 'test_tn': array([ 5,  9,  8,  6, 10]),
 'test_fp': array([5, 1, 2, 4, 0]),
 'test_fn': array([0, 1, 2, 3, 2]),
 'test_tp': array([10,  9,  8,  7,  8])}

分类指标

sklearn.metrics模块实现了几个损失、得分和效用函数来衡量分类性能。某些度量可能需要正类的概率估计、置信值或二进制决策值进行概率估计。大多数实现都允许每个样本通过sample_weight参数提供对总分的加权贡献。

在下面的小节中,我们将描述这些函数中的每一个,前面是一些关于通用API和度量定义的注释。

从二分类到多类和多标签

一些度量基本上是为二分类任务定义的(例如f1_score、roc_auc_score)。在这些情况下,默认情况下,只计算正值标签,假设正值类的标签为1(尽管可以通过pos_label参数进行配置)。

在将二分类度量扩展到多类或多标签问题时,数据被视为二分类问题的集合,每个类一个。然后有多种方法可以跨类集合平均二进制度量计算,每种方法在某些情况下都可能有用。如果可用,应使用average参数从中选择。

  • “macro”只计算二分类度量的平均值,为每个类赋予相等的权重。在不经常出现的类仍然很重要的问题中,宏观平均可能是突出其性能的一种方法。另一方面,认为所有类都同等重要的假设往往是不正确的,因此宏平均会过分强调不常见类的通常低性能。
  • “weighted”通过计算二分类度量的平均值来解释类不平衡,其中每个类的分数根据其在真实数据样本中的存在进行加权。
  • “micro”使每个样本类对对总体指标的贡献相等(样本权重的结果除外)。这不是对每个类的指标求和,而是对组成每个类指标的股息和除数求和,以计算总商。在多标签设置中,可能首选微平均,包括忽略大多数类别的多类别分类。
  • “samples”仅适用于多标签问题。它不计算每类度量,而是计算评估数据中每个样本的真实类和预测类的度量,并返回它们的(sample_weight-weighted)平均值。
  • 选择average=None将返回一个数组,其中包含每个类的分数。
  • 虽然像二分类目标一样,多类数据作为类标签数组提供给度量,但多标签数据被指定为指示符矩阵,在该矩阵中,如果样本i具有标签j,单元格[i,j]的值为1,否则为0。

准确度得分(Accuracy score)

accuracy_score函数计算准确度,即正确预测的分数(默认值)或计数(normalize=False)。

在多标签分类中,函数返回子集精度。如果样本的整个预测标签集与真实标签集严格匹配,则子集精度为1.0;否则为0.0。

如果 y~ 是第 i 样本的预测值,并且 yi 是相应的真值,则 nsamples 正确预测的分数定义为:

import numpy as np
from sklearn.metrics import accuracy_score

y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]

accuracy_score(y_true, y_pred)  # 输出: 0.5

accuracy_score(y_true, y_pred, normalize=False)  # 输出:2

Top-k准确度得分

top_k_accuracy_score函数是accuracy_score的泛化。区别在于,只要真实标签与k个最高预测分数中的一个相关联,预测就被认为是正确的。accuracy_score是k=1的特例。

该函数涵盖二分类和多类分类情况,但不包括多标签情况。

如果 fˉi,j 是对应于第 i 个最大预测分数的第 j 个样本的预测等级,并且是对应的真值,则正确预测的分数超过 nsamples 的部分定义为:

其中 k 是允许的猜测次数, 1(x) 是指示符函数。

import numpy as np
from sklearn.metrics import top_k_accuracy_score

y_true = np.array([0, 1, 2, 2])
y_score = np.array([[0.5, 0.2, 0.2], 
                    [0.3, 0.4, 0.2], 
                    [0.2, 0.4, 0.3], 
                    [0.7, 0.2, 0.1]])

top_k_accuracy_score(y_true, y_score, k=2)  # 0.75

top_k_accuracy_score(y_true, y_score, k=2, normalize=False) # 3

平衡精度分数(Balanced_accuracy_score)

Balanced_accuracy_score函数计算平衡精度,避免对不平衡数据集进行夸大的性能估计。它是每个类别的召回分数的宏观平均值,或者相当于原始准确度,其中每个样本根据其真实类别的反向流行率进行加权。

因此,对于平衡数据集,分数等于准确度。

在二元情况下,平衡准确度等于灵敏度(真阳性率)和特异性(真阴性率)的算术平均值,或具有二元预测而非分数的ROC曲线下的面积:

如果分类器在任何一类上都表现得同样好,则该术语会降低到常规精度(即,正确预测数除以预测总数)。

分类报告(Classification report)

classification_report函数构建一个显示主要分类指标的文本报告。下面是一个自定义target_names和推断标签的小例子:

from sklearn.metrics import classification_report


y_true = [0, 1, 2, 2, 0]
y_pred = [0, 0, 2, 1, 0]

target_names = ['class 0', 'class 1', 'class 2']

print(classification_report(y_true, y_pred, target_names=target_names))

# 输出:
               precision    recall  f1-score   support

     class 0       0.67      1.00      0.80         2
     class 1       0.00      0.00      0.00         1
     class 2       1.00      0.50      0.67         2

    accuracy                           0.60         5
   macro avg       0.56      0.50      0.49         5
weighted avg       0.67      0.60      0.59         5

精度、召回率和 f-measures(Precision, recall and F-measures)

在二元分类任务中,术语“正”和“负”指的是分类器的预测,术语“真”和“假”指的是该预测是否与外部判断(有时称为“观察”)相对应。

在一个数据集检测中,会产生四类检测结果:

TP、TN、FP、FN:

T --- true 表示正确

F --- false 表示错误

P --- positive 表示积极的,看成正例

N --- negative 表示消极的,看成负例。

在TP、TN、FP、FN中P/N分别代表预测结果的类型为正例或负例,那么:

TP --表示:预测是正例,并且预测正确了(真阳性);

TN --表示:预测是负例,并且预测正确了(真阴性);

FP --表示:预测是正例,但是预测错误了(假阳性);

FN --表示:预测是负例,但是预测错误了(假阴性);

TP+FP+TN+FN: 表示样本总数;

TP+FN:表示正样本数;

TP+FP:表示预测结果是正样本的总数,包括预测正确的和预测错误的。

FP+TN:实际负样本总数;

TN+FN:预测结果为负样本的总数,包括预测正确的错误的。

(1)精确率(Precision)

表示预测为正样本中有多少是真正的正样本(找的对)。预测结果中真正的正例的比例。

用途:评估检测成功基础上的正确率

(2)召回率(Recall)

表示样本中正例有多少被预测正确了(找的全),所有正例被正确预测出来的比例。

用途:评估对所有检测目标的检测覆盖率

(3) F-measures

from sklearn import metrics

y_pred = [0, 1, 0, 0]
y_true = [0, 1, 0, 1]

metrics.f1_score(y_true, y_pred)  # 0.6666666666666666

metrics.fbeta_score(y_true, y_pred, beta=1)  # 0.6666666666666666

metrics.fbeta_score(y_true, y_pred, beta=0.5)  # 0.8333333333333334

(4)多分类任务

在多类和多标签分类任务中,精度、召回率和f -度量的概念可以独立应用于每个标签。有几种跨标签组合结果的方法,由average_precision_score(仅多标签)、f1_score、fbeta_score、precision_recall_fscore_support、precision_score和recall_score函数的平均参数指定,如上所述。请注意,如果包括所有标签,“micro”平均在多类设置将产生精度,召回率和F所有相同的准确性。还要注意,“weighted” 平均可能产生一个F-score,不是在精度和回忆之间。

3.3.2.12. Log loss

对数损失,也称为逻辑回归损失或交叉熵损失,是在概率估计上定义的。它通常用于(多项)逻辑回归和神经网络,以及在期望最大化的一些变体中,并可用于评估分类器的概率输出(predict_proba),而不是它的离散预测。

对于 y∈{0,1} 二分类任务:

from sklearn import metrics

y_true = [0, 1, 0, 1]
y_pred = [[.9, .1],[.8, .2], [.3, .7], [.01, .99]]

metrics.log_loss(y_true, y_pred)

# 输出:

0.7322053920678411

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码