2016-10-23 20 views
0

我有與多個得分手 我怎樣才能將它集成到一個自定義sklearn射手返回Observation對象的功能? 我把它定義爲:sklearn定製的得分手多指標同時

class Observation(): 
    def __init__(self): 
     self.statValues = {} 
     self.modelName = "" 

    def setModelName(self, nameOfModel): 
     self.modelName = nameOfModel 

    def addStatMetric(self, metricName,metricValue): 
     self.statValues[metricName] = metricValue 

自定義分數的定義如下:

def myAllScore(y_true, y_predicted): 
    return Observation 
my_scorer = make_scorer(myAllScore) 

這可能看起來像

{ 'AUC_R': 0.6892943119440752, 
    'Accuracy': 0.9815382629183745, 
    'Error rate': 0.018461737081625407, 
    'False negative rate': 0.6211453744493393, 
    'False positive rate': 0.0002660016625103907, 
    'Lift value': 33.346741089307166, 
    'Precision J': 0.9772727272727273, 
    'Precision N': 0.9815872808592603, 
    'Rate of negative predictions': 0.0293063938288739, 
    'Rate of positive predictions': 0.011361068973307943, 
    'Sensitivity (true positives rate)': 0.3788546255506608, 
    'Specificity (true negatives rate)': 0.9997339983374897, 
    'f1_R': 0.9905775376404309, 
    'kappa': 0.5384745595159575} 

回答

2

簡而言之:你不能。

長版本:得分手已經到返回一個標量,因爲它可以用於模型選擇,並且通常 - 比較對象。由於在矢量空間中沒有完整的排序方式,因此無法在記分器(或字典)中返回矢量,但從數學角度來看,它可能被視爲矢量。此外,即使是其他用例,如進行交叉驗證也不支持任意結構化對象作爲返回值,因爲他們嘗試在值列表上調用np.mean,並且未針對Python字典列表定義此操作(您的方法回報)。

您可以做的唯一事情就是爲您擁有的每個指標創建單獨的記分器,並獨立使用它們。

+0

我明白了。但是它可能類似於http://scikit-learn.org/stable/modules/generated/sklearn.metrics.classification_report.html一次獲得幾個評分嗎? –

+0

你已經實現了這個,因此我不明白你的問題。 classification_report不是記分員,您不能在記分員上下文中使用它。 – lejlot

+0

正確。我手動實現了循環的列車測試。 Howeve,r,因爲我想嘗試堆疊和混合(https://github.com/rushter/heamy)我開始轉向sklearn管道,這很好地與記分器功能集成在一起。 –

1

事實上,這是可能的,正如此叉中所述:multiscorer

爲了完整起見,這裏有一個例子:

from multiscorer.multiscorer import MultiScorer 

#Scikit's libraries for demonstration 
from sklearn.metrics import accuracy_score, precision_score 
from sklearn.model_selection import cross_val_score 
from numpy import average 

scorer = MultiScorer({ 
    'accuracy': (accuracy_score, {}), 
    'precision': (precision_score, {'average': 'macro'}) 
}) 

... 

cross_val_score(clf, X, target, scoring=scorer) 

results = scorer.get_results() 

for metric in results.keys(): 
    print("%s: %.3f" % (metric, average(results[metric])))