Jac*_*ain 5 python scikit-learn
我正在scikit-learn训练一些分类器.我做交叉验证,然后计算AUC.但是,每次运行测试时,我都会得到不同的AUC编号,尽管我确保使用种子和a RandomState.我希望我的测试是确定性的.这是我的代码:
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)
Run Code Online (Sandbox Code Playgroud)
我的问题:1-我的代码中是否有错误导致每次运行时结果都不同?2-是否存在使scikit具有确定性的全局方法?
编辑:
我刚试过这个:
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
Run Code Online (Sandbox Code Playgroud)
然后我做了:
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
Run Code Online (Sandbox Code Playgroud)
然后我做了:
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!!!!
Run Code Online (Sandbox Code Playgroud)
如你所见,虽然我使用了相同的random_state,但我得到了不同的结果!怎么解决这个?
LogisticRegression内部使用随机性并有一个(未记录的,稍后会修复)random_state参数。
没有设置随机状态的全局方法,因为不幸的是,随机状态LogisticRegression和 SVM 代码只能以一种 hacky 的方式设置。这是因为该代码来自 Liblinear 和 LibSVM,它们使用 C 标准库的rand函数,并且无法以原则性的方式进行播种。
编辑以上是正确的,但可能不是问题的原因。您np.random.RandomState通过调用来线程化单个整数,同时您应该传递相同的整数种子以方便重现。
| 归档时间: |
|
| 查看次数: |
1360 次 |
| 最近记录: |