เหตุใดฉันจึงได้รับแผนผังการตัดสินใจที่มีความแม่นยำ 100%


38

ฉันได้รับความแม่นยำ 100% สำหรับแผนภูมิการตัดสินใจของฉัน ผมทำอะไรผิดหรือเปล่า?

นี่คือรหัสของฉัน:

import pandas as pd
import json
import numpy as np
import sklearn
import matplotlib.pyplot as plt


data = np.loadtxt("/Users/Nadjla/Downloads/allInteractionsnum.csv", delimiter=',')


x = data[0:14]
y = data[-1]


from sklearn.cross_validation import train_test_split

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]


from sklearn.tree import DecisionTreeClassifier
tree = DecisionTreeClassifier()
tree.fit(x_train.astype(int), y_train.astype(int))


from sklearn.metrics import accuracy_score

y_predicted = tree.predict(x_test.astype(int))
accuracy_score(y_test.astype(int), y_predicted)

4
ทำไมคุณคิดว่าคุณกำลังทำอะไรผิดพลาด? บางทีข้อมูลของคุณอาจเป็นสิ่งที่ทำให้คุณได้รับการ
จำแนกที่

64
บังเอิญ +1 ที่สงสัยว่ามีบางอย่างผิดปกติกับความแม่นยำ 100% หรือไม่ คนจำนวนมากเกินไปจะคิดว่าแบบจำลองของพวกเขานั้นยอดเยี่ยม ...
S. Kolassa - Reinstate Monica

1
ใน R มีแพ็คเกจ (คาเร็ต) เพื่อแยกชุดข้อมูลออกเป็นสองกลุ่มโดยอัตโนมัติกลุ่มหนึ่งสำหรับข้อมูลการฝึกอบรมและอีกชุดหนึ่งสำหรับการทดสอบข้อมูล ฉันเรียกกระบวนการนี้เป็นพาร์ติชันข้อมูล ฉันเชื่อว่ามีแพ็กเกจที่คล้ายกันใน Python เพื่อให้ได้พาร์ติชันข้อมูลเช่นกัน
Anastasiya-Romanova 秀

การอ่านเบื้องหลังที่เป็นประโยชน์: ข้อผิดพลาดทั่วไปใน ML
smci

3
@ Anastasiya-Romanova library ห้องสมุด ML ที่จริงจังทุกแห่งมีฟังก์ชั่นนี้รวมถึงที่ใช้โดย OP (OP แม้นำเข้าฟังก์ชั่นที่เกี่ยวข้องและไม่ได้ใช้ด้วยเหตุผลบางอย่าง)
Konrad Rudolph

คำตอบ:


79

ตัวอย่างทดสอบของคุณเป็นชุดย่อยของตัวอย่างการฝึกอบรมของคุณ:

x_train = x[0:2635]
x_test = x[0:658]
y_train = y[0:2635]
y_test = y[0:658]

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

ตรวจสอบให้แน่ใจว่าการฝึกอบรมและข้อมูลการทดสอบของคุณไม่อยู่เช่น

x_train = x[659:2635]
x_test = x[0:658]
y_train = y[659:2635]
y_test = y[0:658]

2
มันจะดีกว่าที่จะใช้sklearn.model_selection.train_test_splitเป็น Juan Ignacio Gil แนะนำตั้งแต่นี้ยังสับชุดและหลีกเลี่ยงความกังวลหากชุดข้อมูลที่ไม่สุ่มในการสั่งซื้อ นอกจากนี้ยังชัดเจนขึ้นเนื่องจากแสดงเจตนาและจัดการการเปลี่ยนแปลงขนาดของชุดข้อมูลโดยอัตโนมัติ
Jack Aidley

1
@JackAidley: ฉันเห็นด้วย (และตอบกลับคำตอบของ Juan เมื่อไม่กี่วันที่ผ่านมา) แม้จะดีกว่าที่จะทำให้การกำหนดแยกสำหรับการแก้จุดบกพร่องโดยการตั้งค่าเมล็ดจำนวนสุ่ม
S. Kolassa - Reinstate Monica

@StephanKolassa สวัสดีครับผมได้รับการปรับเปลี่ยนด้วยชุดไอริสและหลังการใช้GridSearchCVที่มีข้อมูลการฝึกอบรมสำหรับการทดสอบความถูกต้องฉันจะได้รับ KNeighborsClassifier100% ฉันใช้test_train_splitเพื่อแยกชุดข้อมูล ฉันจะทำอะไรผิดที่นี่
Sndn

19

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

สำหรับปัญหาการเรียนรู้ของเครื่องควรแยกชุดการฝึกอบรมและการทดสอบออก ความแม่นยำของแบบจำลองสามารถกำหนดได้เมื่อเราตรวจสอบว่ามันทำนายค่าที่ไม่รู้จักได้อย่างไร


17

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

คุณเกือบจะได้มันเมื่อคุณนำเข้า

from sklearn.cross_validation import train_test_split

แต่คุณไม่ได้ใช้ฟังก์ชั่น คุณควรทำ:

x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.33)

เพื่อรับชุดรถไฟและชุดทดสอบแบบสุ่ม


2

ตามที่ @Stephan Kolassa และ @Sanjay Chandlekar เกิดขึ้นเนื่องจากข้อเท็จจริงที่ว่าตัวอย่างทดสอบของคุณเป็นส่วนย่อยของตัวอย่างการฝึกอบรมของคุณ

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

ฉันไม่ชำนาญใน Python แต่ซอฟต์แวร์เชิงสถิติควรอนุญาตให้มีการสุ่มตัวอย่าง คำแนะนำบางอย่างยังมีในSO


0

เพียงแค่ต้องการที่จะพูดปรีชาในเหตุผลที่คุณต้องแยกการฝึกอบรมและตัวอย่างการทดสอบอย่างชัดเจน

nnn-1n=2

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

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


0

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

ดูบทความที่ตัดตอนมานี้จากมีดหมออธิบายวิธีการตัดตัวอย่างเป็นถังที่ดีเกินไป ตารางสถิติของ Munchausen นอกจากนี้ยังเป็นพื้นฐานสำหรับการ์ตูน XKCD อย่างมีนัยสำคัญ

การได้รับความแม่นยำ 100% นั้นอยู่ห่างเพียงไม่กี่ก้าวจากการค้นหาลักษณนามที่ใช้งานได้ดี

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.