2015-05-04 13 views
19

Tôi đã cố gắng chia nhỏ tập dữ liệu mẫu bằng cách sử dụng Scikit-learn's Stratified Shuffle Split. Tôi làm theo các ví dụ hiển thị trên Scikit-học tài liệu heresklearn.cross_validation.StratifiedShuffleSplit - error: "chỉ số là out-of-bounds"

import pandas as pd 
import numpy as np 
# UCI's wine dataset 
wine = pd.read_csv("https://s3.amazonaws.com/demo-datasets/wine.csv") 

# separate target variable from dataset 
target = wine['quality'] 
data = wine.drop('quality',axis = 1) 

# Stratified Split of train and test data 
from sklearn.cross_validation import StratifiedShuffleSplit 
sss = StratifiedShuffleSplit(target, n_iter=3, test_size=0.2) 

for train_index, test_index in sss: 
    xtrain, xtest = data[train_index], data[test_index] 
    ytrain, ytest = target[train_index], target[test_index] 

# Check target series for distribution of classes 
ytrain.value_counts() 
ytest.value_counts() 

Tuy nhiên, khi chạy kịch bản này, tôi nhận được lỗi sau:

IndexError: indices are out-of-bounds 

thể ai đó hãy chỉ ra những gì tôi đang làm sai ở đây ? Cảm ơn!

+2

Dường như lỗi chỉ mục của bạn sẽ xảy ra ở đây: 'xtrain, xtest = data [train_index], dữ liệu [test_index]'. Nếu vậy, bạn có thể chỉnh sửa câu hỏi của mình để giúp người khác xác định sự cố. – Scott

Trả lời

39

Bạn đang chạy vào các quy ước khác nhau cho Pandas DataFrame lập chỉ mục so với NumPy ndarray lập chỉ mục. Các mảng train_indextest_index là tập hợp các chỉ mục hàng. Nhưng data là đối tượng Pandas DataFrame và khi bạn sử dụng một chỉ mục duy nhất vào đối tượng đó, như trong data[train_index], Pandas đang mong đợi train_index để chứa các nhãn cột thay vì chỉ mục hàng. Bạn có thể chuyển đổi các dataframe đến một mảng NumPy, sử dụng .values:

data_array = data.values 
for train_index, test_index in sss: 
    xtrain, xtest = data_array[train_index], data_array[test_index] 
    ytrain, ytest = target[train_index], target[test_index] 

hoặc sử dụng Pandas .iloc accessor:

for train_index, test_index in sss: 
    xtrain, xtest = data.iloc[train_index], data.iloc[test_index] 
    ytrain, ytest = target[train_index], target[test_index] 

tôi có xu hướng ủng hộ cách tiếp cận thứ hai, vì nó mang lại cho xtrainxtest của nhập DataFrame thay vì ndarray và do đó giữ các nhãn cột.

+0

Cảm ơn bạn Mark, accessor '.iloc' hoạt động hoàn hảo. – Jason

+0

Với Pandas 0.17.1 và Scikit Tìm hiểu 0.17.0, điều này không hoạt động. Sau đây cung cấp cho các lỗi tương tự như OP đăng: 'lưới = GridSearchCV (decision_tree, param_grid = {'max_depth': np.arange (1,3)}, cv = sss, ghi = 'roc_auc')' 'lưới. phù hợp (xtrain, ytrain) '. –

+0

@WR: Điều đó trông giống như một vấn đề khác với tôi; bạn có thể muốn đăng câu hỏi mới. –

Các vấn đề liên quan