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?
per favore controlla la mia modifica !!! –
@AlexTwain Sembra che tu stia riutilizzando 'np.random.RandomState' attraverso le chiamate invece di costruirne una nuova con lo stesso seme ogni volta. –
questo è vero. Non sapevo che avrei dovuto costruirne uno nuovo !!! Oh mio Dio, devo modificare il mio * intero * codice :( –