https://scikit-learn.org/stable/modules/classes.html#module-sklearn.model_selection
用户指南:请参阅交叉验证:评估估计器性能,调整估计器的超参数和 学习曲线部分,以了解更多详细信息。
某些模型可以为某个参数的某个值范围拟合数据,其效率几乎与为一个参数的单个值拟合估算值的效率相同。可以利用此功能来执行更有效的交叉验证,以用于此参数的模型选择。
https://scikit-learn.org/stable/modules/model_evaluation.html#
有3种不同的API可用于评估模型预测的质量:
最后,虚拟估计器对于获取这些度量的基准值以进行随机预测很有用。
模型选择和评估使用工具,如 model_selection.GridSearchCV和 model_selection.cross_val_score,取一scoring参数,用于评估估计什么指标控制。
该模块sklearn.metrics还提供了一组简单的函数,这些函数在给定地面真实性和预测的情况下测量预测误差:
以下各节详细介绍了可用于各种机器学习任务的指标。
许多度量未指定名称用作scoring值,有时是因为它们需要其他参数,例如 fbeta_score。在这种情况下,您需要生成一个适当的计分对象。生成可计分对象进行评分的最简单方法是使用make_scorer。该函数将指标转换为可用于模型评估的可调用对象。
一种典型的用例是使用非默认值为其参数包装库中的现有度量标准函数,例如beta该fbeta_score函数的参数:
>>> from sklearn.metrics import fbeta_score, make_scorer
>>> ftwo_scorer = make_scorer(fbeta_score, beta=2)
>>> from sklearn.model_selection import GridSearchCV
>>> from sklearn.svm import LinearSVC
>>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]},
... scoring=ftwo_scorer, cv=5)
第二个用例是使用make_scorer,从一个简单的python函数构 建一个完全自定义的Scorer对象,该函数可以采用多个参数:
以下是构建自定义评分器并使用greater_is_better参数的示例 :
>>> import numpy as np
>>> def my_custom_loss_func(y_true, y_pred):
... diff = np.abs(y_true - y_pred).max()
... return np.log1p(diff)
...
>>> # score will negate the return value of my_custom_loss_func,
>>> # which will be np.log(2), 0.693, given the values for X
>>> # and y defined below.
>>> score = make_scorer(my_custom_loss_func, greater_is_better=False)
>>> X = [[1], [1]]
>>> y = [0, 1]
>>> from sklearn.dummy import DummyClassifier
>>> clf = DummyClassifier(strategy='most_frequent', random_state=0)
>>> clf = clf.fit(X, y)
>>> my_custom_loss_func(clf.predict(X), y)
0.69...
>>> score(clf, X, y)
-0.69...
您无需使用make_scorer工厂就可以从头开始构建自己的评分对象,从而生成更加灵活的模型评分器。要使可呼叫者成为记分员,它需要满足以下两个规则所指定的协议:
>>> from custom_scorer_module import custom_scoring_function
>>> cross_val_score(model,
... X_train,
... y_train,
... scoring=make_scorer(custom_scoring_function, greater_is_better=False),
... cv=5,
... n_jobs=-1)
Scikit学习也允许在多个指标的评估GridSearchCV, RandomizedSearchCV和cross_validate。
有两种方法可以为scoring 参数指定多个评分指标:
>>> scoring = ['accuracy', 'precision']
>>> from sklearn.metrics import accuracy_score
>>> from sklearn.metrics import make_scorer
>>> scoring = {'accuracy': make_scorer(accuracy_score),
... 'prec': 'precision'}
请注意,字典值可以是记分器功能或预定义的度量标准字符串之一。
当前,只有返回单个分数的那些计分器函数才能在dict中传递。不允许返回多个值的记分器函数,并且需要包装器返回单个度量标准:
>>> from sklearn.model_selection import cross_validate
>>> from sklearn.metrics import confusion_matrix
>>> # A sample toy binary classification dataset
>>> X, y = datasets.make_classification(n_classes=2, random_state=0)
>>> svm = LinearSVC(random_state=0)
>>> def tn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 0]
>>> def fp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[0, 1]
>>> def fn(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 0]
>>> def tp(y_true, y_pred): return confusion_matrix(y_true, y_pred)[1, 1]
>>> scoring = {'tp': make_scorer(tp), 'tn': make_scorer(tn),
... 'fp': make_scorer(fp), 'fn': make_scorer(fn)}
>>> cv_results = cross_validate(svm.fit(X, y), X, y, cv=5, scoring=scoring)
>>> # Getting the test set true positive scores
>>> print(cv_results['test_tp'])
[10 9 8 7 8]
>>> # Getting the test set false negative scores
>>> print(cv_results['test_fn'])
[0 1 2 3 2]
其中一些仅限于二进制分类的情况:
其他也可以在多类情况下工作:
有些在多标签的情况下也可以使用:
还有一些解决二进制和多标签(但不是多类)问题的方法:
**包含DummyClassifier和DummyRegressor。**提供了简单的分类和回归策略。其他算法如果效果不如Dummy estimators或与之相当,则说明有问题:如模型选择不正确/超参数未正确调整/数据不平衡等。
在进行监督学习时,简单的健全性检查包括将自己的估计量与简单的经验法则进行比较。DummyClassifier 实现几种简单的分类策略:
请注意,使用所有这些策略,该predict方法将完全忽略输入数据!
为了说明这一点DummyClassifier,首先让我们创建一个不平衡的数据集:
>>> from sklearn.datasets import load_iris
>>> from sklearn.model_selection import train_test_split
>>> X, y = load_iris(return_X_y=True)
>>> y[y != 1] = -1
>>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
接下来,让我们比较的准确性SVC和most_frequent:
>>> from sklearn.dummy import DummyClassifier
>>> from sklearn.svm import SVC
>>> clf = SVC(kernel='linear', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.63...
>>> clf = DummyClassifier(strategy='most_frequent', random_state=0)
>>> clf.fit(X_train, y_train)
DummyClassifier(random_state=0, strategy='most_frequent')
>>> clf.score(X_test, y_test)
0.57...
我们看到这SVC并没有比虚拟分类器好得多。现在,让我们更改内核:
>>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.94...
我们看到准确性提高到几乎100%。如果CPU成本不是很高,建议使用交叉验证策略以更好地估计准确性。有关更多信息,请参见“ 交叉验证:评估估计器性能” 部分。此外,如果要在参数空间上进行优化,强烈建议使用适当的方法。 有关详细信息,请参见调整估计器的超参数部分。
更一般而言,当分类器的准确性太接近随机性时,这可能意味着出了点问题:功能无济于事,超参数未正确调整,分类器正遭受类不平衡之苦,等等……
DummyRegressor 还实现了四个简单的回归经验法则:
在所有这些策略中,该predict方法完全忽略了输入数据。