วิธีคำนวณความแม่นยำการเรียกคืนความแม่นยำและคะแนน f1 สำหรับกรณีหลายคลาสด้วย scikit Learn


110

ฉันกำลังทำงานในปัญหาการวิเคราะห์ความรู้สึกข้อมูลมีลักษณะดังนี้:

label instances
    5    1190
    4     838
    3     239
    1     204
    2     127

ดังนั้นข้อมูลของฉันจะไม่สมดุลตั้งแต่ 1190 ที่ถูกกำกับด้วยinstances 5สำหรับการจัดประเภทฉันใช้SVCของ scikit SVCปัญหาคือฉันไม่รู้ว่าจะปรับสมดุลข้อมูลของฉันอย่างไรให้ถูกต้องเพื่อคำนวณความแม่นยำการเรียกคืนความแม่นยำและคะแนน f1 สำหรับกรณีมัลติคลาสอย่างถูกต้อง ดังนั้นฉันจึงลองใช้วิธีต่อไปนี้:

อันดับแรก:

    wclf = SVC(kernel='linear', C= 1, class_weight={1: 10})
    wclf.fit(X, y)
    weighted_prediction = wclf.predict(X_test)

print 'Accuracy:', accuracy_score(y_test, weighted_prediction)
print 'F1 score:', f1_score(y_test, weighted_prediction,average='weighted')
print 'Recall:', recall_score(y_test, weighted_prediction,
                              average='weighted')
print 'Precision:', precision_score(y_test, weighted_prediction,
                                    average='weighted')
print '\n clasification report:\n', classification_report(y_test, weighted_prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, weighted_prediction)

ประการที่สอง:

auto_wclf = SVC(kernel='linear', C= 1, class_weight='auto')
auto_wclf.fit(X, y)
auto_weighted_prediction = auto_wclf.predict(X_test)

print 'Accuracy:', accuracy_score(y_test, auto_weighted_prediction)

print 'F1 score:', f1_score(y_test, auto_weighted_prediction,
                            average='weighted')

print 'Recall:', recall_score(y_test, auto_weighted_prediction,
                              average='weighted')

print 'Precision:', precision_score(y_test, auto_weighted_prediction,
                                    average='weighted')

print '\n clasification report:\n', classification_report(y_test,auto_weighted_prediction)

print '\n confussion matrix:\n',confusion_matrix(y_test, auto_weighted_prediction)

ประการที่สาม:

clf = SVC(kernel='linear', C= 1)
clf.fit(X, y)
prediction = clf.predict(X_test)


from sklearn.metrics import precision_score, \
    recall_score, confusion_matrix, classification_report, \
    accuracy_score, f1_score

print 'Accuracy:', accuracy_score(y_test, prediction)
print 'F1 score:', f1_score(y_test, prediction)
print 'Recall:', recall_score(y_test, prediction)
print 'Precision:', precision_score(y_test, prediction)
print '\n clasification report:\n', classification_report(y_test,prediction)
print '\n confussion matrix:\n',confusion_matrix(y_test, prediction)


F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
  sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
  sample_weight=sample_weight)
/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1082: DeprecationWarning: The default `weighted` averaging is deprecated, and from version 0.18, use of precision, recall or F-score with multiclass or multilabel data or pos_label=None will result in an exception. Please set an explicit value for `average`, one of (None, 'micro', 'macro', 'weighted', 'samples'). In cross validation use, for instance, scoring="f1_weighted" instead of scoring="f1".
  sample_weight=sample_weight)
 0.930416613529

อย่างไรก็ตามฉันได้รับคำเตือนเช่นนี้:

/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:1172:
DeprecationWarning: The default `weighted` averaging is deprecated,
and from version 0.18, use of precision, recall or F-score with 
multiclass or multilabel data or pos_label=None will result in an 
exception. Please set an explicit value for `average`, one of (None, 
'micro', 'macro', 'weighted', 'samples'). In cross validation use, for 
instance, scoring="f1_weighted" instead of scoring="f1"

ฉันจะจัดการกับข้อมูลที่ไม่สมดุลของฉันอย่างถูกต้องได้อย่างไรเพื่อคำนวณเมตริกของตัวจำแนกประเภทที่ถูกต้อง


แล้วทำไมไม่เพิ่มaverageพารามิเตอร์ในกรณีที่สาม?
yangjie

1
@yangjie ฉันไม่รู้ ฉันเพิ่งตรวจสอบเอกสาร แต่ไม่เข้าใจวิธีใช้เมตริกอย่างถูกต้องสำหรับข้อมูลที่ไม่สมดุล คุณช่วยให้คำอธิบายและตัวอย่างที่กว้างขึ้นได้หรือไม่?. ขอบคุณ!
new_with_python

คำตอบ:


164

ฉันคิดว่ามีความสับสนมากว่าน้ำหนักใดที่ใช้สำหรับอะไร ฉันไม่แน่ใจว่าฉันรู้แน่ชัดว่าอะไรรบกวนคุณดังนั้นฉันจะพูดถึงหัวข้อต่างๆอดทนกับฉัน;)

น้ำหนักคลาส

น้ำหนักจากclass_weightพารามิเตอร์ที่จะใช้ในการฝึกอบรมลักษณนาม พวกเขาจะไม่ได้ใช้ในการคำนวณใด ๆ ของตัวชี้วัดที่คุณกำลังใช้ : ที่มีน้ำหนักระดับที่แตกต่างกันตัวเลขจะแตกต่างกันเพียงเพราะลักษณนามที่แตกต่างกัน

โดยทั่วไปแล้วในทุกตัวแยกประเภท scikit-learn น้ำหนักของคลาสจะใช้เพื่อบอกโมเดลของคุณว่าคลาสมีความสำคัญเพียงใด นั่นหมายความว่าในระหว่างการฝึกอบรมลักษณนามจะพยายามเป็นพิเศษในการจัดประเภทชั้นเรียนที่มีน้ำหนักสูงอย่างเหมาะสม
วิธีที่พวกเขาทำนั้นขึ้นอยู่กับอัลกอริทึม หากคุณต้องการรายละเอียดเกี่ยวกับวิธีการทำงานของ SVC และเอกสารไม่สมเหตุสมผลสำหรับคุณโปรดอย่าลังเลที่จะพูดถึงมัน

เมตริก

เมื่อคุณมีลักษณนามแล้วคุณต้องการทราบว่ามันทำงานได้ดีเพียงใด ที่นี่คุณสามารถใช้ตัวชี้วัดที่คุณกล่าวถึง: accuracy, recall_score, f1_score...

โดยปกติเมื่อการกระจายคลาสไม่สมดุลความแม่นยำจะถือเป็นตัวเลือกที่ไม่ดีเนื่องจากให้คะแนนสูงสำหรับโมเดลที่คาดเดาคลาสที่พบบ่อยที่สุด

ฉันจะไม่ลงรายละเอียดเมตริกเหล่านี้ทั้งหมด แต่โปรดทราบว่ายกเว้นเมตริกเหล่านี้accuracyจะถูกนำไปใช้ตามธรรมชาติในระดับชั้นเรียนดังที่คุณเห็นในprintรายงานการจำแนกประเภทนี้ซึ่งกำหนดไว้สำหรับแต่ละชั้นเรียน พวกเขาอาศัยแนวคิดเช่นtrue positivesหรือfalse negativeที่จำเป็นต้องมีการกำหนดระดับที่เป็นบวกหนึ่ง

             precision    recall  f1-score   support

          0       0.65      1.00      0.79        17
          1       0.57      0.75      0.65        16
          2       0.33      0.06      0.10        17
avg / total       0.52      0.60      0.51        50

คำเตือน

F1 score:/usr/local/lib/python2.7/site-packages/sklearn/metrics/classification.py:676: DeprecationWarning: The 
default `weighted` averaging is deprecated, and from version 0.18, 
use of precision, recall or F-score with multiclass or multilabel data  
or pos_label=None will result in an exception. Please set an explicit 
value for `average`, one of (None, 'micro', 'macro', 'weighted', 
'samples'). In cross validation use, for instance, 
scoring="f1_weighted" instead of scoring="f1".

คุณได้รับคำเตือนนี้เนื่องจากคุณใช้คะแนน f1 การเรียกคืนและความแม่นยำโดยไม่ได้กำหนดว่าควรคำนวณอย่างไร! คำถามสามารถเปลี่ยนข้อความได้: จากรายงานการจำแนกประเภทข้างต้นคุณจะแสดงตัวเลขสากลหนึ่งตัวสำหรับคะแนน f1 ได้อย่างไร คุณสามารถ:

  1. ใช้ค่าเฉลี่ยของคะแนน f1 สำหรับแต่ละชั้นเรียนนั่นคือavg / totalผลลัพธ์ข้างต้น เรียกอีกอย่างว่าค่าเฉลี่ยมาโคร
  2. คำนวณคะแนน f1 โดยใช้จำนวนทั่วโลกของผลบวกจริง / ผลลบเท็จ ฯลฯ (คุณรวมจำนวนผลบวกจริง / ผลลบเท็จสำหรับแต่ละชั้นเรียน) aka microเฉลี่ย
  3. คำนวณค่าเฉลี่ยถ่วงน้ำหนักของคะแนน f1 การใช้'weighted'ใน scikit-learn จะชั่งน้ำหนักคะแนน f1 โดยการสนับสนุนของชั้นเรียน: ยิ่งชั้นเรียนมีองค์ประกอบมากเท่าใดคะแนน f1 สำหรับชั้นเรียนนี้ก็มีความสำคัญมากขึ้นในการคำนวณ

เหล่านี้มี 3 ตัวเลือกใน scikit เรียนรู้ที่เตือนจะมีการบอกว่าคุณต้องเลือกอย่างใดอย่างหนึ่ง ดังนั้นคุณต้องระบุaverageอาร์กิวเมนต์สำหรับวิธีคะแนน

สิ่งที่คุณเลือกนั้นขึ้นอยู่กับวิธีที่คุณต้องการวัดประสิทธิภาพของลักษณนามเช่นการหาค่าเฉลี่ยมหภาคจะไม่คำนึงถึงความไม่สมดุลของชั้นเรียนและคะแนน f1 ของชั้น 1 จะมีความสำคัญพอ ๆ กับคะแนน f1 ของชั้นเรียน 5. หากคุณใช้ค่าเฉลี่ยถ่วงน้ำหนักอย่างไรก็ตามคุณจะมีความสำคัญมากขึ้นสำหรับชั้นเรียน 5

ข้อกำหนดอาร์กิวเมนต์ทั้งหมดในเมตริกเหล่านี้ยังไม่ชัดเจนใน scikit-learn ในขณะนี้ แต่จะดีขึ้นในเวอร์ชัน 0.18 ตามเอกสาร พวกเขากำลังลบพฤติกรรมมาตรฐานบางอย่างที่ไม่ชัดเจนและกำลังออกคำเตือนเพื่อให้นักพัฒนาสังเกตเห็น

คะแนนคอมพิวเตอร์

สิ่งสุดท้ายที่ฉันต้องการที่จะพูดถึง (รู้สึกอิสระที่จะข้ามไปได้ถ้าคุณตระหนักถึงมันกำลัง) เป็นคะแนนที่มีความหมายเฉพาะในกรณีที่พวกเขาจะคำนวณตามข้อมูลที่ลักษณนามไม่เคยเห็น สิ่งนี้มีความสำคัญอย่างยิ่งเนื่องจากคะแนนใด ๆ ที่คุณได้รับจากข้อมูลที่ใช้ในการปรับลักษณนามนั้นไม่เกี่ยวข้องทั้งหมด

ต่อไปนี้เป็นวิธีการใช้StratifiedShuffleSplitงานซึ่งจะช่วยให้คุณแยกข้อมูลแบบสุ่ม (หลังจากการสับ) ที่รักษาการกระจายฉลาก

from sklearn.datasets import make_classification
from sklearn.cross_validation import StratifiedShuffleSplit
from sklearn.metrics import accuracy_score, f1_score, precision_score, recall_score, classification_report, confusion_matrix

# We use a utility to generate artificial classification data.
X, y = make_classification(n_samples=100, n_informative=10, n_classes=3)
sss = StratifiedShuffleSplit(y, n_iter=1, test_size=0.5, random_state=0)
for train_idx, test_idx in sss:
    X_train, X_test, y_train, y_test = X[train_idx], X[test_idx], y[train_idx], y[test_idx]
    svc.fit(X_train, y_train)
    y_pred = svc.predict(X_test)
    print(f1_score(y_test, y_pred, average="macro"))
    print(precision_score(y_test, y_pred, average="macro"))
    print(recall_score(y_test, y_pred, average="macro"))    

หวังว่านี่จะช่วยได้


สำหรับมัลติคลาสคุณจะระบุน้ำหนักคลาสได้อย่างไร? เช่นclass_weight={1:10}ข้อมูลที่มี 3 คลาสหมายความว่าอย่างไร
Aziz Javed

มีการรับคะแนนความแม่นยำที่ชาญฉลาดหรือไม่?
Ankur Sinha

คุณสามารถอธิบายวิธีการทำงานของไมโครได้ชัดเจนขึ้น นอกจากนี้คุณไม่ได้พูดถึงอะไรเกี่ยวกับไบนารี
ถ่อมตัว

ValueError: The least populated class in y has only 1 member, which is too few. The minimum number of labels for any class cannot be less than 2.สำหรับผมแซดสับเปลี่ยนถูกสร้างปัญหาดังนั้นผมจึงเปลี่ยนกลับไปแยกรถไฟทดสอบขณะที่มันกำลังแสดง มันทำงานได้ดีกับการแยกทดสอบรถไฟ แต่ใครช่วยฉันได้บ้างว่าทำไมฉันถึงได้รับข้อผิดพลาดนี้กับ SSS ขอบคุณ.
Akash Kandpal

สวัสดีฉันทดสอบรหัสของคุณ แต่ฉันมีข้อผิดพลาดนี้ C: \ Users \\ Anaconda3 \ lib \ site-Packages \ sklearn \ metrics \ Classification.py: 976: DeprecationWarning: จากเวอร์ชัน 0.18 อินพุตไบนารีจะไม่ได้รับการจัดการเป็นพิเศษเมื่อใช้ ความแม่นยำเฉลี่ย / การเรียกคืน / F-score โปรดใช้ค่าเฉลี่ย = 'ไบนารี' เพื่อรายงานเฉพาะประสิทธิภาพของคลาสที่เป็นบวก 'positive class performance.',
DeprecationWarning

74

มีคำตอบโดยละเอียดมากมายที่นี่ แต่ฉันคิดว่าคุณไม่ได้ตอบคำถามที่ถูกต้อง ตามที่ฉันเข้าใจคำถามมีข้อกังวลสองประการ:

  1. ฉันจะให้คะแนนปัญหามัลติคลาสได้อย่างไร
  2. ฉันจะจัดการกับข้อมูลที่ไม่สมดุลได้อย่างไร

1.

คุณสามารถใช้ฟังก์ชันการให้คะแนนส่วนใหญ่ใน scikit-learn กับปัญหาหลายคลาสเช่นเดียวกับปัญหาคลาสเดียว เช่น:

from sklearn.metrics import precision_recall_fscore_support as score

predicted = [1,2,3,4,5,1,2,1,1,4,5] 
y_test = [1,2,3,4,5,1,2,1,1,4,1]

precision, recall, fscore, support = score(y_test, predicted)

print('precision: {}'.format(precision))
print('recall: {}'.format(recall))
print('fscore: {}'.format(fscore))
print('support: {}'.format(support))

ด้วยวิธีนี้คุณจะได้ตัวเลขที่จับต้องได้และตีความได้สำหรับแต่ละชั้นเรียน

| Label | Precision | Recall | FScore | Support |
|-------|-----------|--------|--------|---------|
| 1     | 94%       | 83%    | 0.88   | 204     |
| 2     | 71%       | 50%    | 0.54   | 127     |
| ...   | ...       | ...    | ...    | ...     |
| 4     | 80%       | 98%    | 0.89   | 838     |
| 5     | 93%       | 81%    | 0.91   | 1190    |

จากนั้น ...

2.

... คุณสามารถบอกได้ว่าข้อมูลที่ไม่สมดุลนั้นเป็นปัญหาหรือไม่ หากการให้คะแนนสำหรับชั้นเรียนที่มีตัวแทนน้อยกว่า (คลาส 1 และ 2) ต่ำกว่าสำหรับชั้นเรียนที่มีตัวอย่างการฝึกอบรมมากกว่า (คลาส 4 และ 5) คุณจะรู้ว่าข้อมูลที่ไม่สมดุลนั้นเป็นปัญหาจริงและคุณสามารถดำเนินการตามนั้นได้ อธิบายไว้ในคำตอบอื่น ๆ ในชุดข้อความนี้ อย่างไรก็ตามหากมีการแจกแจงคลาสเดียวกันในข้อมูลที่คุณต้องการคาดการณ์ข้อมูลการฝึกอบรมที่ไม่สมดุลของคุณจะเป็นตัวแทนที่ดีของข้อมูลดังนั้นความไม่สมดุลจึงเป็นสิ่งที่ดี


1
โพสต์ที่ดีและพูดได้ดี ขอบคุณ
Alvis

1
นี่เป็นเพียงคำถามติดตามผล: คุณพิมพ์ฉลากโดยใช้precision_recall_fscore_supportอย่างไร? ฉลากถูกพิมพ์ตามคำสั่งหรือไม่?
BigD

@BigD เย้ดูscikit-learn.org/stable/modules/generated/…ที่ด้านล่างสุด ตั้งค่าaverage=Noneและกำหนดป้ายกำกับจากนั้นคุณจะได้รับเมตริกที่คุณต้องการสำหรับป้ายกำกับที่คุณระบุ
wonderkid2

มีการรับคะแนนความแม่นยำที่ชาญฉลาดหรือไม่?
Ankur Sinha

@trollster ฉันไม่แน่ใจว่าคุณหมายถึงอะไร? สิ่งที่ฉันแสดงในคะแนนความแม่นยำตามป้ายคำตอบไม่ใช่หรือ
wonderkid2

16

คำถามที่ถูกตั้งขึ้น

การตอบคำถาม 'เมตริกใดที่ควรใช้สำหรับการจำแนกหลายชั้นด้วยข้อมูลที่ไม่สมดุล': Macro-F1-measure นอกจากนี้ยังสามารถใช้ Macro Precision และ Macro Recall ได้ แต่ไม่สามารถตีความได้อย่างง่ายดายเช่นเดียวกับการจำแนกแบบไบนารีซึ่งรวมอยู่ในการวัดค่า F แล้วและเมตริกส่วนเกินจะทำให้วิธีการเปรียบเทียบซับซ้อนการปรับพารามิเตอร์และอื่น ๆ

ค่าเฉลี่ยขนาดเล็กมีความอ่อนไหวต่อความไม่สมดุลของชั้นเรียนตัวอย่างเช่นหากวิธีของคุณใช้ได้ผลดีกับป้ายกำกับที่พบมากที่สุดและทำให้ผู้อื่นเสียประโยชน์โดยสิ้นเชิงเมตริกเฉลี่ยขนาดเล็กจะแสดงผลลัพธ์ที่ดี

การหาค่าเฉลี่ยแบบถ่วงน้ำหนักไม่เหมาะกับข้อมูลที่ไม่สมดุลเนื่องจากจะชั่งน้ำหนักตามจำนวนป้ายกำกับ ยิ่งไปกว่านั้นมันแทบจะไม่สามารถตีความได้และไม่เป็นที่นิยมตัวอย่างเช่นไม่มีการกล่าวถึงค่าเฉลี่ยดังกล่าวในการสำรวจโดยละเอียดต่อไปนี้ฉันขอแนะนำอย่างยิ่งให้พิจารณา:

Sokolova, Marina และ Guy Lapalme "การวิเคราะห์มาตรการประสิทธิภาพสำหรับงานจำแนกประเภทอย่างเป็นระบบ" การประมวลผลและการจัดการข้อมูล 45.4 (2552): 427-437.

คำถามเฉพาะแอปพลิเคชัน

อย่างไรก็ตามกลับไปที่งานของคุณฉันจะค้นคว้า 2 หัวข้อ:

  1. เมตริกที่ใช้กันทั่วไปสำหรับงานเฉพาะของคุณ - ช่วยให้ (ก) เปรียบเทียบวิธีการของคุณกับผู้อื่นและทำความเข้าใจว่าคุณทำอะไรผิดพลาดหรือไม่และ (ข) อย่าสำรวจสิ่งนี้ด้วยตัวเองและนำสิ่งที่พบของผู้อื่นมาใช้ซ้ำ
  2. ค่าใช้จ่ายของข้อผิดพลาดที่แตกต่างกันของวิธีการของคุณตัวอย่างเช่นกรณีการใช้งานของแอปพลิเคชันของคุณอาจอาศัยการตรวจสอบระดับ 4 และ 5 ดาวเท่านั้นในกรณีนี้เมตริกที่ดีควรนับเฉพาะป้ายกำกับ 2 รายการนี้

เมตริกที่ใช้กันทั่วไป ดังที่ฉันสามารถสรุปได้หลังจากดูวรรณกรรมแล้วมีเมตริกการประเมินหลัก 2 รายการ:

  1. ความถูกต้องซึ่งใช้เช่นใน

Yu, April และ Daryl Chang "การทำนายความเชื่อมั่นหลายระดับโดยใช้ Yelp Business"

( ลิงค์ ) - โปรดทราบว่าผู้เขียนทำงานโดยใช้การกระจายคะแนนเกือบเท่ากันดูรูปที่ 5

ปังโบและลิเลียนลี "การเห็นดวงดาว: การใช้ประโยชน์จากความสัมพันธ์ในชั้นเรียนสำหรับการจัดหมวดหมู่ความรู้สึกที่เกี่ยวข้องกับการให้คะแนน" การประชุมประจำปีครั้งที่ 43 เกี่ยวกับสมาคมภาษาศาสตร์เชิงคำนวณ สมาคมภาษาศาสตร์เชิงคำนวณ, 2548.

( ลิงค์ )

  1. MSE (หรือน้อยกว่านั้นคือ Mean Absolute Error - MAE ) - ดูตัวอย่างเช่น

Lee, Moontae และ R.Grafe "การวิเคราะห์ความคิดเห็นแบบหลายชั้นพร้อมบทวิจารณ์ร้านอาหาร" โครงการสุดท้ายจาก CS N 224 (2010)

( ลิงค์ ) - พวกเขาสำรวจทั้งความแม่นยำและ MSE โดยพิจารณาว่าสิ่งหลังดีกว่า

Pappas, Nikolaos, Rue Marconi และ Andrei Popescu-Belis "การอธิบายดวงดาว: การเรียนรู้แบบหลายอินสแตนซ์แบบถ่วงน้ำหนักสำหรับการวิเคราะห์ความคิดเห็นตามมุมมอง" การดำเนินการของการประชุม 2014 เรื่องวิธีการเชิงประจักษ์ในการประมวลผลภาษาธรรมชาติ เลขที่ EPFL-CONF-200899. พ.ศ. 2557.

( ลิงค์ ) - พวกเขาใช้ scikit-learn สำหรับการประเมินและแนวทางพื้นฐานและระบุว่ารหัสของพวกเขาพร้อมใช้งาน อย่างไรก็ตามฉันหาไม่พบดังนั้นหากคุณต้องการเขียนจดหมายถึงผู้เขียนงานนี้ค่อนข้างใหม่และดูเหมือนว่าจะเขียนด้วยภาษา Python

ค่าใช้จ่ายของข้อผิดพลาดต่างๆ หากคุณสนใจมากขึ้นเกี่ยวกับการหลีกเลี่ยงข้อผิดพลาดขั้นต้นเช่นการให้รีวิว 1 ดาวถึง 5 ดาวหรืออะไรทำนองนั้นให้ดูที่ MSE ถ้าความแตกต่างมีความสำคัญ แต่ไม่มากให้ลองใช้ MAE เนื่องจากมันไม่ได้กำลังสอง มิฉะนั้นให้อยู่กับความถูกต้อง

เกี่ยวกับแนวทางไม่ใช่เมตริก

ลองใช้วิธีการถดถอยเช่นSVRเนื่องจากโดยทั่วไปแล้วจะมีประสิทธิภาพดีกว่าตัวจำแนกประเภทหลายคลาสเช่น SVC หรือ OVA SVM


13

ก่อนอื่นมันยากกว่าเล็กน้อยโดยใช้การวิเคราะห์การนับเพื่อดูว่าข้อมูลของคุณไม่สมดุลหรือไม่ ตัวอย่างเช่นการสังเกตเชิงบวก 1 ใน 1,000 เป็นเพียงเสียงรบกวนข้อผิดพลาดหรือความก้าวหน้าทางวิทยาศาสตร์? คุณไม่เคยรู้.
ดังนั้นจึงเป็นการดีกว่าเสมอที่จะใช้ความรู้ที่มีอยู่ทั้งหมดและเลือกสถานะของมันอย่างชาญฉลาด

เอาล่ะถ้ามันไม่สมดุลจริงๆล่ะ?
อีกครั้ง - ดูข้อมูลของคุณ บางครั้งคุณสามารถพบการสังเกตหนึ่งหรือสองครั้งคูณด้วยร้อยครั้ง บางครั้งการสร้างข้อสังเกตชั้นเดียวปลอมนี้ก็มีประโยชน์
หากข้อมูลทั้งหมดสะอาดขั้นตอนต่อไปคือการใช้น้ำหนักคลาสในแบบจำลองการคาดคะเน

แล้วเมตริกหลายคลาสล่ะ
จากประสบการณ์ของฉันมักจะไม่มีการใช้เมตริกของคุณ มีสองสาเหตุหลัก
ประการแรก: การทำงานกับความน่าจะเป็นจะดีกว่าการทำนายที่มั่นคงเสมอ (เพราะคุณจะแยกแบบจำลองที่มีการทำนาย 0.9 และ 0.6 ได้อย่างไรถ้าทั้งคู่ให้คลาสเดียวกันกับคุณ)
และอย่างที่สอง: การเปรียบเทียบโมเดลการทำนายของคุณและสร้างใหม่นั้นง่ายกว่ามาก ขึ้นอยู่กับเมตริกที่ดีเพียงเมตริกเดียว
จากประสบการณ์ของฉันฉันสามารถแนะนำloglossหรือMSE (หรือหมายถึงข้อผิดพลาดกำลังสอง)

จะแก้ไขคำเตือนของ sklearn ได้อย่างไร?
เพียงแค่ (ตามที่หยางเจี๋ยสังเกตเห็น) เขียนทับaverageพารามิเตอร์ด้วยค่าใดค่าหนึ่งต่อไปนี้: 'micro'(คำนวณเมตริกทั่วโลก) 'macro'(คำนวณเมตริกสำหรับแต่ละป้ายกำกับ) หรือ'weighted'(เช่นเดียวกับมาโคร แต่ใช้น้ำหนักอัตโนมัติ)

f1_score(y_test, prediction, average='weighted')

คำเตือนทั้งหมดของคุณมาหลังจากเรียกฟังก์ชั่นตัวชี้วัดที่มีค่าเริ่มต้นaverageค่า'binary'ที่ไม่เหมาะสมสำหรับการทำนาย multiclass
ขอให้โชคดีและสนุกไปกับแมชชีนเลิร์นนิง!

แก้ไข:
ฉันพบคำแนะนำของผู้ตอบคำถามอื่นเพื่อเปลี่ยนไปใช้วิธีการถดถอย (เช่น SVR) ซึ่งฉันไม่สามารถเห็นด้วยได้ เท่าที่ฉันจำได้ไม่มีแม้แต่สิ่งที่เรียกว่าการถดถอยแบบหลายชั้น ใช่มีการถดถอยแบบหลายป้ายซึ่งแตกต่างกันมากและใช่ในบางกรณีอาจสลับไปมาระหว่างการถดถอยและการจัดหมวดหมู่ (หากเรียงลำดับชั้นเรียน) แต่ค่อนข้างหายาก

สิ่งที่ฉันอยากจะแนะนำ (ในขอบเขตของ scikit-learn) คือการลองใช้เครื่องมือการจำแนกที่มีประสิทธิภาพอื่น ๆ : การเพิ่มการไล่ระดับสี , ป่าสุ่ม (ที่ฉันชอบ), KNeighborsและอื่น ๆ อีกมากมาย

หลังจากนั้นคุณสามารถคำนวณค่าเฉลี่ยเลขคณิตหรือเรขาคณิตระหว่างการคาดคะเนและเวลาส่วนใหญ่คุณจะได้ผลลัพธ์ที่ดียิ่งขึ้น

final_prediction = (KNNprediction * RFprediction) ** 0.5

1
> "สลับไปมาระหว่างการถดถอยและการจัดหมวดหมู่ (หากเรียงลำดับชั้นเรียน) แต่ค่อนข้างหายาก" เป็นกรณี: 5> 4> 3> 2> 1 ฉันขอแนะนำให้คุณดูเอกสารสำหรับงานนี้ - มี วิธีการถดถอยและการจำแนกประเภทสำหรับงาน (บางครั้งในงานเดียวกัน)
Nikita Astrakhantsev

จากนั้นก็ไม่ใช่การจำแนกประเภทหลายคลาส แต่เป็นการถดถอยอย่างง่าย
Vlad Mironov

ใช่ภายในหรือจากมุมมอง ML มันเป็นการถดถอย แต่ในขั้นตอนสุดท้ายเราจะแปลงผลลัพธ์การถดถอยเป็นฉลากดังนั้นจึงเป็นการจัดประเภทหลายคลาส - จากมุมมองของผู้ใช้หรือแอปพลิเคชัน
Nikita Astrakhantsev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.