2014-05-03 13 views
5

Sto usando scikit-learn per addestrare alcuni classificatori. Effettuo la convalida incrociata e quindi computo l'AUC. Tuttavia, ogni volta che eseguo i test ricevo un numero AUC diverso, anche se mi sono assicurato di utilizzare un seed e un RandomState. Voglio che i miei test siano deterministici. ci 1- qualcosa che non va nel mio codice che sta facendo i risultati diversi ogni volta che l'eseguo: Ecco il mio codice:Rendere deterministico lo 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) 

Le mie domande? 2- Esiste un modo globale per rendere deterministico lo scikit?

EDIT:

Ho appena provato questo:

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 

Poi ho fatto:

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 

Poi ho fatto:

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!!!! 

Come yo vedo che sto ottenendo risultati diversi anche se ho usato lo stesso random_state! Come risolvere questo?

risposta

4

LogisticRegression utilizza la casualità internamente e ha un argomento (non documentato, risolverà in un momento) random_state.

Non esiste un modo globale di impostare lo stato casuale, perché sfortunatamente lo stato casuale su LogisticRegression e il codice SVM può essere impostato solo in modo hacky. Questo perché questo codice proviene da Liblinear e LibSVM, che utilizzano la funzione rand della libreria C standard e che non può essere inizializzata in modo di principio.

EDIT Quanto sopra è vero, ma probabilmente non è la causa del problema. Stai trasmettendo un singolo np.random.RandomState attraverso le tue chiamate, mentre dovresti passare lo stesso seme intero per una facile riproducibilità.

+0

per favore controlla la mia modifica !!! –

+0

@AlexTwain Sembra che tu stia riutilizzando 'np.random.RandomState' attraverso le chiamate invece di costruirne una nuova con lo stesso seme ogni volta. –

+0

questo è vero. Non sapevo che avrei dovuto costruirne uno nuovo !!! Oh mio Dio, devo modificare il mio * intero * codice :( –