2015-05-21 12 views
9

Tôi có ma trận với 20 cột. Cột cuối cùng là 0/1 nhãn.Sự khác biệt giữa việc sử dụng train_test_split và cross_val_score trong sklearn.cross_validation

Liên kết tới dữ liệu là here.

Tôi đang cố chạy rừng ngẫu nhiên trên tập dữ liệu, sử dụng xác thực chéo. Tôi sử dụng hai phương pháp để làm điều này:

  1. sử dụng sklearn.cross_validation.cross_val_score
  2. sử dụng sklearn.cross_validation.train_test_split

Tôi nhận được kết quả khác nhau khi tôi làm những gì tôi nghĩ là khá nhiều điều tương tự. Để minh họa, tôi chạy xác thực chéo hai lần bằng cách sử dụng hai phương pháp ở trên, như trong mã bên dưới.

import csv 
import numpy as np 
import pandas as pd 
from sklearn import ensemble 
from sklearn.metrics import roc_auc_score 
from sklearn.cross_validation import train_test_split 
from sklearn.cross_validation import cross_val_score 

#read in the data 
data = pd.read_csv('data_so.csv', header=None) 
X = data.iloc[:,0:18] 
y = data.iloc[:,19] 

depth = 5 
maxFeat = 3 

result = cross_val_score(ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False), X, y, scoring='roc_auc', cv=2) 

result 
# result is now something like array([ 0.66773295, 0.58824739]) 

xtrain, xtest, ytrain, ytest = train_test_split(X, y, test_size=0.50) 

RFModel = ensemble.RandomForestClassifier(n_estimators=1000, max_depth=depth, max_features=maxFeat, oob_score=False) 
RFModel.fit(xtrain,ytrain) 
prediction = RFModel.predict_proba(xtest) 
auc = roc_auc_score(ytest, prediction[:,1:2]) 
print auc #something like 0.83 

RFModel.fit(xtest,ytest) 
prediction = RFModel.predict_proba(xtrain) 
auc = roc_auc_score(ytrain, prediction[:,1:2]) 
print auc #also something like 0.83 

Câu hỏi của tôi là:

tại sao tôi lại nhận được kết quả khác nhau, ví dụ, tại sao AUC (metric Tôi đang sử dụng) cao hơn khi tôi sử dụng train_test_split?

Lưu ý: Khi tôi sử dụng nhiều nếp gấp hơn (có 10 lần), có vẻ như có một số mẫu trong kết quả của tôi, với phép tính đầu tiên luôn mang lại cho tôi AUC cao nhất.

Trong trường hợp xác thực chéo hai lần trong ví dụ trên, AUC đầu tiên luôn cao hơn giá trị thứ hai; nó luôn luôn là một cái gì đó như 0,70 và 0,58.

Cảm ơn sự giúp đỡ của bạn!

+0

là dữ liệu của bạn được ngẫu nhiên ban đầu? Nếu tôi nhớ đúng, một hoặc cả hai phương pháp mặc định sẽ tách dữ liệu mà không có sự ngẫu nhiên. Điều đó có thể giải thích "mẫu" mà bạn đề cập đến, mặc dù nó có thể không giải thích được kết quả tổng thể kém hơn với phương pháp đầu tiên (có thể là) – KCzar

+0

Không, dữ liệu không được ngẫu nhiên ban đầu. Nó dường như là một lời giải thích tốt cho lý do tại sao các kết quả thể hiện cùng một mẫu trong cross_val_score. Tôi đoán phần ngẫu nhiên duy nhất của cross_val_score trong trường hợp của tôi là một thực tế là randomForestClassifier có một số ngẫu nhiên trong thuật toán của nó để chọn các tính năng trong cây của nó.Ngoài ra, nếu nó chỉ cắt dữ liệu thành n nếp gấp dựa trên thứ tự ban đầu, thì có thể đó là vấn đề. Tôi sẽ kiểm tra nó trong một vài giờ khi tôi thực sự thức dậy, đó là nửa đêm ở đây! – evianpring

+0

vì vậy, vâng, điều này đã làm việc: p = np.random.permutation (len (y)) Kết quả = cross_val_score (ensemble.RandomForestClassifier (n_estimators = 1000, max_depth = 5, max_features = 3, oob_score = False), X [p], y [p], điểm = 'roc_auc', cv = 2) – evianpring

Trả lời

12

Khi sử dụng cross_val_score, bạn sẽ thường xuyên muốn sử dụng một KFolds hoặc StratifiedKFolds iterator:

http://scikit-learn.org/0.10/modules/cross_validation.html#computing-cross-validated-metrics

http://scikit-learn.org/0.10/modules/generated/sklearn.cross_validation.KFold.html#sklearn.cross_validation.KFold

Theo mặc định, cross_val_score sẽ không ngẫu nhiên dữ liệu của bạn, có thể tạo ra kết quả lẻ như thế này nếu dữ liệu của bạn không phải là ngẫu nhiên để bắt đầu.

Các KFolds iterator có một tham số trạng thái ngẫu nhiên:

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.KFold.html

Vì vậy, hiện train_test_split, mà ngẫu nhiên theo mặc định:

http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html

Patterns như những gì bạn mô tả thường Kết quả là thiếu sự ngẫu nhiên trong tập huấn luyện/kiểm tra.

+0

Tôi có câu hỏi về ** train_test_split **. Trong đoạn mã trên 'xtrain, xtest, ytrain, ytest = train_test_split (X, y, test_size = 0,50)', thuật toán biết giá trị nào phải đi vào 'xtrain',' xtest' etc? Làm thế nào để biết rằng 'xtrain' phải chứa kết quả của _training các biến độc lập_ của tập dữ liệu, và tương tự trên' xtest'. Tôi không cho rằng thực tế là biến chứa 'train' hoặc 'test' trong đó. Là nó? Cảm ơn bạn đã giúp đỡ. –

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