【sklearn练习】模型评估

一、交叉验证 cross_val_score 的使用

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

python 复制代码
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))

输出结果:

python 复制代码
0.9736842105263158

2、使用交叉验证

python 复制代码
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)

输出结果:

python 复制代码
[0.96666667 1.         0.93333333 0.96666667 1.        ]

二、确定合适模型参数

1、迭代模型中n_neighbors参数

python 复制代码
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为:

下面是画loss的代码:

python 复制代码
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为:

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

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

  1. 分类问题的评分指标

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

    示例使用方法:

    python 复制代码
    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之间。

    示例使用方法:

    python 复制代码
    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 参数即可。

    示例使用方法:

    python 复制代码
    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、例子

代码:

python 复制代码
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()

结果为:

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

可见,对于训练集,模型更加精确了,损失很少,但对于测试集,损失很大,且随着训练的进行损失不会下降,发生了过拟合,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:

代码:

python 复制代码
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()

结果为:

相关推荐
lisw053 小时前
知识管理与AI奇点有何关系?
人工智能·机器学习
dazzle3 小时前
机器学习算法原理与实践-入门(七):深度学习框架PyTorch的Tensor
深度学习·算法·机器学习
zbdx不知名菜鸡3 小时前
SwanLab 在监控什么?
人工智能·算法·机器学习
枫叶林FYL4 小时前
【自然语言处理 NLP】深度学习与表示学习
人工智能·深度学习·机器学习
AI科技星4 小时前
基于空间光速螺旋第一性原理的电荷本源定义与电场时空协变方程的完整推导、严格证明及全尺度数值验证
c语言·开发语言·算法·机器学习·数据挖掘
tobias.b4 小时前
大数据与机器学习的联系
大数据·人工智能·机器学习
youyoulg5 小时前
无监督学习—聚类
人工智能·机器学习·支持向量机
放下华子我只抽RuiKe56 小时前
NLP自然语言处理硬核实战笔记
前端·人工智能·机器学习·自然语言处理·开源·集成学习·easyui
Zero6 小时前
机器学习概率论与统计学--(3)概率论:随机变量
机器学习·概率论·随机变量·统计学