- Estimator對象的score方法
- 在交叉驗證中使用scoring參數
- 使用sklearn.metric中的性能度量函數
Estimator對象的score方法
分類算法必須要繼承ClassifierMixin類, 回歸算法必須要繼承RegressionMixin類,里面都有一個score
()方法。
score(self, X, y_true)函數會在內部調用predict函數獲得預測響應y_predict,然后與傳入的真是響應進行比較,計算得分。
使用estimator的score函數來評估模型的屬性,默認情況下,分類器對應于準確率:sklearn.metrics.accuracy_score, 回歸器對應于均方差: sklearn.metrics.r2_score。
在交叉驗證中使用scoring參數
GridSearchCV(scoring=None)
cross_val_score(scoring=None)
...
指定在進行網格搜索或者計算交叉驗證得分的時候,使用什么標準度量'estimator'的預測性能,默認是None,就是使用estimator自己的score方法來計算得分。我們可以指定別的性能度量標準,它必須是一個可調用對象,sklearn.metrics不僅為我們提供了一系列預定義的可調用對象,而且還支持自定義評估標準
Scoring | Function |
---|---|
分類 | |
accuracy | metrics.accuracy_score |
average_precision | metrics.average_precision_score |
f1 | metrics.f1_score |
f1_micro | metrics.f1_score |
f1_macro | metrics.f1_score |
f1_weighted | metrics.f1_score |
f1_sample | metrics.f1_score |
neg_log_loss | metrics.log_loss |
precision | metrics.precision_score |
recall | metrics.recall_score |
roc_auc | metrics.roc_auc_score |
聚類 | |
adjusted_rand_score | metrics.adjusted_rand_score |
回歸 | |
neg_mean_absolute_erroe | metrics.neg_mean_absolute_erroe |
neg_mean_squared_error | metrics.neg_mean_squared_error |
neg_median_absolute_error | metrics.neg_median_absolute_error |
r2 | metrics.r2 |
約定: 返回值越大代表性能越好
可以使用sklearn.metrics.SCORERS返回以上的評估函數。
在交叉驗證中使用自定義scoring參數
- 把sklearn.metrics中已有的度量指標封裝成符合‘scoring’參數要求的形式。
Metrics模塊中的很多的度量方法并沒有被分配‘scoring’參數可用的名字。因為這些度量指標需要附加參數,比如:‘fbeta_score’。在這種情況下,如果我們想要使用‘fbeta_score’的話,必須要產生一個合適的scoring對象,產生可調用對象的最簡單的方法就是使用‘make_scorer’,該函數會把'fbeta_score'這個函數轉換成能夠在模型評估中使用的可調用對象。
from sklearn.metrics import fbeta_score, make_scorer
ftwo_score = 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_score)
- 完全自定義自己的度量指標然后用'make_scorer'函數轉換成符合’scoring‘參數要求的形式
from sklearn.metrics import fbeta_score, make_scorer
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 = False)
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)
print(loss(clf, ground_truth, predictions))
print(score(clf, ground_truth, predictions))
image