在拟合逻辑回归模型时出现AttributeError: 'str' object has no attribute 'decode'错误。

40

我目前正在尝试使用逻辑回归进行二元分类。 我现在正在确定特征的重要性。 我已经完成了数据预处理(独热编码和抽样),并且使用XGBoost和RandomForestClassifier运行了它,没有问题。

然而,当我尝试拟合逻辑回归模型时(以下是我的Notebook中的代码),

from sklearn.linear_model import LogisticRegression

#Logistic Regression
# fit the model
model = LogisticRegression()
# fit the model
model.fit(np.array(X_over), np.array(y_over))
# get importance
importance = model.coef_[0]
# summarize feature importance
df_imp = pd.DataFrame({'feature':list(X_over.columns), 'importance':importance})
display(df_imp.sort_values('importance', ascending=False).head(20))

# plot feature importance
plt.bar(list(X_over.columns), importance)
plt.show()

出现了错误

...
~\AppData\Local\Continuum\anaconda3\lib\site-packages\joblib\parallel.py in <listcomp>(.0)
    223         with parallel_backend(self._backend, n_jobs=self._n_jobs):
    224             return [func(*args, **kwargs)
--> 225                     for func, args, kwargs in self.items]
    226 
    227     def __len__(self):

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\linear_model\_logistic.py in _logistic_regression_path(X, y, pos_class, Cs, fit_intercept, max_iter, tol, verbose, solver, coef, class_weight, dual, penalty, intercept_scaling, multi_class, random_state, check_input, max_squared_sum, sample_weight, l1_ratio)
    762             n_iter_i = _check_optimize_result(
    763                 solver, opt_res, max_iter,
--> 764                 extra_warning_msg=_LOGISTIC_SOLVER_CONVERGENCE_MSG)
    765             w0, loss = opt_res.x, opt_res.fun
    766         elif solver == 'newton-cg':

~\AppData\Local\Continuum\anaconda3\lib\site-packages\sklearn\utils\optimize.py in _check_optimize_result(solver, result, max_iter, extra_warning_msg)
    241                 "    https://scikit-learn.org/stable/modules/"
    242                 "preprocessing.html"
--> 243             ).format(solver, result.status, result.message.decode("latin1"))
    244             if extra_warning_msg is not None:
    245                 warning_msg += "\n" + extra_warning_msg

AttributeError: 'str' object has no attribute 'decode'    

我在谷歌上搜索了一下,大多数回答都说这个错误是因为scikit-learn库试图对已经解码的字符串进行解码。但是我不知道如何在我的情况下解决它。我确保所有数据都是整数或float64,没有字符串。


你能展示你的数据吗? - Yefet
3
我在Ubuntu 18 WSL上运行scikit-learn=='0.23.2'时遇到了相同的错误,将求解器更改为liblinear后,错误消失了。 - Paulo Castro Da Silva
3个回答

64
我尝试使用以下命令升级scikit-learn,但无法解决AttributeError:'str' object has no attribute 'decode'问题。
pip install scikit-learn  -U

最终,下面的代码片段解决了这个问题,将解算器添加为liblinear

model = LogisticRegression(solver='liblinear')

我也解决了。 - Renata Ghisloti
我在使用Ridge时遇到了同样的问题,将求解器设置为“saga”解决了这个问题。 - ElhamMotamedi

13

在最近的scikit-learn版本中(现在是0.24.1),通过将代码的一部分包装在try-catch块中,问题已经得到修复。以下是我报告的代码:文件为

optimize.py -> _check_optimize_result(solver, result, max_iter=None,
                       extra_warning_msg=None)

代码片段如下:

if solver == "lbfgs":
    if result.status != 0:
        try:
            # The message is already decoded in scipy>=1.6.0
            result_message = result.message.decode("latin1")
        except AttributeError:
            result_message = result.message
            warning_msg = (
                "{} failed to converge (status={}):\n{}.\n\n"
                "Increase the number of iterations (max_iter) "
                "or scale the data as shown in:\n"
                "    https://scikit-learn.org/stable/modules/"
                "preprocessing.html"
            ).format(solver, result.status, result_message)

这只是

if solver == "lbfgs":
    if result.status != 0:
        warning_msg = (
            "{} failed to converge (status={}):\n{}.\n\n"
            "Increase the number of iterations (max_iter) "
            "or scale the data as shown in:\n"
            "    https://scikit-learn.org/stable/modules/"
            "preprocessing.html"
        ).format(solver, result.status, result.message.decode("latin1"))

在此之前,升级scikit-learn可以解决这个问题。


升级scikit-learn引发了另一个问题。GridSearchCV函数无法正常工作。即使我将verbose设置为10,详细信息也不会显示。此外,它需要非常长的时间,例如应该在2分钟内完成运行的模型,需要约20分钟。因此,这是最新版本中出现的一个重大错误。 - Mujeebur Rahman

5

solver='lbfgs'存在一个bug。 将其更改为'sag'可解决此问题。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接