【sklearn练习】模型评估

一、交叉验证 cross_val_score 的使用

1、不用交叉验证的情况:

from __future__ import print_function
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier

iris = load_iris()
X = iris.data
y = iris.target

# test train split #
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
print(knn.score(X_test, y_test))

输出结果:

0.9736842105263158

2、使用交叉验证

from sklearn.model_selection import cross_val_score
knn2 = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn2, X, y, cv=5, scoring='accuracy')
print(scores)

输出结果:

[0.96666667 1.         0.93333333 0.96666667 1.        ]

 

二、确定合适模型参数

1、迭代模型中n_neighbors参数

import matplotlib.pyplot as plt
k_range = range(1, 31)
k_scores = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
##    loss = -cross_val_score(knn, X, y, cv=10, scoring='mean_squared_error') # for regression
    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') # for classification
    k_scores.append(scores.mean())

plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')
plt.show()

画出scores为:

ce889b6b88cc4b9d86c6e217eb634c37.png

下面是画loss的代码:

k_range = range(1, 31)
k_loss = []
for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    loss = -cross_val_score(knn, X, y, cv=10, scoring='neg_mean_squared_error') # for regression
    ##    scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy') # for classification
    k_loss.append(loss.mean())

plt.plot(k_range, k_loss)
plt.xlabel('Value of K for KNN')
plt.ylabel('neg_mean_squared_error')
plt.show()

画出loss为:

b185390e5d604a64bc7809c22d1d1772.png

 

三、cross_val_score  中的  scoring参数(本标题内容可删,可以是一个链接插入解释这个参数即可)

cross_val_score 函数中的 scoring 参数用于指定评估模型性能的评分指标。评分指标是用来衡量模型预测结果与真实结果之间的匹配程度的方法。在机器学习任务中,选择合适的评分指标对于模型的评估和选择非常重要,因为不同的任务和数据可能需要不同的评估标准。以下是一些常见的评分指标以及它们在 cross_val_score 中的使用方式:

  1. 分类问题的评分指标

    • scoring="accuracy":用于多类分类问题,计算正确分类的样本比例。
    • scoring="precision":计算正类别预测的精确度,即正类别的真正例与所有正类别预测的样本之比。
    • scoring="recall":计算正类别预测的召回率,即正类别的真正例与所有真实正类别的样本之比。
    • scoring="f1":计算 F1 分数,它是精确度和召回率的调和均值,用于综合考虑模型的性能。

    示例使用方法:

    from sklearn.model_selection import cross_val_score
    
    scores_accuracy = cross_val_score(estimator, X, y, cv=5, scoring="accuracy")
    scores_precision = cross_val_score(estimator, X, y, cv=5, scoring="precision")
    scores_recall = cross_val_score(estimator, X, y, cv=5, scoring="recall")
    scores_f1 = cross_val_score(estimator, X, y, cv=5, scoring="f1")
    

     

  2. 回归问题的评分指标

    • scoring="neg_mean_squared_error":用于回归问题,计算负均方误差(Negative Mean Squared Error),即平均预测值与真实值的平方差。
    • scoring="r2":计算决定系数(R-squared),用于度量模型对目标变量的解释方差程度,取值范围在0到1之间。

    示例使用方法:

    from sklearn.model_selection import cross_val_score
    
    scores_mse = cross_val_score(estimator, X, y, cv=5, scoring="neg_mean_squared_error")
    scores_r2 = cross_val_score(estimator, X, y, cv=5, scoring="r2")
    

     

  3. 其他评分指标

    • 除了上述常见的评分指标外,还可以使用其他自定义评分函数或指标,例如 AUC、log损失等,只需将评分函数传递给 scoring 参数即可。

    示例使用方法:

    from sklearn.metrics import roc_auc_score
    from sklearn.model_selection import cross_val_score
    
    scoring_function = make_scorer(roc_auc_score)
    scores_auc = cross_val_score(estimator, X, y, cv=5, scoring=scoring_function)
    

根据任务和数据类型,选择适当的评分指标非常重要,它有助于衡量模型的性能,确定模型是否满足预期的要求,并在不同模型之间进行比较和选择。不同的评分指标可以反映模型性能的不同方面,因此需要根据具体情况进行选择。

 

四、learning_curve函数的使用

1、learning_curve函数功能

learning_curve 是一个用于评估机器学习模型性能的可视化工具。它通常用于了解模型在不同训练数据集大小下的性能变化,以帮助决定是否需要更多的训练数据或模型是否已经过拟合。learning_curve 可以帮助你可视化训练集和验证集上的性能指标,通常是准确性(accuracy)或损失函数(loss)随着训练数据集大小的变化而变化的情况。

在 Python 中,可以使用 sklearn.model_selection.learning_curve 函数来创建学习曲线。

 

2、例子

代码:

from __future__ import print_function
from sklearn.model_selection import learning_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

digits = load_digits()
X = digits.data
y = digits.target
train_sizes, train_loss, test_loss = learning_curve(
        SVC(gamma=0.001), X, y, cv=10, scoring='neg_mean_squared_error',
        train_sizes=[0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)

plt.plot(train_sizes, train_loss_mean, 'o-', color="r",
             label = "Training")
plt.plot(train_sizes, test_loss_mean, 'o-', color="g",
             label = "Cross-validation")

plt.xlabel("Training examples")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

结果为:

cbb29558e7234fa19120d0625e0f23e3.png

 

当把SVC的参数gamma改为0.01后执行程序得到结果为:

bf6265422e2e4d2dacee793364608e4a.png

可见,对于训练集,模型更加精确了,损失很少,但对于测试集,损失很大,且随着训练的进行损失不会下降,发生了过拟合,gamma参数的作用为【问GPT】。

五、解决过拟合(validation_curve函数的使用)

1、validation_curve函数功能

validation_curve 函数是 scikit-learn(sklearn)库中的一个工具函数,用于评估模型在不同超参数设置下的性能,并帮助你找到最优的超参数配置。它的主要功能是绘制不同超参数值的模型性能曲线,以便你可以直观地看到模型性能如何随着超参数的变化而变化。

validation_curve 函数通常用于调整模型的超参数,例如正则化参数、决策树深度、学习率等。它帮助你了解不同超参数值对模型性能的影响,以便选择最佳的超参数配置。

以下是 validation_curve 函数的一些关键参数:

  1. estimator:要评估的机器学习模型,通常是一个分类器或回归器的实例

  2. X:特征矩阵,包含输入样本的特征值

  3. y:目标向量,包含对应于输入样本的目标值或标签

  4. param_name:要调整的超参数的名称,例如正则化参数、树的深度等。

  5. param_range:超参数的一组不同取值。validation_curve 将在这些不同的取值上评估模型性能。

  6. scoring:用于评估模型性能的评分指标,例如准确度(accuracy)、均方误差(MSE)、F1 分数等。

  7. cv:交叉验证的折数,用于计算性能的平均值和标准差。

  8. n_jobs:并行计算的数量,用于加速计算。

validation_curve 函数返回一个包含训练得分和验证得分的数组,以及对应于每个超参数值的均值和标准差。这些信息可以用于绘制性能曲线,以便可视化超参数的选择。

2、迭代gamma的值,选择合适的gamma:

代码:

from __future__ import print_function
from sklearn.model_selection import validation_curve
from sklearn.datasets import load_digits
from sklearn.svm import SVC
import matplotlib.pyplot as plt
import numpy as np

digits = load_digits()
X = digits.data
y = digits.target
param_range = np.logspace(-6, -2.3, 5)
train_loss, test_loss = validation_curve(
        SVC(), X, y, param_name='gamma', param_range=param_range, cv=10,
        scoring='neg_mean_squared_error')
train_loss_mean = -np.mean(train_loss, axis=1)
test_loss_mean = -np.mean(test_loss, axis=1)

plt.plot(param_range, train_loss_mean, 'o-', color="r",
             label="Training")
plt.plot(param_range, test_loss_mean, 'o-', color="g",
             label="Cross-validation")

plt.xlabel("gamma")
plt.ylabel("Loss")
plt.legend(loc="best")
plt.show()

结果为:

12e91a1fa23642688ac922dc6cd0db98.png

 

 

 

 

 

 

 

  • 18
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值