我使用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。当我下次运行它时,结果会有所不同。同时,训练数据集的精度和召回率是一致的。
为什么会这样?也许这个事实涉及我的数据?
感谢。
答案 0 :(得分:2)
随机森林在数据集的各个子样本上拟合了许多决策树分类器。每次调用分类器时,都会随机生成子样本,从而产生不同的结果。为了控制这件事,你需要设置一个名为random_state
的参数。
rfc = RandomForestClassifier(random_state=137)
请注意random_state
是随机数生成器使用的种子。您可以使用任何整数来设置此参数。每当您更改random_state
值时,结果都可能会发生变化。但只要您对random_state
使用相同的值,您就会得到相同的结果。
random_state
参数也用于其他各种分类器。例如,在神经网络中,我们使用random_state
来修复分类器每次运行的初始权重向量。这有助于调整其他超参数,例如学习率,体重衰减等。如果我们不设置{{1} },我们不确定性能变化是由于超参数的变化还是由于初始权重向量的变化。一旦我们调整超参数,我们就可以更改random_state
以进一步提高模型的性能。
答案 1 :(得分:1)
线索(至少部分)在名称中。
随机森林使用随机决策树,因此,每次适合时,结果都会发生变化。
https://www.quora.com/How-does-randomization-in-a-random-forest-work