我使用scikit-learn库进行机器学习(带有文本数据)。它看起来像这样:
vectorizer = TfidfVectorizer(analyzer='word', tokenizer=nltk.word_tokenize, stop_words=stop_words).fit(train)
matr_train = vectorizer.transform(train)
X_train = matr_train.toarray()
matr_test = vectorizer.transform(test)
X_test = matr_test.toarray()
rfc = RandomForestClassifier()
rfc.fit(X_train, y_train)
y_predict = rfc.predict(X_test)
当我第一次运行它时,测试数据集的结果是召回率为 0.17,精度为 1.00。 好的。但是当我在这个测试数据集和这个训练数据集上第二次运行它时,结果是不同的 - 召回率为 0.23,精度为 1.00。当我下次运行它时,结果会有所不同。同时,训练数据集的精度和召回率是相同的。
为什么会这样?也许这个事实指的是我的数据?
谢谢。
随机森林在数据集的各个子样本上拟合多个决策树分类器。每次调用分类器时,都会随机生成子样本,从而产生不同的结果。为了控制这个东西,你需要设置一个名为 random_state
.
rfc = RandomForestClassifier(random_state=137)
请注意,random_state
是随机数生成器使用的种子。您可以使用任何整数来设置此参数。每当您更改random_state
值时,结果都可能会更改。但只要你对random_state
使用相同的值,你就会得到相同的结果。
random_state
参数也用于各种其他分类器。例如,在神经网络中,我们使用random_state
来固定分类器每次运行的初始权重向量。这有助于调整其他超参数,如学习率、权重衰减等。如果我们不设置 random_state
,我们不确定性能变化是由于超参数的变化还是由于初始权重向量的变化。调整超参数后,我们可以更改random_state
以进一步提高模型的性能。
线索(至少部分)在名称中。
随机森林使用随机决策树,因此,每次拟合时,结果都会发生变化。
https://www.quora.com/How-does-randomization-in-a-random-forest-work