机器学习模型_机器学习模型评估指标示例

本文探讨了在机器学习模型选择和优化过程中如何使用评估指标,包括交叉验证、回归度量(如R2和RMSE)、分类指标(如精度、召回率和F分数)、聚类度量以及学习曲线可视化的重要性。通过实例展示了如何在决策树回归和SVM等模型间进行比较。
摘要由CSDN通过智能技术生成
4ed23aea1e33ac00dde53eac43860744.png

选择正确的度量来评估机器学习模型

我们什么时候评估我们的机器学习模型呢?答案不是只有一次。通常,我们在实际的数据科学工作流中两次使用机器学习模型验证指标:

  1. 模型比较:为您的任务选择最佳机器学习(ML)模型
  2. 模型改进:调整超参数

为了更清楚地了解这两者之间的区别,让我通过机器学习(ML)实现的工作流程来解释。在为任务y设置所有特征X后,您可以准备多个机器学习模型作为候选。

那么你怎么才能最终为你的任务选择一个呢?是的,这是使用模型验证度量的第一点。Scikit-learn提供了一些快捷方法来比较模型,比如cross - validation。

在您选择了一个准确度最好的机器学习模型后,您将跳转到超参数调优部分,以提高精度和通用性。这里是您将使用这些度量的第二点。

在本文中,我试图制作机器学习模型评估指标的总结。

交叉验证用于模型比较

36adfca2d868191cf53dff77615feb55.png

训练/测试拆分和交叉验证的可视化表示

我们拆分数据的原因和方式的起点是泛化。因为我们构建机器学习模型的目标是使用未来未知数据的真实实现。因此,我们不需要过度拟合过去数据的无用模型。

  • Holdout 方法
from sklearn.model_selection import train_test_splitfrom sklearn.datasets import load_winewine = load_wine()X, y = wine.data, wine.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
cce697675fc7560a85e58a4ce9db7264.png
  • 交叉验证方法
c594d1e87b4c6d11744a541a902bddc0.png

K-Folds的视觉表示

# Decision Tree Classifieras for estimatorfrom sklearn.tree import DecisionTreeClassifierclf = DecisionTreeClassifier(random_state=0)
ebd7f8edc1e4d7208ecdccca9a9caa51.png

cross_val_score:最简单的编码方法

我们可以通过参数“cv”来决定数据拆分的数量。通常5被认为是标准拆分数。

# X, y = wine.data, wine.targetfrom sklearn.model_selection import cross_val_scorescores = cross_val_score(clf, X, y, cv=5)print(scores) # cv = number of splited dataprint(scores.mean())
74e11743edc2dbac3e60729ec9540a79.png
57748528b0bd1aae3a153e5eb1cd4d3e.png

cross_validate:我推荐这个可自定义的

scoring = ['precision_macro', 'recall_macro']scores = cross_validate(clf, X, y, scoring=scoring, cv=5)print(scores)
eb38e77104ff70c6cd02d7322183aca2.png
cffb9d13d6da8aaca51d07e7bd30581f.png

回归度量

TL; DR:在大多数情况下,我们使用R2或RMSE。

d71b2567d2896831ca3f4600ace06b53.png

我将使用Boston House Price数据集。

# Data Preparationfrom sklearn.datasets import load_bostonboston = load_boston()X, y = boston.data, boston.target# Train data and Test data Splittingfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
8e821af1dd8aa6ad76557eeaddd874d8.png

模型1:线性回归

reg = LinearRegression()reg.fit(X_train, y_train)y_pred1 = reg1.predict(X_test)
597e85502f5f3087cc1f98c7243f0bd0.png

模型2:决策树回归

from sklearn.tree import DecisionTreeRegressorreg2 = DecisionTreeRegressor(max_depth=3)reg2.fit(X_train, y_train)y_pred2 = reg2.predict(X_test)
37f610881c0a921440176c966b1838df.png

现在我们准备评估我们的两个机器学习模型并选择一个!

R2:决定系数

from sklearn.metrics import r2_score

r2_score(y_test, y_pred1) # Linear Regression

r2_score(y_test, y_pred2) # Decision Tree Regressor

a95329814e13949c6ac37ef61820d300.png
25ece328ad51bd097de13c1285d42738.png

MSE:均方误差

from sklearn.metrics import mean_squared_errormean_squared_error(y_test, y_pred)
930f76fd52a60ccac0aa0b57beab757a.png

>>> 23.873348..

RMSE:均方根误差

import numpy as npnp.sqrt(mean_squared_error(y_test, y_pred))
01a3dd6b5afc9e9f8a6de8eb198f0355.png

>>> 4.886036..

MAE:平均绝对误差

reg = LinearRegression()reg.fit(X_train, y_train)y_pred = reg.predict(X_test)mean_absolute_error(y_test, y_pred)
883446545c53f9a29197903520ee6506.png

>>> 3.465279..

分类指标

3d96bc3f7a5799774812f54b7752b112.png

分类问题:

  1. 一对一分类:例如付费用户或免费
  2. One vs. Rest分类:例如高级会员或付费或免费

我将使用Iris数据集作为多类分类问题。

# Data Preparationfrom sklearn.datasets import load_irisiris = load_iris()X, y = iris.data, iris.target# Train data and Test data Splittingfrom sklearn.model_selection import train_test_splitX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3)
6a00425ad6e8e360042705553ee4b333.png

模型1:SVM

from sklearn.svm import SVCclf1 = SVC(kernel = 'linear', C = 0.01)clf1.fit(X_train, y_train)y_pred1 = clf1.predict(X_test)
01a3f4407cc06bc2ff2b69a3a564d801.png

模型2:朴素贝叶斯

from sklearn.naive_bayes import GaussianNBclf2 = GaussianNB()clf2.fit(X_train, y_train)y_pred2 = clf2.predict(X_test)
06222522f1522cd2954b735b6188930e.png

现在我们准备评估我们的两个模型并选择一个!

1.准确性:

from sklearn.metrics import accuracy_score

accuracy_score(y_test, y_pred1)

accuracy_score(y_test, y_pred2)

1ec9ea9e6b0ab54aff380601810c0824.png
eaeae430c8c593617d83ea26c716214f.png

2.精度:

from sklearn.metrics import precision_score

precision_score(y_test, y_pred1, average=None)

precision_score(y_test, y_pred2, average=None)

7fc6fa39a1b1c14c068f9abad9b9f447.png
73a23a980b3e26697d510ba2cd3b0be8.png

3.召回或灵敏度:

from sklearn.metrics import recall_scorerecall_score(y_test, y_pred2, average=None)
3a48c6a0ef4eb4b59979fe2fa6b07706.png

>>> array([1. , 1. , 0.85714286]) # GNB

4. F分数:

from sklearn.metrics import f1_scoref1_score(y_test, y_pred2, average=None)
226af005a32eb38b24bf126e20d6a1ff.png

>>> array([1. , 0.9375 , 0.92307692]) # GNB

5.混淆矩阵

from sklearn.metrics import confusion_matrix

confusion_matrix(y_test, y_pred2)

041f930c2751b228133b94322682124a.png
4821f37e85cb08fed43509c6a1e825eb.png
464917bd0e8f4d5df151f4bf670f1166.png

6. ROC

如果你不使用OneVsRest Classifier,它不起作用......

from sklearn.multiclass import OneVsRestClassifierfrom sklearn.svm import LinearSVCclf = OneVsRestClassifier(LinearSVC(random_state=0))clf.fit(X_train, y_train)y_pred = clf.predict(X_test)
b5be7d30e3a3c43b0de0d42e43208a4b.png

现在我们将通过ROC Curve进行检查。

from sklearn.metrics import roc_curvefpr, tpr, thresholds = roc_curve(y_test, y_pred, pos_label=2)fpr, tpr, thresholds
6408e0e650b2697068fedcee64c4c71b.png
999d358e0c963280a2f64b3f5e8b621c.png

7. AUC:曲线下面积

from sklearn.metrics import aucauc(fpr, tpr)
5c29bb70f93e431a515f0cf58d08d4ed.png

>>> 0.913333... # auc

8.多类对数损失

这是一个概率。并且需要使用OneVsRestClassifier。

# clf = OneVsRestClassifier(LinearSVC(random_state=0))from sklearn.metrics import log_lossy_pred = clf.predict_proba(X_test) # not .predict()log_loss(y_test, y_pred)
9407916206b600c19feb9dee998f92df.png

>>> 0.09970990582482485

聚类度量

a3c8681f8a723762357ccbd7146ea8ae.gif

基本上在真正的聚类任务中,(我的意思是无监督聚类),我们没有任何方法来测量准确度或精度,因为没有人知道。

然而,作为分类任务的过程,有时我们使用有监督的聚类来了解数据的特征。(在实际工作中也是如此。)

因此,我将快速介绍一些监督聚类的指标。

我只使用了Iris数据集中的特征来解决聚类问题。

from sklearn.datasets import load_irisiris = load_iris()X, y = iris.data, iris.target
c773f50c1555d7186149bc66901cd39c.png

作为聚类问题的代表模型,这次我使用了K-means。

from sklearn.cluster import KMeanskmeans = KMeans(n_clusters=3, random_state=0)kmeans.fit(X)y_means = kmeans.predict(X)
04b5028653fb71b595f9316167bda712.png

现在,监督聚类的结果是在y_means中。

fe5265ac628e35989111fb960f69a523.png

同质性得分,Completeness Score,V度量得分

from sklearn.metrics import homogeneity_score, completeness_score, v_measure_score

hg = homogeneity_score(y, y_means)

co = completeness_score(y, y_means)

vm = v_measure_score(y, y_means)

print(hg, co, vm)

6900a1072100e5a9807fd689afe17dc6.png
9fa54290a9118dafa7f526880d4fc55c.png

附加:学习曲线可视化

from sklearn.model_selection import learning_curvefrom sklearn.model_selection import ShuffleSplitdef plot_learning_curve(clf, title, X, y, ylim=None, cv=None, n_jobs=None, train_sizes=np.linspace(.1, 1.0, 5)): plt.figure() plt.title(title) if ylim is not None: plt.ylim(*ylim) plt.xlabel("Training examples") plt.ylabel("Score") train_sizes, train_scores, test_scores = learning_curve( clf, X, y, cv=cv, n_jobs=n_jobs, train_sizes=train_sizes) train_scores_mean = np.mean(train_scores, axis=1) train_scores_std = np.std(train_scores, axis=1) test_scores_mean = np.mean(test_scores, axis=1) test_scores_std = np.std(test_scores, axis=1) plt.grid()plt.fill_between(train_sizes, train_scores_mean - train_scores_std, train_scores_mean + train_scores_std, alpha=0.1, color="r") plt.fill_between(train_sizes, test_scores_mean - test_scores_std, test_scores_mean + test_scores_std, alpha=0.1, color="g") plt.plot(train_sizes, train_scores_mean, 'o-', color="r
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值