我正在尝试进行3倍10倍交叉验证。问题是我不断从三个不同的迭代中获得相同的结果,这告诉我褶皱没有以不同的方式分开。为什么会这样,以及我如何才能使它每次都是随机的(或至少基于i)?
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
import statistics as stats
import random
import numpy as np
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
print(X)
print(y)
CVScores = []
for i in range(0, 3):
np.random.seed(i)
ada = AdaBoostClassifier(n_estimators=100, random_state=np.random.RandomState(i))
ada.fit(X, y)
CVScores.extend(list(cross_val_score(ada, X, y, cv=10, scoring="f1")))
print(CVScores)
mean = stats.mean(CVScores)
print(mean)
答案 0 :(得分:0)
您已在函数中定义了random_state。定义的random_state是“足够随机”的,但是为了产生可重复的实验而严格地确定性。请参阅关于随机状态的wiki-page,并可能会深入研究random seeds的理论。
random_state:int,RandomState实例或无(默认值)确定 用于创建数据集的随机数。传递一个int 在多个函数调用之间可重现的输出。请参阅词汇表。
为避免这种情况,要么根本不设置它(默认值为None
,要么将其设置为none:random_state=None
答案 1 :(得分:0)
有一个函数可以解决这个问题。
from sklearn.ensemble import AdaBoostClassifier
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score, KFold
import statistics as stats
import random
import numpy as np
X, y = make_classification(n_samples=1000, n_features=4,
n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
print(X)
print(y)
CVScores = []
for i in range(0, 3):
kf = KFold(n_splits=10, shuffle=True, random_state=i)
kf.get_n_splits(X)
ada = AdaBoostClassifier(n_estimators=100)
ada.fit(X, y)
CVScores.extend(list(cross_val_score(ada, X, y, cv=kf, scoring="f1")))
print(CVScores)
mean = stats.mean(CVScores)
print(mean)