简介
在机器学习中,模型选择是为给定数据集选择最佳模型的过程。它涉及选择合适的估计器并调整其参数以实现最佳性能。本教程将指导你完成 scikit-learn 中的模型选择过程。
虚拟机使用提示
虚拟机启动完成后,点击左上角切换到“笔记本”标签页,以访问 Jupyter Notebook 进行练习。
有时,你可能需要等待几秒钟让 Jupyter Notebook 完成加载。由于 Jupyter Notebook 的限制,操作验证无法自动化。
如果你在学习过程中遇到问题,随时向 Labby 提问。课程结束后提供反馈,我们会及时为你解决问题。
评分与交叉验证评分
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 中的模型选择过程。我们探讨了评分方法、交叉验证、网格搜索和交叉验证估计器。通过遵循这些步骤,你可以为给定数据集选择最佳估计器,并调整其参数以实现最佳性能。