2014-05-03 19 views
5

Tôi đang sử dụng scikit-learn để đào tạo một số trình phân loại. Tôi thực hiện xác nhận chéo và sau đó tính AUC. Tuy nhiên, tôi nhận được một số AUC khác nhau mỗi lần tôi chạy thử nghiệm mặc dù tôi đã chắc chắn sử dụng một hạt giống và một số RandomState. Tôi muốn các bài kiểm tra của tôi được xác định. Dưới đây là mã của tôi:Làm cho xác định scikit?

from sklearn.utils import shuffle 
SEED = 0 
random_state = np.random.RandomState(SEED) 
X, y = shuffle(data, Y, random_state=random_state) 
X_train, X_test, y_train, y_test = \ 
     cross_validation.train_test_split(X, y, test_size=test_size, random_state=random_state) 
clf = linear_model.LogisticRegression() 
kfold = cross_validation.KFold(len(X), n_folds=n_folds) 
mean_tpr = 0.0 
mean_fpr = np.linspace(0, 1, 100) 

for train, test in kfold: 
     probas_ = clf.fit(X[train], Y[train]).predict_proba(X[test]) 
     fpr, tpr, thresholds = roc_curve(Y[test], probas_[:, 1]) 
     mean_tpr += interp(mean_fpr, fpr, tpr) 
     mean_tpr[0] = 0.0 

mean_tpr /= len(kfold) 
mean_tpr[-1] = 1.0 
mean_auc = auc(mean_fpr, mean_tpr) 

Câu hỏi của tôi: 1- Có điều gì sai trái trong mã của tôi đó là làm cho kết quả khác nhau mỗi khi tôi chạy nó? 2- Có cách nào toàn cầu để xác định scikit?

EDIT:

Tôi chỉ cố gắng này:

test_size = 0.5 
X = np.random.randint(10, size=(10,2)) 
Y = np.random.randint(2, size=(10)) 
SEED = 0 
random_state = np.random.RandomState(SEED) 
X_train, X_test, y_train, y_test = \ 
    cross_validation.train_test_split(X, Y, test_size=test_size, random_state=random_state) 

print X_train # I recorded the result 

Sau đó, tôi đã làm:

X_train, X_test, y_train, y_test = \ 
    cross_validation.train_test_split(X, Y, test_size=test_size, random_state=6) #notice the change in random_state 

Sau đó, tôi đã làm:

X_train, X_test, y_train, y_test = \ 
    cross_validation.train_test_split(X, Y, test_size=test_size, random_state=random_state) 

print X_train #the result is different from the first one!!!! 

Như yo u thấy tôi nhận được kết quả khác nhau mặc dù tôi đã sử dụng cùng một random_state! Làm thế nào để giải quyết điều này?

Trả lời

4

LogisticRegression sử dụng tính ngẫu nhiên trong nội bộ và có (không có giấy tờ, sẽ khắc phục trong giây lát) đối số random_state.

Không có cách nào toàn cục để đặt trạng thái ngẫu nhiên, vì không may trạng thái ngẫu nhiên trên LogisticRegression và mã SVM chỉ có thể được đặt theo cách hacky. Đó là vì mã này xuất phát từ Liblinear và LibSVM, sử dụng chức năng rand của thư viện chuẩn và không thể được gieo giống theo cách nguyên tắc.

EDIT Điều trên là đúng, nhưng có lẽ không phải là nguyên nhân của sự cố. Bạn đang luồng một np.random.RandomState duy nhất thông qua các cuộc gọi của mình, trong khi bạn nên chuyển hạt giống số nguyên giống nhau để dễ tái tạo.

+0

vui lòng kiểm tra chỉnh sửa của tôi !!! –

+0

@AlexTwain Bạn dường như đang sử dụng lại một 'np.random.RandomState' qua các cuộc gọi thay vì xây dựng một cái mới với cùng một hạt giống mỗi lần. –

+0

đó là sự thật. Tôi không biết rằng tôi nên xây dựng một cái mới !!! Ôi chúa ơi, tôi phải sửa toàn bộ mã * của mình :( –

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