有三种不一样的方法来评估一个模型的预测质量:html
模型选择和评估工具,例如: grid_search.GridSearchCV 和 cross_validation.cross_val_score,使用scoring参数来控制你的estimator的好坏。python
对于大多数case而说,你能够设计一个使用scoring参数的scorer对象;下面展现了全部可能的值。全部的scorer对象都遵循:高得分,更好效果。若是从mean_absolute_error 和mean_squared_error(它计算了模型与数据间的距离)返回的得分将被忽略。git
sklearn.metric提供了一些函数,用来计算真实值与预测值之间的预测偏差:数组
接下去会讨论多种机器学习当中的metrics。网络
许多metrics并无给出在scoring参数中可配置的字符名,由于有时你可能须要额外的参数,好比:fbeta_score。这种状况下,你须要生成一个合适的scorer对象。最简单的方法是调用make_scorer来生成scoring对象。该函数将metrics转换成在模型评估中可调用的对象。app
第一个典型的用例是,将一个库中已经存在的metrics函数进行包装,使用定制参数,好比对fbeta_score函数中的beta参数进行设置:cors
>>> from sklearn.metrics import fbeta_score, make_scorer >>> ftwo_scorer = make_scorer(fbeta_score, beta=2) >>> from sklearn.grid_search import GridSearchCV >>> from sklearn.svm import LinearSVC >>> grid = GridSearchCV(LinearSVC(), param_grid={'C': [1, 10]}, scoring=ftwo_scorer)
第二个典型用例是,经过make_scorer构建一个完整的定制scorer函数,该函数能够带有多个参数:dom
下例使用定制的scorer,使用了greater_is_better参数:机器学习
>>> import numpy as np >>> def my_custom_loss_func(ground_truth, predictions): ... diff = np.abs(ground_truth - predictions).max() ... return np.log(1 + diff) ... >>> loss = make_scorer(my_custom_loss_func, greater_is_better=False) >>> score = make_scorer(my_custom_loss_func, greater_is_better=True) >>> ground_truth = [[1, 1]] >>> predictions = [0, 1] >>> from sklearn.dummy import DummyClassifier >>> clf = DummyClassifier(strategy='most_frequent', random_state=0) >>> clf = clf.fit(ground_truth, predictions) >>> loss(clf,ground_truth, predictions) -0.69... >>> score(clf,ground_truth, predictions) 0.69...
你能够生成更灵活的模型scorer,经过从头构建本身的scoring对象来完成,不须要使用make_scorer工厂函数。对于一个本身实现的scorer来讲,它须要遵循两个原则:函数
sklearn.metrics模块实现了一些loss, score以及一些工具函数来计算分类性能。一些metrics可能须要正例、置信度、或二分决策值的的几率估计。大多数实现容许每一个sample提供一个对总体score来讲带权重的分布,经过sample_weight参数完成。
一些二分类(binary classification)使用的case:
一些多分类(multiclass)使用的case:
一些多标签(multilabel)的case:
还有一些能够同时用于二标签和多标签(不是多分类)问题:
在如下的部分,咱们将讨论各个函数。
对于二分类来讲,必须定义一些matrics(f1_score,roc_auc_score)。在这些case中,缺省只评估正例的label,缺省的正例label被标为1(能够经过配置pos_label参数来完成)
将一个二分类matrics拓展到多分类或多标签问题时,咱们能够将数据当作多个二分类问题的集合,每一个类都是一个二分类。接着,咱们能够经过跨多个分类计算每一个二分类metrics得分的均值,这在一些状况下颇有用。你可使用average参数来指定。
多分类(multiclass)数据提供了metric,和二分类相似,是一个label的数组,而多标签(multilabel)数据则返回一个索引矩阵,当样本i具备label j时,元素[i,j]的值为1,不然为0.
accuracy_score函数计算了准确率,不论是正确预测的fraction(default),仍是count(normalize=False)。
在multilabel分类中,该函数会返回子集的准确率。若是对于一个样原本说,必须严格匹配真实数据集中的label,整个集合的预测标签返回1.0;不然返回0.0.
预测值与真实值的准确率,在n个样本下的计算公式以下:
1(x)为指示函数。
>>> import numpy as np >>> from sklearn.metrics import accuracy_score >>> y_pred = [0, 2, 1, 3] >>> y_true = [0, 1, 2, 3] >>> accuracy_score(y_true, y_pred) 0.5 >>> accuracy_score(y_true, y_pred, normalize=False) 2
在多标签的case下,二分类label:
>>> accuracy_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) 0.5
函数cohen_kappa_score计算了Cohen’s kappa估计。这意味着须要比较经过不一样的人工标注(numan annotators)的标签,而非分类器中正确的类。
kappa score是一个介于(-1, 1)之间的数. score>0.8意味着好的分类;0或更低意味着很差(实际是随机标签)
Kappa score能够用在二分类或多分类问题上,但不适用于多标签问题,以及超过两种标注的问题。
confusion_matrix函数经过计算混淆矩阵,用来计算分类准确率。
缺省的,在混淆矩阵中的i,j指的是观察的数目i,预测为j,示例:
>>> from sklearn.metrics import confusion_matrix >>> y_true = [2, 0, 2, 2, 0, 1] >>> y_pred = [0, 0, 2, 2, 0, 2] >>> confusion_matrix(y_true, y_pred) array([[2, 0, 0], [0, 0, 1], [1, 0, 2]])
结果为:
示例:
classification_report函数构建了一个文本报告,用于展现主要的分类metrics。 下例给出了一个小示例,它使用定制的target_names和对应的label:
>>> from sklearn.metrics import classification_report >>> y_true = [0, 1, 2, 2, 0] >>> y_pred = [0, 0, 2, 2, 0] >>> target_names = ['class 0', 'class 1', 'class 2'] >>> print(classification_report(y_true, y_pred, target_names=target_names)) precision recall f1-score support class 0 0.67 1.00 0.80 2 class 1 0.00 0.00 0.00 1 class 2 1.00 1.00 1.00 2 avg / total 0.67 0.80 0.72 5
示例:
hamming_loss计算了在两个样本集里的平均汉明距离或平均Hamming loss。
那么两个样本间的Hamming loss为,定义以下:
其中:为指示函数。
>>> from sklearn.metrics import hamming_loss >>> y_pred = [1, 2, 3, 4] >>> y_true = [2, 2, 3, 4] >>> hamming_loss(y_true, y_pred) 0.25
在多标签(multilabel)的使用二元label指示器的状况:
>>> hamming_loss(np.array([[0, 1], [1, 1]]), np.zeros((2, 2))) 0.75
注意:在多分类问题上,Hamming loss与y_true 和 y_pred 间的Hamming距离相关,它与0-1 loss相相似。然而,0-1 loss会对不严格与真实数据集相匹配的预测集进行惩罚。于是,Hamming loss,做为0-1 loss的上界,也在0和1之间;预测一个合适的真实label的子集或超集将会给出一个介于0和1之间的Hamming loss.
jaccard_similarity_score函数会计算两对label集之间的Jaccard类似度系数的平均(缺省)或求和。它也被称为Jaccard index.
第i个样本的Jaccard类似度系数(Jaccard similarity coefficient),真实标签集为,预测标签集为:
,其定义以下:
在二分类和多分类问题上,Jaccard类似度系数score与分类的正确率(accuracy)相同:
>>> import numpy as np >>> from sklearn.metrics import jaccard_similarity_score >>> y_pred = [0, 2, 1, 3] >>> y_true = [0, 1, 2, 3] >>> jaccard_similarity_score(y_true, y_pred) 0.5 >>> jaccard_similarity_score(y_true, y_pred, normalize=False) 2
在多标签(multilabel)问题上,使用二元标签指示器:
>>> jaccard_similarity_score(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) 0.75
准确率(precision)能够衡量一个样本为负的标签被判成正,召回率(recall)用于衡量全部正例。
F-meature(包括:和
),能够认为是precision和recall的加权调和平均(weighted harmonic mean)。一个
值,最佳为1,最差时为0. 若是
=1,那么
和
相等,precision和recall的权重相等。
precision_recall_curve会根据预测值和真实值来计算一条precision-recall典线。
average_precision_score则会预测值的平均准确率(AP: average precision)。该分值对应于precision-recall曲线下的面积。
sklearn提供了一些函数来分析precision, recall and F-measures值:
注意:precision_recall_curve只用于二分类中。而average_precision_score可用于二分类或multilabel指示器格式
示例:
在二元分类中,术语“positive”和“negative”指的是分类器的预测类别(expectation),术语“true”和“false”则指的是预测是否正确(有时也称为:观察observation)。给出以下的定义:
实际类目(observation) | ||
---|---|---|
预测类目(expectation) | TP(true positive)结果:Correct | FP(false postive)结果:Unexpected |
FN(false negative)结果: Missing | TN(true negtive)结果:Correct |
在这个上下文中,咱们定义了precision, recall和F-measure:
这里是一个二元分类的示例:
>>> from sklearn import metrics >>> y_pred = [0, 1, 0, 0] >>> y_true = [0, 1, 0, 1] >>> metrics.precision_score(y_true, y_pred) 1.0 >>> metrics.recall_score(y_true, y_pred) 0.5 >>> metrics.f1_score(y_true, y_pred) 0.66... >>> metrics.fbeta_score(y_true, y_pred, beta=0.5) 0.83... >>> metrics.fbeta_score(y_true, y_pred, beta=1) 0.66... >>> metrics.fbeta_score(y_true, y_pred, beta=2) 0.55... >>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5) (array([ 0.66..., 1. ]), array([ 1. , 0.5]), array([ 0.71..., 0.83...]), array([2, 2]...)) >>> import numpy as np >>> from sklearn.metrics import precision_recall_curve >>> from sklearn.metrics import average_precision_score >>> y_true = np.array([0, 0, 1, 1]) >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> precision, recall, threshold = precision_recall_curve(y_true, y_scores) >>> precision array([ 0.66..., 0.5 , 1. , 1. ]) >>> recall array([ 1. , 0.5, 0.5, 0. ]) >>> threshold array([ 0.35, 0.4 , 0.8 ]) >>> average_precision_score(y_true, y_scores) 0.79...
在多分类(Multiclass)和多标签(multilabel)分类问题上,precision, recall, 和 F-measure的概念能够独立应用到每一个label上。有一些方法能够综合各标签上的结果,经过指定average_precision_score (只能用在multilabel上), f1_score, fbeta_score, precision_recall_fscore_support, precision_score 和 recall_score这些函数上的参数average能够作到。
注意:
能够考虑下面的概念:
metrics的定义以下:
代码:
>>> from sklearn import metrics >>> y_true = [0, 1, 2, 0, 1, 2] >>> y_pred = [0, 2, 1, 0, 0, 1] >>> metrics.precision_score(y_true, y_pred, average='macro') 0.22... >>> metrics.recall_score(y_true, y_pred, average='micro') ... 0.33... >>> metrics.f1_score(y_true, y_pred, average='weighted') 0.26... >>> metrics.fbeta_score(y_true, y_pred, average='macro', beta=0.5) 0.23... >>> metrics.precision_recall_fscore_support(y_true, y_pred, beta=0.5, average=None) ... (array([ 0.66..., 0. , 0. ]), array([ 1., 0., 0.]), array([ 0.71..., 0. , 0. ]), array([2, 2, 2]...))
对于多分类问题,对于一个“negative class”,有可能会排除一些标签:
>>> metrics.recall_score(y_true, y_pred, labels=[1, 2], average='micro') ... # excluding 0, no labels were correctly recalled 0.0
相似的,在数据集样本中没有出现的label不能用在macro-averaging中。
>>> metrics.precision_score(y_true, y_pred, labels=[0, 1, 2, 3], average='macro') ... 0.166...
hinge_loss函数会使用hinge loss计算模型与数据之间的平均距离。它是一个单边的metric,只在预测错误(prediction erros)时考虑。(Hinge loss被用于最大间隔分类器上:好比SVM)
若是label使用+1和-1进行编码。y为真实值,w为由decision_function结出的预测决策。 hinge loss的定义以下:
若是超过两个label,因为Crammer & Singer所提到的问题 ,hinge_loss 会使用一个多元分类的变种。
若是是对于true label的预测判断(predicted decision),
则是对于其余label的预测判断的最大值,而predicted decisions由多个predicted decision输出,那么多分类的hinge loss定义以下:
二分类问题示例:
>>> from sklearn import svm >>> from sklearn.metrics import hinge_loss >>> X = [[0], [1]] >>> y = [-1, 1] >>> est = svm.LinearSVC(random_state=0) >>> est.fit(X, y) LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=0, tol=0.0001, verbose=0) >>> pred_decision = est.decision_function([[-2], [3], [0.5]]) >>> pred_decision array([-2.18..., 2.36..., 0.09...]) >>> hinge_loss([-1, 1, 1], pred_decision) 0.3...
多分类问题示例:
>>> X = np.array([[0], [1], [2], [3]]) >>> Y = np.array([0, 1, 2, 3]) >>> labels = np.array([0, 1, 2, 3]) >>> est = svm.LinearSVC() >>> est.fit(X, Y) LinearSVC(C=1.0, class_weight=None, dual=True, fit_intercept=True, intercept_scaling=1, loss='squared_hinge', max_iter=1000, multi_class='ovr', penalty='l2', random_state=None, tol=0.0001, verbose=0) >>> pred_decision = est.decision_function([[-1], [2], [3]]) >>> y_true = [0, 2, 3] >>> hinge_loss(y_true, pred_decision, labels) 0.56...
Log loss也被称为logistic回归loss,或者交叉熵loss(cross-entropy loss),用于几率估计。它一般用在(multinomial)的LR和神经网络上,以最大指望(EM:expectation-maximization)的变种的方式,用于评估一个分类器的几率输出,而非进行离散预测。
对于二元分类,true label为:,几率估计为:
,每一个样本的log loss是对分类器给定true label的负值log似然估计(negative log-likelihood):
当扩展到多元分类(multiclass)上时。能够将样本的true label编码成1-of-K个二元指示器矩阵Y,若是从label K集合中取出的样本i,对应的label为k,则,P为几率估计矩阵,
。整个集合的log loss表示以下:
咱们再看下如何对二分类的log loss进行泛化的,注意,在二分类问题上, 和
,于是,经过在
扩展内部和来给出二分类的log loss。
log_loss函数,经过给定一列真实值label和一个几率矩阵来计算log loss,返回值经过estimator的predict_proba返回。
>>> from sklearn.metrics import log_loss >>> y_true = [0, 0, 1, 1] >>> y_pred = [[.9, .1], [.8, .2], [.3, .7], [.01, .99]] >>> log_loss(y_true, y_pred) 0.1738...
y_pred中的[.9, .1]指的是,第一个样本中90%的几率是label 0。另外,log loss是非负的。
matthews_corrcoef函数计算了二元分类的Matthew’s correlation coefficient (MCC).
wikipedia是这么说的:
“The Matthews correlation coefficient is used in machine learning as a measure of the quality of binary (two-class) classifications. It takes into account true and false positives and negatives and is generally regarded as a balanced measure which can be used even if the classes are of very different sizes. The MCC is in essence a correlation coefficient value between -1 and +1. A coefficient of +1 represents a perfect prediction, 0 an average random prediction and -1 an inverse prediction. The statistic is also known as the phi coefficient.”
翻译以下:
机器学习中使用的Matthews相关系数,用于度量二分类的质量。它会考虑TP/FP/TN/FP的状况,一般被认为是一个balanced的度量 ,能够用于那些有着不一样size的分类中。MCC本质上是一个介于[-1,+1]之间的相关系数值。相关系数为+1,表示是一个完美的预测,0表示是一个平均随机预测(average random prediction),而-1表示是一个逆预测(inverse prediction)。这种统计方法也被称为:phi coefficient。
MCC相应的定义以下:
这里的示例展现了matthews_corrcoef 函数的使用:
>>> from sklearn.metrics import matthews_corrcoef >>> y_true = [+1, +1, +1, -1] >>> y_pred = [+1, -1, +1, +1] >>> matthews_corrcoef(y_true, y_pred) -0.33...
roc_curve计算了ROC曲线。Wikipedia以下:
“A receiver operating characteristic (ROC), or simply ROC curve, is a graphical plot which illustrates the performance of a binary classifier system as its discrimination threshold is varied. It is created by plotting the fraction of true positives out of the positives (TPR = true positive rate) vs. the fraction of false positives out of the negatives (FPR = false positive rate), at various threshold settings. TPR is also known as sensitivity, and FPR is one minus the specificity or true negative rate.”
该函数须要二分类的真实值和预测值,它能够是正例的几率估计,置信值,或二分决策值。下例展现了如何使用:
>>> import numpy as np >>> from sklearn.metrics import roc_curve >>> y = np.array([1, 1, 2, 2]) >>> scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> fpr, tpr, thresholds = roc_curve(y, scores, pos_label=2) >>> fpr array([ 0. , 0.5, 0.5, 1. ]) >>> tpr array([ 0.5, 0.5, 1. , 1. ]) >>> thresholds array([ 0.8 , 0.4 , 0.35, 0.1 ])
下图展下了上面的结果:
roc_auc_score函数计算了ROC曲线下面的面积,它也被称为AUC或AUROC。经过计算下面的面积,曲线信息被归一化到1内。
>>> import numpy as np >>> from sklearn.metrics import roc_auc_score >>> y_true = np.array([0, 0, 1, 1]) >>> y_scores = np.array([0.1, 0.4, 0.35, 0.8]) >>> roc_auc_score(y_true, y_scores) 0.75
在多标签(multi-label)分类上,roc_auc_score经过对上面的label进行平均。
对比于其它metrics: accuracy、 Hamming loss、 F1-score, ROC不须要为每一个label优化一个阀值。roc_auc_score函数也能够用于多分类(multi-class)问题上。若是预测的输出已经被二值化。
示例:
zero_one_loss会经过在计算0-1分类的
)的平值或求和。缺省状况下,该函数会对样本进行归一化。为了获得
的求和,须要将normalize设置为False。
在multilabel分类上,若是一个子集的labels与预测值严格匹配,zero_one_loss会获得1,若是有许多错误,则为0。缺省的,该函数会返回有问题的预测子集(不等)的百分比。为了获得这样的子集数,能够将normalize置为False。
若是是第i个样本的预测值,
是第i个样本的真实值,那么0-1 loss的定义以下:
其中1(x)表示的是指示函数。
>>> from sklearn.metrics import zero_one_loss >>> y_pred = [1, 2, 3, 4] >>> y_true = [2, 2, 3, 4] >>> zero_one_loss(y_true, y_pred) 0.25 >>> zero_one_loss(y_true, y_pred, normalize=False) 1
在多标签的问题上,若是使用二元标签指示器,第一个标签集[0,1]具备一个error:
>>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2))) 0.5 >>> zero_one_loss(np.array([[0, 1], [1, 1]]), np.ones((2, 2)), normalize=False) 1
示例:
在多标签学习上,每一个样本都具备多个真实值label与它对应。它的目的是,为真实值label获得最高分或者最好的rank。
coverage_error计算了那些必须在最终预测(全部真实的label都会被预测)中包含的labels的平均数目。若是你想知道有多少top高分labels(top-scored-labels)时它会颇有用,你必须以平均的方式进行预测,不漏过任何一个真实label。该metrics的最优值是对真实label求平均。
给定一个真实label的二分类指示矩阵:
以及每一个label相关的分值: ,
相应的范围偏差定义以下:
其中:。给定rank定义,经过给出最大的rank,来打破y_scores。
示例以下:
>>> import numpy as np >>> from sklearn.metrics import coverage_error >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> coverage_error(y_true, y_score) 2.5
label_ranking_average_precision_score函数实现了Label ranking平均准确率 :LRAP(label ranking average precision)。该metric与average_precision_score有关联,但它基于label ranking的概念,而非precision/recall。
LRAP会对每一个样本上分配的真实label进行求平均,真实值的比例 vs. 低分值labels的总数。若是你能够为每一个样本相关的label给出更好的rank,该指标将产生更好的分值。获得的score一般都会比0大,最佳值为1。若是每一个样本都只有一个相关联的label,那么LRAP就与平均倒数排名:mean reciprocal rank
给定一个true label的二元指示矩阵,,每一个label相对应的分值:
,平均准确率的定义以下:
其中:
该函数的示例:
>>> import numpy as np >>> from sklearn.metrics import label_ranking_average_precision_score >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> label_ranking_average_precision_score(y_true, y_score) 0.416...
label_ranking_loss函数用于计算ranking loss,它会对label对没有正确分配的样本进行求平均。例如:true labels的分值比false labels的分值小,或者对true/false label进行了相反的加权。最低的ranking loss为0.
给定一个true labels的二元指示矩阵:,每一个label相关的分值为:
,ranking loss的定义以下:
其中 为l0范式或数据集基数。
示例:
>>> import numpy as np >>> from sklearn.metrics import label_ranking_loss >>> y_true = np.array([[1, 0, 0], [0, 0, 1]]) >>> y_score = np.array([[0.75, 0.5, 1], [1, 0.2, 0.1]]) >>> label_ranking_loss(y_true, y_score) 0.75... >>> y_score = np.array([[1.0, 0.1, 0.2], [0.1, 0.2, 0.9]]) >>> label_ranking_loss(y_true, y_score) 0.0
sklearn.metrics 实现了许多种loss, score,untility函数来测评回归的性能。其中有一些能够做了增长用于处理多输出(multioutput)的状况:
这些函数具备一个multioutput关键参数,它指定了对于每个单独的target是否须要对scores/loss进行平均。缺省值为’uniform_average’,它会对结果进行均匀加权平均。若是输出的ndarray的shape为(n_outputs,),那么它们返回的entries为权重以及相应的平均权重。若是multioutput参数为’raw_values’,那么全部的scores/losses都不改变,以raw的方式返回一个shape为(n_outputs,)的数组。
r2_score和explained_variance_score 对于multioutput参数还接受另外一个额外的值:’variance_weighted’。该选项将经过相应target变量的variance产生一个为每一个单独的score加权的值。该设置将会对全局捕获的未归一化的variance进行量化。若是target的variance具备不一样的规模(scale),那么该score将会把更多的重要性分配到那些更高的variance变量上。
对于r2_score的缺省值为multioutput=’variance_weighted’,向后兼容。后续版本会改为uniform_average。
explained_variance_score解释了explained variance regression score
若是是估计的target输出,y为相应的真实(correct)target输出,Var为求方差(variance),即标准差的平方,那么可释方差(explained variance)的估计以下:
最好的可能值为1.0,越低表示越差。
示例以下:
>>> from sklearn.metrics import explained_variance_score >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> explained_variance_score(y_true, y_pred) 0.957... >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> explained_variance_score(y_true, y_pred, multioutput='raw_values') ... array([ 0.967..., 1. ]) >>> explained_variance_score(y_true, y_pred, multioutput=[0.3, 0.7]) ... 0.990...
mean_absolute_error函数将会计算平均绝对偏差,该指标对应于绝对偏差loss(absolute error loss)或l1范式loss(l1-norm loss)的指望值。
若是是第i个样本的预测值,yi是相应的真实值,那么在
上的平均绝对偏差(MAE)的定义以下:
示例:
>>> from sklearn.metrics import mean_absolute_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_absolute_error(y_true, y_pred) 0.5 >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> mean_absolute_error(y_true, y_pred) 0.75 >>> mean_absolute_error(y_true, y_pred, multioutput='raw_values') array([ 0.5, 1. ]) >>> mean_absolute_error(y_true, y_pred, multioutput=[0.3, 0.7]) ... 0.849...
mean_squared_error用于计算平均平方偏差,该指标对应于平方(二次方)偏差loss(squared (quadratic) error loss)的指望值。
示例为:
>>> from sklearn.metrics import mean_squared_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> mean_squared_error(y_true, y_pred) 0.375 >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> mean_squared_error(y_true, y_pred) 0.7083...
示例:
median_absolute_error是很使人感兴趣的,它对异类(outliers)的状况是健壮的。该loss函数经过计算target和prediction间的绝对值,而后取中值获得。
MedAE的定义以下:
median_absolute_error不支持multioutput。
示例:
>>> from sklearn.metrics import median_absolute_error >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> median_absolute_error(y_true, y_pred) 0.5
r2_score函数用于计算R²(肯定系数:coefficient of determination)。它用来度量将来的样本是否可能经过模型被很好地预测。分值为1表示最好,它能够是负数(由于模型能够很糟糕)。一个恒定的模型老是能预测y的指望值,忽略掉输入的feature,获得一个R^2为0的分值。
R²的定义以下:
其中:
示例:
>>> from sklearn.metrics import r2_score >>> y_true = [3, -0.5, 2, 7] >>> y_pred = [2.5, 0.0, 2, 8] >>> r2_score(y_true, y_pred) 0.948... >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> r2_score(y_true, y_pred, multioutput='variance_weighted') ... 0.938... >>> y_true = [[0.5, 1], [-1, 1], [7, -6]] >>> y_pred = [[0, 2], [-1, 2], [8, -5]] >>> r2_score(y_true, y_pred, multioutput='uniform_average') ... 0.936... >>> r2_score(y_true, y_pred, multioutput='raw_values') ... array([ 0.965..., 0.908...]) >>> r2_score(y_true, y_pred, multioutput=[0.3, 0.7]) ... 0.925...
示例:
sklearn.metrics也提供了聚类的metrics。更多细节详见:
当进行监督学习时,一个简单明智的check包括:使用不一样的规则比较一个estimator。DummyClassifier实现了三种简单的策略用于分类:
注意,全部的这些策略中,predict方法会完成忽略输入数据!
示例,咱们首先建立一个imbalanced的数据集:
>>> from sklearn.datasets import load_iris >>> from sklearn.cross_validation import train_test_split >>> iris = load_iris() >>> X, y = iris.data, iris.target >>> y[y != 1] = -1 >>> X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
下一步,比较下SVC的accuary和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(constant=None, random_state=0, strategy='most_frequent') >>> clf.score(X_test, y_test) 0.57...
咱们能够看到SVC并不比DummyClassifier好不少,接着,咱们换下kernel:
>>> clf = SVC(kernel='rbf', C=1).fit(X_train, y_train) >>> clf.score(X_test, y_test) 0.97...
咱们能够看到,accuracy加强到了几乎100%。若是CPU开销不大,这里建议再作下cross-validation。若是你但愿在参数空间进行优化,咱们强烈推荐你使用GridSearchCV。
更通常的,分类器的accuracy太接近于随机,这可能意味着有可能会出问题:features没有用,超参数没有被正确设置,分类器所用的数据集imbalance,等等。。。
DummyRegressor也实现了4种简单的方法:
在上面的全部策略,predict彻底忽略输入数据。
参考:
http://scikit-learn.org/stable/modules/model_evaluation.html