2015-05-08 37 views
1

我对scikit学习中的精度和召回值有疑问。我正在使用功能SGDClassifier来分类我的数据。 为了评估性能,我使用了精度和召回函数precision_recall_fscore_support,但是每次运行程序时,我在精度和召回矩阵中都有不同的值。我怎样才能拥有真正的价值? 我的代码是:Scikit学习SGDClassifier:精度和召回每次更改值

scalerI = preprocessing.StandardScaler() 
X_train = scalerI.fit_transform(InputT) 
X_test = scalerI.transform(InputCross) 
clf = SGDClassifier(loss="log", penalty="elasticnet",n_iter=70) 
y_rbf = clf.fit(X_train,TargetT) 
y_hat=clf.predict(X_test) 
a= clf.predict_proba(X_test) 
p_and_rec=precision_recall_fscore_support(TargetCross,y_hat,beta=1) 

谢谢

回答

1

docs SGDClassifier有random_state PARAM被初始化为None,这是用于随机数生成的种子值。您需要修改这个值,因此结果是可重复这样设置random_state=0或者你想

clf = SGDClassifier(loss="log", penalty="elasticnet",n_iter=70, random_state=0) 

应产生相同的结果每次运行

从文档什么最喜欢的数字:

random_state :int seed,RandomState实例或None(默认值)当随机数数据混洗时使用的伪随机数生成器的种子。

+0

哦,谢谢你!我不明白随机状态的含义。所以现在的问题可能是如何选择最好的数字来获得最好的结果 – PSan

+0

不用担心,请测试,如果它解决了您的问题,请记住接受我的答案,我的答案左上角会有一个空的刻度标记。这会捕获很多人,包括我自己,总是检查分类器的构造函数是否具有'random_state'参数。 – EdChum

+0

只是检查,它的工作原理!谢谢 – PSan

0

我遇到了同样的问题,除非在params网格上使用GridSearchCV运行SGDClassifier。我甚至在SGDClassifier上设置了random_state。我注意到,如果我多次运行网格搜索,那么从运行到运行的参数组合的平均得分并不那么微妙。我甚至将warm_start = False设置为确保每个参数组合运行都是干净的初始化。

+0

所以我想出了导致GridSearchCV中随机化的原因。如果交叉验证参数未传递到网格搜索中,并且您有多个类,则网格搜索默认使用分层kfolds,并使用它自己的随机数据混排。如果使用一组random_state初始化一个KFolds,并将其传递到网格搜索中,则多次网格搜索运行的变化量将降至1.00E-05 – Turbo