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:
- sử dụng
sklearn.cross_validation.cross_val_score
- 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!
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
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
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