Пытаюсь запустить модель логистической регрессии с использованием категориальных переменных, но не могу изменить dtype из object

#pandas #numpy #machine-learning #logistic-regression

#pandas #numpy #машинное обучение #логистическая регрессия

Вопрос:

У меня было несколько категориальных переменных, для которых я создал макеты:

 #Create Dummy Variables with get_dummies (for Diabetes)

new_df = pd.concat([new_df,pd.get_dummies(new_df['DIABETES'],prefix='DIABETES')], axis=1)

#new_df.drop(['DIABETES'],axis=1, inplace=True)

#Create Dummy Variables with get_dummies (for bmi_cat)

new_df = pd.concat([new_df,pd.get_dummies(new_df['bmi_cat'],prefix='bmi_cat')], axis=1)

#Create Dummy Variables with get_dummies (for albumin_cat)

new_df = pd.concat([new_df,pd.get_dummies(new_df['albumin_cat'],prefix='albumin_cat')], axis=1)

#Create Dummy Variables with get_dummies (for SMOKE)
new_df = pd.concat([new_df,pd.get_dummies(new_df['SMOKE'],prefix='SMOKE')], axis=1)

#Create Dummy Variables with get_dummies (for Age)
new_df = pd.concat([new_df,pd.get_dummies(new_df['age_cat'],prefix='age_cat')], axis=1)

#Create Dummy Variables with get_dummies (for SEX)
new_df = pd.concat([new_df,pd.get_dummies(new_df['SEX'],prefix='Sex')], axis=1)

#Create Dummy Variables with get_dummies (for Readmission)
new_df = pd.concat([new_df,pd.get_dummies(new_df['Readmission'],prefix='Readmission')], axis=1)
  

Затем я установил интересующие меня независимые переменные в столбцы:

 #Columns
columns = new_df[['DIABETES','bmi_cat', 'albumin_cat', 'SMOKE','SEX']]
  

На данный момент я пытаюсь реализовать модель логистической регрессии, которая выглядит следующим образом:

 #Model 1 Target Variable (Mortality)

X = columns
y = new_df['Mortality']

logit_model=sm.Logit (y,X)
  

После этого я получаю следующие ошибки:

 ---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-47-81faac9dff81> in <module>
      4 y = new_df['Mortality']
      5 
----> 6 logit_model=sm.Logit (y,X)
      7 #result=logit_model.fit()
      8 #print(result.summary2())

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsdiscretediscrete_model.py in __init__(self, endog, exog, **kwargs)
    416 
    417     def __init__(self, endog, exog, **kwargs):
--> 418         super(BinaryModel, self).__init__(endog, exog, **kwargs)
    419         if (not issubclass(self.__class__, MultinomialModel) and
    420                 not np.all((self.endog >= 0) amp; (self.endog <= 1))):

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsdiscretediscrete_model.py in __init__(self, endog, exog, **kwargs)
    169     """
    170     def __init__(self, endog, exog, **kwargs):
--> 171         super(DiscreteModel, self).__init__(endog, exog, **kwargs)
    172         self.raise_on_perfect_prediction = True
    173 

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsbasemodel.py in __init__(self, endog, exog, **kwargs)
    210 
    211     def __init__(self, endog, exog=None, **kwargs):
--> 212         super(LikelihoodModel, self).__init__(endog, exog, **kwargs)
    213         self.initialize()
    214 

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsbasemodel.py in __init__(self, endog, exog, **kwargs)
     62         hasconst = kwargs.pop('hasconst', None)
     63         self.data = self._handle_data(endog, exog, missing, hasconst,
---> 64                                       **kwargs)
     65         self.k_constant = self.data.k_constant
     66         self.exog = self.data.exog

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsbasemodel.py in _handle_data(self, endog, exog, missing, hasconst, **kwargs)
     85 
     86     def _handle_data(self, endog, exog, missing, hasconst, **kwargs):
---> 87         data = handle_data(endog, exog, missing, hasconst, **kwargs)
     88         # kwargs arrays could have changed, easier to just attach here
     89         for key in kwargs:

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsbasedata.py in handle_data(endog, exog, missing, hasconst, **kwargs)
    631     klass = handle_data_class_factory(endog, exog)
    632     return klass(endog, exog=exog, missing=missing, hasconst=hasconst,
--> 633                  **kwargs)

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsbasedata.py in __init__(self, endog, exog, missing, hasconst, **kwargs)
     74             self.orig_endog = endog
     75             self.orig_exog = exog
---> 76             self.endog, self.exog = self._convert_endog_exog(endog, exog)
     77 
     78         # this has side-effects, attaches k_constant and const_idx

E:UsersdavidwoolAnaconda3libsite-packagesstatsmodelsbasedata.py in _convert_endog_exog(self, endog, exog)
    472         exog = exog if exog is None else np.asarray(exog)
    473         if endog.dtype == object or exog is not None and exog.dtype == object:
--> 474             raise ValueError("Pandas data cast to numpy dtype of object. "
    475                              "Check input data with np.asarray(data).")
    476         return super(PandasData, self)._convert_endog_exog(endog, exog)

ValueError: Pandas data cast to numpy dtype of object. Check input data with np.asarray(data).
  

Я предполагаю, что это связано с тем, что dtypes являются объектами, а не int64.

Однако я не могу изменить dtype в нескольких столбцах:

 new_df.infer_objects().dtypes
  
 Age                      object
SEX                      object
DIABETES                 object
bmi                     float64
SMOKE                    object
DPRALBUM                float64
Readmission              object
Infection                object
bmi_cat                  object
albumin_cat              object
age_cat                  object
Optimized                object
Mortality                 int64
any_complication          int64
DIABETES_INSULIN          uint8
DIABETES_NO               uint8
DIABETES_NON-INSULIN      uint8
bmi_cat_0                 uint8
bmi_cat_gte40             uint8
bmi_cat_lt40              uint8
albumin_cat_0             uint8
albumin_cat_gt3.5         uint8
albumin_cat_lt3.5         uint8
SMOKE_No                  uint8
SMOKE_Yes                 uint8
age_cat_0                 uint8
age_cat_gte65             uint8
age_cat_lt65              uint8
SEX_female                uint8
SEX_male                  uint8
Readmission_No            uint8
Readmission_Yes           uint8
dtype: object
  

Любые советы или рекомендации будут оценены.

Комментарии:

1. Что содержат столбцы-нарушители? В pandas строки являются объектами python.

2. это строки, например, DIABETES имеет значения NO, NON_INSULIN и INSULIN .

3. Вам нужно использовать ваши фиктивные переменные, такие как DIABETES_INSULIN in X , а не строковую версию. Или вы используете интерфейс формулы, который автоматически создает фиктивные переменные из категориальных / строковых столбцов

4. Джозеф — я делал это раньше и получил сообщение об ошибке с надписью Singular Matrix или что-то в этом роде, я могу опубликовать код для этого, а также ошибку, если вы хотите ее увидеть.