ily*_*nam 5 python scikit-learn cross-validation
使用 sklearn,当你创建一个新的 KFold 对象并且 shuffle 为真时,它会产生一个不同的、新的随机折叠索引。但是,即使 shuffle 为真,来自给定 KFold 对象的每个生成器也会为每个折叠提供相同的索引。为什么它会这样工作?
例子:
from sklearn.cross_validation import KFold
X = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])
y = np.array([1, 2, 3, 4])
kf = KFold(4, n_folds=2, shuffle = True)
?
for fold in kf:
print fold
?
print '---second round----'
?
for fold in kf:
print fold
Run Code Online (Sandbox Code Playgroud)
输出:
(array([2, 3]), array([0, 1]))
(array([0, 1]), array([2, 3]))
---second round----#same indices for the folds
(array([2, 3]), array([0, 1]))
(array([0, 1]), array([2, 3]))
Run Code Online (Sandbox Code Playgroud)
这个问题的动机是对这个答案的评论。我决定将其拆分为一个新问题,以防止该答案变得太长。
具有相同 KFold 对象的新迭代不会重新调整索引,这仅在对象实例化期间发生。KFold()永远不会看到数据,但知道样本数量,因此它使用它来洗牌索引。从 KFold 实例化期间的代码:
if shuffle:
rng = check_random_state(self.random_state)
rng.shuffle(self.idxs)
Run Code Online (Sandbox Code Playgroud)
每次调用生成器迭代每个折叠的索引时,它将使用相同的混洗索引并以相同的方式划分它们。
看一看KFold 基类的代码是在_PartitionIterator(with_metaclass(ABCMeta))哪里__iter__定义的。__iter__基类中的方法调用_iter_test_indicesKFold 来划分并生成每个折叠的训练和测试索引。
| 归档时间: |
|
| 查看次数: |
2167 次 |
| 最近记录: |