2017-05-18 19 views
7

Mã này:Lẫn lộn matrix lỗi khi kích thước mảng có kích thước 3

from pandas_ml import ConfusionMatrix 
y_actu = [1,2] 
y_pred = [1,2] 
cm = ConfusionMatrix(y_actu, y_pred) 
cm.print_stats() 

in:

population: 2 
P: 1 
N: 1 
PositiveTest: 1 
NegativeTest: 1 
TP: 1 
TN: 1 
FP: 0 
FN: 0 
TPR: 1.0 
TNR: 1.0 
PPV: 1.0 
NPV: 1.0 
FPR: 0.0 
FDR: 0.0 
FNR: 0.0 
ACC: 1.0 
F1_score: 1.0 
MCC: 1.0 
informedness: 1.0 
markedness: 1.0 
prevalence: 0.5 
LRP: inf 
LRN: 0.0 
DOR: inf 
FOR: 0.0 
/opt/conda/lib/python3.5/site-packages/pandas_ml/confusion_matrix/bcm.py:332: RuntimeWarning: divide by zero encountered in double_scalars 
    return(np.float64(self.TPR)/self.FPR) 

này được mong đợi.

Sửa đổi mã để:

from pandas_ml import ConfusionMatrix 
y_actu = [1,2,3] 
y_pred = [1,2,3] 
cm = ConfusionMatrix(y_actu, y_pred) 
cm.print_stats() 

thay đổi tôi đã thực hiện là:

y_actu = [1,2,3] 
y_pred = [1,2,3] 

kết quả do lỗi:

OrderedDict([('Accuracy', 1.0), ('95% CI', (0.29240177382128668, nan)), ('No Information Rate', 'ToDo'), ('P-Value [Acc > NIR]', 0.29629629629629622), ('Kappa', 1.0), ("Mcnemar's Test P-Value", 'ToDo')]) 

ValueErrorTraceback (most recent call last) 
<ipython-input-30-d8c5dc2bea73> in <module>() 
     3 y_pred = [1,2,3] 
     4 cm = ConfusionMatrix(y_actu, y_pred) 
----> 5 cm.print_stats() 

/opt/conda/lib/python3.5/site-packages/pandas_ml/confusion_matrix/abstract.py in print_stats(self, lst_stats) 
    446   Prints statistics 
    447   """ 
--> 448   print(self._str_stats(lst_stats)) 
    449 
    450  def get(self, actual=None, predicted=None): 

/opt/conda/lib/python3.5/site-packages/pandas_ml/confusion_matrix/abstract.py in _str_stats(self, lst_stats) 
    427   } 
    428 
--> 429   stats = self.stats(lst_stats) 
    430 
    431   d_stats_str = collections.OrderedDict([ 

/opt/conda/lib/python3.5/site-packages/pandas_ml/confusion_matrix/abstract.py in stats(self, lst_stats) 
    390   d_stats = collections.OrderedDict() 
    391   d_stats['cm'] = self 
--> 392   d_stats['overall'] = self.stats_overall 
    393   d_stats['class'] = self.stats_class 
    394   return(d_stats) 

/opt/conda/lib/python3.5/site-packages/pandas_ml/confusion_matrix/cm.py in __getattr__(self, attr) 
    33   Returns (weighted) average statistics 
    34   """ 
---> 35   return(self._avg_stat(attr)) 

/opt/conda/lib/python3.5/site-packages/pandas_ml/confusion_matrix/abstract.py in _avg_stat(self, stat) 
    509    v = getattr(binary_cm, stat) 
    510    print(v) 
--> 511    s_values[cls] = v 
    512   value = (s_values * self.true).sum()/self.population 
    513   return(value) 

/opt/conda/lib/python3.5/site-packages/pandas/core/series.py in __setitem__(self, key, value) 
    771   # do the setitem 
    772   cacher_needs_updating = self._check_is_chained_assignment_possible() 
--> 773   setitem(key, value) 
    774   if cacher_needs_updating: 
    775    self._maybe_update_cacher() 

/opt/conda/lib/python3.5/site-packages/pandas/core/series.py in setitem(key, value) 
    767      pass 
    768 
--> 769    self._set_with(key, value) 
    770 
    771   # do the setitem 

/opt/conda/lib/python3.5/site-packages/pandas/core/series.py in _set_with(self, key, value) 
    809    if key_type == 'integer': 
    810     if self.index.inferred_type == 'integer': 
--> 811      self._set_labels(key, value) 
    812     else: 
    813      return self._set_values(key, value) 

/opt/conda/lib/python3.5/site-packages/pandas/core/series.py in _set_labels(self, key, value) 
    826   if mask.any(): 
    827    raise ValueError('%s not contained in the index' % str(key[mask])) 
--> 828   self._set_values(indexer, value) 
    829 
    830  def _set_values(self, key, value): 

/opt/conda/lib/python3.5/site-packages/pandas/core/series.py in _set_values(self, key, value) 
    831   if isinstance(key, Series): 
    832    key = key._values 
--> 833   self._data = self._data.setitem(indexer=key, value=value) 
    834   self._maybe_update_cacher() 
    835 

/opt/conda/lib/python3.5/site-packages/pandas/core/internals.py in setitem(self, **kwargs) 
    3166 
    3167  def setitem(self, **kwargs): 
-> 3168   return self.apply('setitem', **kwargs) 
    3169 
    3170  def putmask(self, **kwargs): 

/opt/conda/lib/python3.5/site-packages/pandas/core/internals.py in apply(self, f, axes, filter, do_integrity_check, consolidate, **kwargs) 
    3054 
    3055    kwargs['mgr'] = self 
-> 3056    applied = getattr(b, f)(**kwargs) 
    3057    result_blocks = _extend_blocks(applied, result_blocks) 
    3058 

/opt/conda/lib/python3.5/site-packages/pandas/core/internals.py in setitem(self, indexer, value, mgr) 
    685       indexer.dtype == np.bool_ and 
    686       len(indexer[indexer]) == len(value)): 
--> 687      raise ValueError("cannot set using a list-like indexer " 
    688          "with a different length than the value") 
    689 

ValueError: cannot set using a list-like indexer with a different length than the value 

Reading Assignment to containers in Pandas bang "Sử dụng danh sách đặc hữu không được phép trên phân công và không nên làm điều này chút nào. " tôi đã tạo danh sách đặc hữu chưa? Danh sách đặc hữu là gì?

+0

Bạn đã thử học scikit chưa? http://stackoverflow.com/questions/43697980/is-there-something-already-implemented-in-python-to-calculate-tp-tn-fp-and-fn/43698347#43698347 – Sidon

+0

@Sidon cảm ơn, vâng tôi nghiên cứu nó 'một chút', gấu trúc ml cung cấp nhiều số liệu thống kê hữu ích của tập dữ liệu 'ra khỏi hộp' thông qua phương pháp print_stats, mà tình cờ các poster của câu hỏi bạn liên kết cũng được hỏi về. Cảm ơn bạn đã liên kết, các hình ảnh trực quan hấp dẫn. –

Trả lời

4

Tôi khuyên bạn nên sử dụng confusion_matrix từ scikit-learn. Các số liệu khác mà bạn đề cập như Độ chính xác, Nhớ lại, Điểm số F1 cũng có sẵn từ sklearn.metrics.

>>> from sklearn.metrics import confusion_matrix 
>>> y_actu = [1,2,3] 
>>> y_pred = [1,2,3] 
>>> confusion_matrix(y_actu, y_pred) 
array([[1, 0, 0], 
     [0, 1, 0], 
     [0, 0, 1]]) 
1

Điều thú vị là khi tôi chạy mã, tôi không nhận được lỗi mà bạn nhận được và mã chạy hoàn hảo. Tôi đề nghị bạn nâng cấp thư viện pandas_ml bằng cách chạy:

pip install --upgrade pandas_ml 

Ngoài ra, bạn cần phải nâng cấp gấu trúc bằng cách chạy:

pip install --upgrade pandas 

Nếu điều đó không làm việc, bạn có thể sử dụng gấu trúc riêng của mình để tạo ra một ma trận nhầm lẫn :

import pandas as pd 
y_actu = pd.Series([1, 2, 3], name='Actual') 
y_pred = pd.Series([1, 2, 3], name='Predicted') 
df_confusion = pd.crosstab(y_actu, y_pred) 
print df_confusion 

Điều này sẽ cung cấp cho bạn bảng bạn đang tìm kiếm.

+0

cảm ơn nhưng bạn không sử dụng 'cm = ConfusionMatrix (y_actu, y_pred)' và do đó không thể in số liệu thống kê bằng cách sử dụng 'print_stats()'? –

+0

Sử dụng Python 2, tôi đã có thể chạy mã của bạn trực tiếp và đạt được kết quả thống kê mà bạn muốn. Bạn đang sử dụng phiên bản Python nào? – Ajax1234

+0

@ blue-sky, hãy xem câu trả lời của tôi ở trên. Tôi đã giải quyết được vấn đề bằng cách nâng cấp cả gấu trúc và pandas_ml. ConfusionMatrix hoạt động tốt với ví dụ multiclass [1,2,3] ngay bây giờ. –

1

Có vẻ như lỗi là không phải vì kích thước mảng:

from pandas_ml import ConfusionMatrix 
y_actu = [1,2,2] 
y_pred = [1,1,2] 
cm = ConfusionMatrix(y_actu, y_pred) 
cm.print_stats() 

này (vấn đề phân loại nhị phân) hoạt động tốt.

Có thể ma trận nhầm lẫn của vấn đề phân loại đa giác chỉ bị hỏng.

Cập nhật: ive chỉ làm các bước sau:

conda update pandas 

để có được gấu trúc 0,20.1 và sau đó

pip install -U pandas_ml 

nay mọi thứ đều tốt với ma trận nhầm lẫn mulsiclass:

from pandas_ml import ConfusionMatrix 
y_actu = [1,2,3] 
y_pred = [1,2,3] 
cm = ConfusionMatrix(y_actu, y_pred) 
cm.print_stats() 

tôi đã nhận kết quả:

Class Statistics: 

Classes          1   2   3 
Population         3   3   3 
P: Condition positive       1   1   1 
N: Condition negative       2   2   2 
Test outcome positive       1   1   1 
Test outcome negative       2   2   2 
TP: True Positive        1   1   1 
TN: True Negative        2   2   2 
FP: False Positive       0   0   0 
FN: False Negative       0   0   0 
TPR: (Sensitivity, hit rate, recall)   1   1   1 
TNR=SPC: (Specificity)      1   1   1 
PPV: Pos Pred Value (Precision)    1   1   1 
NPV: Neg Pred Value       1   1   1 
FPR: False-out        0   0   0 
FDR: False Discovery Rate      0   0   0 
FNR: Miss Rate        0   0   0 
ACC: Accuracy         1   1   1 
F1 score          1   1   1 
MCC: Matthews correlation coefficient   1   1   1 
Informedness         1   1   1 
Markedness         1   1   1 
Prevalence        0.333333 0.333333 0.333333 
LR+: Positive likelihood ratio    inf  inf  inf 
LR-: Negative likelihood ratio    0   0   0 
DOR: Diagnostic odds ratio     inf  inf  inf 
FOR: False omission rate      0   0   0 
3

tôi cũng sử dụng và giới thiệu các sklearn confusion_matrix chức năng. Cá nhân tôi cũng giữ một chức năng "pretty-print confusion matrix" tiện dụng với một vài tiện thêm:

  • nhãn lớp in dọc theo ma trận nhầm lẫn trục
  • stats
  • nhầm lẫn ma trận bình thường sao cho tất cả các tế bào tổng hợp tới 1
  • màu nhầm lẫn tế bào ma trận quy mô theo giá trị ô
  • Số liệu bổ sung như F-score, v.v. được in bên dưới ma trận nhầm lẫn.

Như thế này:

enter image description here

Dưới đây là các chức năng âm mưu, chủ yếu dựa trên this example from the Scikit-Learn documentation

import matplotlib.pyplot as plt 
import itertools 
from sklearn.metrics import classification_report 

def pretty_print_conf_matrix(y_true, y_pred, 
          classes, 
          normalize=False, 
          title='Confusion matrix', 
          cmap=plt.cm.Blues): 
    """ 
    Mostly stolen from: http://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html#sphx-glr-auto-examples-model-selection-plot-confusion-matrix-py 

    Normalization changed, classification_report stats added below plot 
    """ 

    cm = confusion_matrix(y_true, y_pred) 

    # Configure Confusion Matrix Plot Aesthetics (no text yet) 
    plt.imshow(cm, interpolation='nearest', cmap=cmap) 
    plt.title(title, fontsize=14) 
    tick_marks = np.arange(len(classes)) 
    plt.xticks(tick_marks, classes, rotation=45) 
    plt.yticks(tick_marks, classes) 
    plt.ylabel('True label', fontsize=12) 
    plt.xlabel('Predicted label', fontsize=12) 

    # Calculate normalized values (so all cells sum to 1) if desired 
    if normalize: 
     cm = np.round(cm.astype('float')/cm.sum(),2) #(axis=1)[:, np.newaxis] 

    # Place Numbers as Text on Confusion Matrix Plot 
    thresh = cm.max()/2. 
    for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): 
     plt.text(j, i, cm[i, j], 
       horizontalalignment="center", 
       color="white" if cm[i, j] > thresh else "black", 
       fontsize=12) 


    # Add Precision, Recall, F-1 Score as Captions Below Plot 
    rpt = classification_report(y_true, y_pred) 
    rpt = rpt.replace('avg/total', '  avg') 
    rpt = rpt.replace('support', 'N Obs') 

    plt.annotate(rpt, 
       xy = (0,0), 
       xytext = (-50, -140), 
       xycoords='axes fraction', textcoords='offset points', 
       fontsize=12, ha='left')  

    # Plot 
    plt.tight_layout() 

Và đây là ví dụ với dữ liệu iris sử dụng để tạo ra các hình ảnh cốt truyện:

from sklearn import datasets 
from sklearn.svm import SVC 

#get data, make predictions 
(X,y) = datasets.load_iris(return_X_y=True) 
X_train, X_test, y_train, y_test = train_test_split(X,y, train_size=0.5) 

clf = SVC() 
clf.fit(X_train,y_train) 
y_test_pred = clf.predict(X_test) 


# Plot Confusion Matrix 
plt.style.use('classic') 
plt.figure(figsize=(3,3)) 
pretty_print_conf_matrix(y_test, y_test_pred, 
         classes= ['0', '1', '2'], 
         normalize=True, 
         title='Confusion Matrix') 
Các vấn đề liên quan