Tại sao tôi nhận được cây quyết định chính xác 100%?


38

Tôi đang nhận được độ chính xác 100% cho cây quyết định của mình. Tôi đang làm gì sai?

Đây là mã của tôi:

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
Tại sao bạn nghĩ rằng bạn đang làm điều gì đó sai? Có lẽ dữ liệu của bạn là như vậy mà bạn có thể đạt được một phân loại hoàn hảo ...
Knarpie 22/03/18

64
Ngẫu nhiên, +1 để tự hỏi liệu có gì đó không đúng với độ chính xác 100%. Quá nhiều người sẽ nghĩ rằng mô hình của họ là tuyệt vời ...
S. Kolassa - Tái lập lại Monica

1
Trong R có một gói (dấu mũ) để tự động chia một tập dữ liệu thành hai nhóm, một nhóm để đào tạo dữ liệu và nhóm còn lại để kiểm tra dữ liệu. Tôi gọi quá trình này là phân vùng dữ liệu. Tôi tin rằng cũng có một gói tương tự trong Python để đạt được phân vùng dữ liệu.
Anastasiya-Romanova


3
@ Anastasiya-Romanova Khá nhiều thư viện ML nghiêm túc đều chứa chức năng này, bao gồm cả thư viện được OP sử dụng (OP thậm chí đã nhập chức năng có liên quan và không sử dụng vì lý do nào đó).
Konrad Rudolph

Câu trả lời:


79

Mẫu thử nghiệm của bạn là một tập hợp con của mẫu đào tạo của bạn:

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

Điều này có nghĩa là bạn đánh giá mô hình của mình trên một phần dữ liệu đào tạo của bạn, nghĩa là bạn đang thực hiện đánh giá trong mẫu. Độ chính xác trong mẫu là một chỉ số nổi tiếng kém về độ chính xác ngoài mẫu và tối đa hóa độ chính xác trong mẫu có thể dẫn đến quá mức. Do đó, người ta phải luôn luôn đánh giá một mô hình trên một mẫu nắm giữ thực sự hoàn toàn độc lập với dữ liệu đào tạo.

Hãy chắc chắn rằng đào tạo của bạn và dữ liệu thử nghiệm của bạn là rời rạc, ví dụ,

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

2
Sẽ tốt hơn nếu sử dụng sklearn.model_selection.train_test_splitnhư Juan Ignacio Gil gợi ý vì điều này cũng xáo trộn các bộ và tránh những lo ngại nếu bộ dữ liệu không ngẫu nhiên trong việc đặt hàng. Nó cũng rõ ràng hơn vì nó thể hiện ý định và tự động xử lý các thay đổi về kích thước của tập dữ liệu.
Jack Aidley

1
@JackAidley: Tôi đồng ý (và đánh giá cao câu trả lời của Juan vài ngày trước). Thậm chí tốt hơn là làm cho phân tách xác định để gỡ lỗi bằng cách đặt hạt giống số ngẫu nhiên .
S. Kolassa - Phục hồi Monica

@StephanKolassa Xin chào, tôi đã điều chỉnh với bộ dữ liệu Iris và sau khi sử dụng GridSearchCVvới dữ liệu đào tạo, để kiểm tra độ chính xác, tôi nhận được 100% với KNeighborsClassifier. Tôi đã sử dụng test_train_splitđể chia dữ liệu. Tôi có thể làm gì sai ở đây?
Sndn

19

Bạn đang nhận được độ chính xác 100% vì bạn đang sử dụng một phần dữ liệu đào tạo để thử nghiệm. Tại thời điểm đào tạo, cây quyết định đã thu được kiến ​​thức về dữ liệu đó và bây giờ nếu bạn đưa ra cùng một dữ liệu để dự đoán thì nó sẽ cho giá trị chính xác như nhau. Đó là lý do tại sao cây quyết định tạo ra kết quả chính xác mỗi lần.

Đối với bất kỳ vấn đề máy học, tập dữ liệu đào tạo và kiểm tra nên được tách riêng. Độ chính xác của mô hình chỉ có thể được xác định khi chúng ta kiểm tra xem nó dự đoán như thế nào cho các giá trị chưa biết.


17

Như những người dùng khác đã nói với bạn, bạn đang sử dụng làm bộ kiểm tra một tập hợp con của tập tàu và cây quyết định rất dễ bị quá mức.

Bạn gần như đã có nó khi bạn nhập khẩu

from sklearn.cross_validation import train_test_split

Nhưng sau đó bạn không sử dụng chức năng. Bạn nên làm:

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

để có được bộ thử nghiệm và xe lửa ngẫu nhiên


2

Như được chỉ ra bởi @Stephan Kolassa và @Sanjay Chandlekar, điều này là do thực tế rằng mẫu thử nghiệm của bạn là một tập hợp con của mẫu đào tạo của bạn.

Tuy nhiên, đối với việc lựa chọn các mẫu đó, lấy mẫu ngẫu nhiên sẽ phù hợp hơn để đảm bảo rằng cả hai mẫu đều đại diện. Tùy thuộc vào cấu trúc dữ liệu của bạn, bạn cũng có thể xem xét lấy mẫu ngẫu nhiên phân tầng.

Tôi không rành về Python nhưng bất kỳ phần mềm thống kê nào cũng cho phép lấy mẫu ngẫu nhiên; một số gợi ý cũng có sẵn trên SO .


0

Chỉ muốn hòa nhập vào trực giác về lý do tại sao bạn cần phân chia các mẫu đào tạo và kiểm tra một cách rõ ràng.

nnn1n=2

Điều này được gọi là quá mức vì quá trình phân tách này cực kỳ khó dự đoán về các điểm dữ liệu có liên quan đến vấn đề của bạn nhưng bạn chưa quan sát thấy .

Tất nhiên, toàn bộ quan điểm của việc xây dựng các nền tảng dự đoán này là tạo ra các công cụ có thể được áp dụng cho dữ liệu chưa từng thấy trước đây; phân tách dữ liệu chúng tôi có thành các mẫu thử nghiệm và huấn luyện là một nỗ lực để mô phỏng sự tự làm mù này và cảnh sát các mô hình của chúng tôi không bị quá tải theo kiểu trên.


0

Bạn không cần độ chính xác 100% để có được quá mức. Với đủ số lượng xô, bạn có thể nhận được kết quả không thể đưa ra (một cái gì đó trông có vẻ ngoài mẫu khủng khiếp).

Xem bài viết trích dẫn này từ Lancet, mô tả phương pháp băm một mẫu vào các thùng quá tốt. Lưới thống kê của Munchausen Nó cũng là nền tảng cho phim hoạt hình XKCD đáng kể

Đạt được độ chính xác 100% chỉ là một bước ngắn để tìm một bộ phân loại hoạt động tốt.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.