模型选择:选择估计器及其参数

Machine LearningMachine LearningBeginner
立即练习

This tutorial is from open-source community. Access the source code

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

在机器学习中,模型选择是为给定数据集选择最佳模型的过程。它涉及选择合适的估计器并调整其参数以实现最佳性能。本教程将指导你完成 scikit-learn 中的模型选择过程。

虚拟机使用提示

虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。

有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。

如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/model_selection("Model Selection") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/model_selection -.-> lab-71098{{"模型选择:选择估计器及其参数"}} ml/sklearn -.-> lab-71098{{"模型选择:选择估计器及其参数"}} end

评分与交叉验证评分

scikit-learn 中的估计器公开了一个 score 方法,可用于评估模型对新数据的拟合质量或预测质量。此方法返回一个分数,分数越高表示性能越好。

from sklearn import datasets, svm

## 加载数字数据集
X_digits, y_digits = datasets.load_digits(return_X_y=True)

## 创建一个具有线性核的支持向量机分类器
svc = svm.SVC(C=1, kernel='linear')

## 在训练数据上拟合分类器,并计算在测试数据上的分数
score = svc.fit(X_digits[:-100], y_digits[:-100]).score(X_digits[-100:], y_digits[-100:])

为了更好地衡量预测准确性,我们可以使用交叉验证。交叉验证包括将数据拆分为多个折,将每个折用作测试集,其余折用作训练集。此过程重复多次,并对分数求平均值以获得整体性能。

import numpy as np

## 将数据拆分为3折
X_folds = np.array_split(X_digits, 3)
y_folds = np.array_split(y_digits, 3)

## 执行交叉验证
scores = []
for k in range(3):
    X_train = list(X_folds)
    X_test = X_train.pop(k)
    X_train = np.concatenate(X_train)
    y_train = list(y_folds)
    y_test = y_train.pop(k)
    y_train = np.concatenate(y_train)
    scores.append(svc.fit(X_train, y_train).score(X_test, y_test))

print(scores)

交叉验证生成器

Scikit-learn 提供了一系列类,可用于为常见的交叉验证策略生成训练/测试索引。这些类有一个 split 方法,该方法接受输入数据集,并为交叉验证过程的每次迭代生成训练/测试集索引。

from sklearn.model_selection import KFold

## 使用 KFold 交叉验证将数据拆分为 K 折
k_fold = KFold(n_splits=5)
for train_indices, test_indices in k_fold.split(X_digits):
    print(f'训练集: {train_indices} | 测试集: {test_indices}')

cross_val_score 辅助函数可用于直接计算交叉验证分数。它在交叉验证的每次迭代中将数据拆分为训练集和测试集,在训练集上训练估计器,并根据测试集计算分数。

from sklearn.model_selection import cross_val_score

## 计算支持向量机分类器的交叉验证分数
scores = cross_val_score(svc, X_digits, y_digits, cv=k_fold, n_jobs=-1)
print(scores)

网格搜索

网格搜索是一种可用于找到估计器参数值最佳组合的技术。它包括指定一个参数值网格,针对每个参数组合在训练数据上拟合估计器,并选择能产生最高交叉验证分数的参数。

from sklearn.model_selection import GridSearchCV

## 定义一个参数值网格
Cs = np.logspace(-6, -1, 10)

## 使用支持向量机分类器和参数网格创建一个GridSearchCV对象
clf = GridSearchCV(estimator=svc, param_grid=dict(C=Cs), n_jobs=-1)

## 在训练数据上拟合GridSearchCV对象
clf.fit(X_digits[:1000], y_digits[:1000])

print(clf.best_score_)
print(clf.best_estimator_.C)

交叉验证估计器

scikit-learn 中的一些估计器具有内置的交叉验证功能。这些经过交叉验证的估计器通过交叉验证自动选择其参数,从而使模型选择过程更加高效。

from sklearn import linear_model, datasets

## 创建一个 LassoCV 对象
lasso = linear_model.LassoCV()

## 加载糖尿病数据集
X_diabetes, y_diabetes = datasets.load_diabetes(return_X_y=True)

## 在数据集上拟合 LassoCV 对象
lasso.fit(X_diabetes, y_diabetes)

print(lasso.alpha_)

总结

在本教程中,我们学习了 scikit-learn 中的模型选择过程。我们探讨了评分方法、交叉验证、网格搜索和交叉验证估计器。通过遵循这些步骤,你可以为给定数据集选择最佳估计器,并调整其参数以实现最佳性能。