Syntax Scikit学习梯度提升分类器随机_状态不工作

Syntax Scikit学习梯度提升分类器随机_状态不工作,syntax,parameters,scikit-learn,classification,boosting,Syntax,Parameters,Scikit Learn,Classification,Boosting,所以我在sklearn中使用了不同的分类器,发现不管random_状态参数GradientBoostingClassifier的值是多少,它总是返回相同的值。例如,当我运行以下代码时: import numpy as np from sklearn.ensemble import GradientBoostingClassifier from sklearn import datasets from sklearn.model_selection import train_test_split

所以我在sklearn中使用了不同的分类器,发现不管random_状态参数GradientBoostingClassifier的值是多少,它总是返回相同的值。例如,当我运行以下代码时:

import numpy as np
from sklearn.ensemble import GradientBoostingClassifier
from sklearn import datasets
from sklearn.model_selection import train_test_split
iris = datasets.load_iris()
X = iris.data[:, :2]  
y = iris.target
X_train, X_test, y_train, y_test = train_test_split(X,y, test_size =0.2, 
random_state=0)

scores = []
for i in range(10):
    clf = GradientBoostingClassifier(random_state=i).fit(X_train, y_train)
    score = clf.score(X_test,y_test)
    scores = np.append(scores, score)
print scores
输出为:

[ 0.66666667  0.66666667  0.66666667  0.66666667  0.66666667  0.66666667
0.66666667  0.66666667  0.66666667  0.66666667]
但是,当我使用另一个分类器(如RandomForest)运行相同的操作时:

from sklearn.ensemble import RandomForestClassifier
scores = []
for i in range(10):
    clf = RandomForestClassifier(random_state=i).fit(X_train, y_train)
    score = clf.score(X_test,y_test)
    scores = np.append(scores, score)
print scores
输出是您所期望的,即具有轻微的可变性:

[ 0.6         0.56666667  0.63333333  0.76666667  0.6         0.63333333
0.66666667  0.56666667  0.66666667  0.53333333]
是什么导致GradientBoostingClassifier忽略随机状态?我检查了分类器信息,但一切正常:

print clf
GradientBoostingClassifier(criterion='friedman_mse', init=None,
          learning_rate=0.1, loss='deviance', max_depth=3,
          max_features=None, max_leaf_nodes=None,
          min_impurity_split=1e-07, min_samples_leaf=1,
          min_samples_split=2, min_weight_fraction_leaf=0.0,
          n_estimators=100, presort='auto', random_state=9,
          subsample=1.0, verbose=0, warm_start=False)

我试着在热身赛和预选赛中混日子,但没有改变任何事情。有什么想法吗?我想弄清楚这件事已经快一个小时了,所以我想我应该在这里问一下。谢谢你抽出时间

检查
预测概率(X\u测试)
的输出。同时检查属性
oob\u改进
train\u得分
。对于所有
随机状态
值,它们是否也相同?由于这是一种集成方法,内部估计值可能会发生变化,但不会对最终样本类别产生太大影响,因此分数保持不变。如果这不起作用,您能否将
子样本=1.0
更改为0到1之间的某个其他浮点值,并检查是否仍然存在相同的问题。同时发布您的数据样本,以便我们检查根本原因。嗨,Vivek,谢谢您的回复。对于clf所处的每个随机状态,
predict\u proba(X\u test)
train\u score\uuu
的输出是相同的。我尝试使用clf.oob_改进,但它不允许我使用,它返回的“GradientBoostingClassifier”没有属性“oob_改进”。将子样本更改为<1确实会引入可变性,但从我所看到的情况来看,它是以一种不可复制的方式进行的。也就是说,如果我在random_state=0和subsample=0.8的情况下多次运行GradientBoostingClassifier,每次都会给出不同的答案。我使用的数据集是位于代码块顶部的Iris数据集。我明白你关于集合方法的观点,可能是这样的,但我想说的是,这里还有其他一些事情。也许我只是疯了哈哈。正如我上面所说,改变
子样本确实改变了分数。此外,我尝试了更高的
random_state
值,这似乎也改变了分数。这是我更改的行:第一个选项:-
clf=GradientBoostingClassifier(random\u state=I,subsample=0.7)。fit(X\u train,y\u train)
。第二个选项:-
clf=GradientBoostingClassifier(random\u state=i*1000)。拟合(X\u序列,y\u序列)
检查
预测概率(X\u测试)
的输出。同时检查属性
oob\u改进
train\u得分
。对于所有
随机状态
值,它们是否也相同?由于这是一种集成方法,内部估计值可能会发生变化,但不会对最终样本类别产生太大影响,因此分数保持不变。如果这不起作用,您能否将
子样本=1.0
更改为0到1之间的某个其他浮点值,并检查是否仍然存在相同的问题。同时发布您的数据样本,以便我们检查根本原因。嗨,Vivek,谢谢您的回复。对于clf所处的每个随机状态,
predict\u proba(X\u test)
train\u score\uuu
的输出是相同的。我尝试使用clf.oob_改进,但它不允许我使用,它返回的“GradientBoostingClassifier”没有属性“oob_改进”。将子样本更改为<1确实会引入可变性,但从我所看到的情况来看,它是以一种不可复制的方式进行的。也就是说,如果我在random_state=0和subsample=0.8的情况下多次运行GradientBoostingClassifier,每次都会给出不同的答案。我使用的数据集是位于代码块顶部的Iris数据集。我明白你关于集合方法的观点,可能是这样的,但我想说的是,这里还有其他一些事情。也许我只是疯了哈哈。正如我上面所说,改变
子样本确实改变了分数。此外,我尝试了更高的
random_state
值,这似乎也改变了分数。这是我更改的行:第一个选项:-
clf=GradientBoostingClassifier(random\u state=I,subsample=0.7)。fit(X\u train,y\u train)
。第二个选项:-
clf=GradientBoostingClassifier(随机状态=i*1000)。拟合(X\u序列,y\u序列)