Tham số “phân tầng” từ phương thức “train_test_split” (scikit Learn)


94

Tôi đang cố gắng sử dụng train_test_splittừ gói scikit Learn, nhưng tôi gặp sự cố với tham số stratify. Sau đây là mã:

from sklearn import cross_validation, datasets 

X = iris.data[:,:2]
y = iris.target

cross_validation.train_test_split(X,y,stratify=y)

Tuy nhiên, tôi tiếp tục gặp sự cố sau:

raise TypeError("Invalid parameters passed: %s" % str(options))
TypeError: Invalid parameters passed: {'stratify': array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 
2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])}

Có ai đó có ý tưởng về những gì đang xảy ra? Dưới đây là tài liệu chức năng.

[...]

phân tầng : giống mảng hoặc Không có (mặc định là Không có)

Nếu không phải Không, dữ liệu được chia theo kiểu phân tầng, sử dụng dữ liệu này làm mảng nhãn.

Tính năng mới trong phiên bản 0.17: phân tách phân tầng

[...]


Không, tất cả đã được giải quyết.
Daneel Olivaw

Câu trả lời:


58

Scikit-Learn chỉ cho bạn biết rằng nó không nhận ra đối số "phân tầng", không phải là bạn đang sử dụng nó không đúng cách. Điều này là do tham số đã được thêm vào trong phiên bản 0.17 như được chỉ ra trong tài liệu bạn đã trích dẫn.

Vì vậy, bạn chỉ cần cập nhật Scikit-Learn.


Tôi gặp lỗi tương tự, mặc dù tôi có phiên bản 0.21.2 của scikit-learning. scikit-learn 0.21.2 py37h2a6a0b8_0 conda-forge
Kareem Jeiroudi

325

stratifyTham số này tạo ra sự phân tách để tỷ lệ các giá trị trong mẫu được tạo ra sẽ giống với tỷ lệ các giá trị được cung cấp cho tham số stratify.

Ví dụ: nếu biến ylà một biến phân loại nhị phân với các giá trị 01và có 25% số không và 75% giá trị, stratify=ysẽ đảm bảo rằng phần tách ngẫu nhiên của bạn có 25% số 0và 75% số 1.


117
Điều này không thực sự trả lời câu hỏi nhưng rất hữu ích cho việc hiểu cách hoạt động của nó. Cảm ơn rất nhiều.
Reed Jessen

6
Tôi vẫn đang đấu tranh để hiểu, tại sao sự phân tầng này lại cần thiết: Nếu có sự cân bằng lớp trong dữ liệu, thì nó sẽ không được bảo toàn ở mức trung bình khi thực hiện chia tách ngẫu nhiên dữ liệu?
Holger Brandl

14
@HolgerBrandl nó sẽ được giữ nguyên ở mức trung bình; với phân tầng, nó sẽ được bảo quản chắc chắn.
Yonatan

7
@HolgerBrandl với các tập dữ liệu rất nhỏ hoặc rất mất cân bằng, rất có thể sự phân tách ngẫu nhiên có thể loại bỏ hoàn toàn một lớp khỏi một trong các phân tách.
cddt

1
@HolgerBrandl Câu hỏi hay! Có lẽ chúng tôi có thể thêm rằng trước tiên, bạn phải chia thành đào tạo và tập thử nghiệm bằng cách sử dụng stratify. Sau đó, thứ hai, để điều chỉnh sự mất cân bằng, cuối cùng bạn cần phải chạy oversampling hoặc undersampling trên tập huấn luyện. Nhiều bộ phân loại Sklearn có một tham số gọi là class-weight mà bạn có thể đặt thành cân bằng. Cuối cùng, bạn cũng có thể lấy một số liệu phù hợp hơn là độ chính xác cho tập dữ liệu không cân bằng. Hãy thử, F1 hoặc khu vực dưới ROC.
Claude COULOMBE

62

Đối với tương lai của tôi, người đến đây qua Google:

train_test_splithiện đang ở model_selection, do đó:

from sklearn.model_selection import train_test_split

# given:
# features: xs
# ground truth: ys

x_train, x_test, y_train, y_test = train_test_split(xs, ys,
                                                    test_size=0.33,
                                                    random_state=0,
                                                    stratify=ys)

là cách để sử dụng nó. Đặt giá trị random_statemong muốn cho khả năng tái lập.


Đây hẳn là câu trả lời :) Cảm ơn
SwimBikeRun

15

Trong ngữ cảnh này, phân tầng có nghĩa là phương thức train_test_split trả về các tập con huấn luyện và kiểm tra có cùng tỷ lệ nhãn lớp với tập dữ liệu đầu vào.


3

Hãy thử chạy mã này, nó "chỉ hoạt động":

from sklearn import cross_validation, datasets 

iris = datasets.load_iris()

X = iris.data[:,:2]
y = iris.target

x_train, x_test, y_train, y_test = cross_validation.train_test_split(X,y,train_size=.8, stratify=y)

y_test

array([0, 0, 0, 0, 2, 2, 1, 0, 1, 2, 2, 0, 0, 1, 0, 1, 1, 2, 1, 2, 0, 2, 2,
       1, 2, 1, 1, 0, 2, 1])

@ user5767535 Như bạn có thể thấy nó đang hoạt động trên máy Ubuntu của tôi, với sklearnphiên bản '0.17', phân phối Anaconda cho Python 3,5. Tôi chỉ có thể đề xuất kiểm tra thêm một lần nữa nếu bạn nhập mã chính xác và cập nhật phần mềm của mình.
Sergey Bushmanov

2
@ user5767535 BTW, "mới trong phiên bản 0.17: phân tầng tách" khiến tôi gần như chắc chắn rằng bạn phải cập nhật của bạn sklearn...
Sergey Bushmanov
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.