Actualmente estoy tratando de crear una clasificación binaria utilizando la regresión logística. Actualmente estoy en la determinación de la importancia característica. Ya hice el preprocesamiento de datos (One Hot Encoding y muestreo) y lo ejecuté con XGBoost y RandomFORestClassifier, no hay problema
Sin embargo, cuando traté de ajustar un modelo LogisticRegression (abajo está mi código en 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()dio un error
... ~\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'Lo busqué en Google y la mayoría de las respuestas decían que este error se debe a que la biblioteca scikit-learn intentó decodificar una cadena ya decodificada. Pero no sé cómo resolverlo en mi caso aquí. Me aseguré de que todos mis datos sean enteros o float64, y no cadenas.
Traté de actualizar mi scikit-learn usando el siguiente comando, pero eso no resolvió el error de AttributeError: 'str' object has no attribute 'decode'
pip install scikit-learn -U Finalmente, el siguiente fragmento de código resolvió el problema, agregue el solucionador como liblinear
model = LogisticRegression(solver='liblinear')En la versión más reciente de scikit-learn (ahora 0.24.1) se solucionó el problema encerrando una parte del código en un bloque try-catch que informo a continuación: el archivo es
optimize.py -> _check_optimize_result(solver, result, max_iter=None, extra_warning_msg=None)y la pieza de código es
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)que era solo
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"))antes de. Entonces, actualizar scikit-learn resuelve el problema.
Hay un error con solver='lbfgs'. Cambiar a 'sag' funciona a su alrededor.