问题描述
- 在使用sklearn包中的随机梯度下降分类器SGDClassifier进行运算的过程中,使用了如下代码:
clf = SGDClassifier(loss='log', random_state=1, max_iter=1)
- 但运行后,在该语句处遇到了如下图所示的错误:
- 可见,给出的错误信息为:
AttributeError: 'SGDClassifier' object has no attribute 'early_stopping'
- 直翻错误为:属性错误:SGDClassifier对象中没有early_stopping这个属性。
- 但是,在百度上查找该错误,发现并没有人报出此错误。于是我决定查找相关的源码探究该错误。
问题分析
- 由于首先能够确定自己没有在程序中人为设定过该属性,因此猜测是由于sklearn的版本问题所导致的。
- 自己在编写代码时使用的sklearn版本为0.19.0,而部署运行程序时所使用的sklearn版本为0.20.4。
- 猜测sklearn可能是在0.19升级至0.20版本时,源码层面有较大的变化。
- 于是我找到sklearn关于SGDClassifier的官网(如下图所示)。
- 可以看出,整个程序是在执行partial_fit这个函数时出现了错误。
- 于是找到官网中对partial_fit这个函数的描述,如下图所示。
- 点击右上角的source,查看其源码,找到出错的代码位置,如下图所示。
- 从报错信息中可以看出,程序是在执行到self.early_stopping处时,程序认为self对象,即SGDClassifier对象下没有early_stopping属性,从而报错。并没有执行到源码中所提到的ValueError错误。
解决方法
-
既然出错的原因是由于SGDClassifier没有early_stopping属性,那么就在SGDClassifier创建的时候手动传入该参数。如下图所示。
-
虽然此时编译器会报错,错误标签为“Unexpected argument”,但是忽略即可(猜测是由于PyCharm的编译器对 super()继承父类的参数识别不太准确所导致的Bug?)。
-
重新运行一次程序,即可发现网页能够正常运行了,编译器的报错也消失了,问题得到解决。
欢迎各位读者在评论区中批评指正,如果对你有用的话,记得点赞收藏哦~