Как определяются уровни категориальной переменной в Python? - PullRequest
2 голосов
/ 27 июня 2019

Я знаю, что логистическая регрессия использует 0 и 1 для зависимой переменной. Но как распределяются 0 и 1, когда переменная определяется как категория «Здоров» против «Больной»? Другими словами, что такое контрольный уровень? "Здоровым" присваивается 0, потому что H - первый в алфавите?

Тестирование CSV

import pandas as pd
import numpy as np
import os
from sklearn.model_selection import RepeatedKFold, cross_val_score
from sklearn.linear_model import LogisticRegression
# index_col=0 eliminates the dumb index column
baseball_train = pd.read_csv(r"baseball_train.csv",index_col=0,
                             dtype={'Opp': 'category', 'Result': 'category', 
                                    'Name': 'category'}, header=0)
baseball_test = pd.read_csv(r"baseball_test.csv",index_col=0,
                            dtype={'Opp': 'category', 'Result': 'category', 
                                   'Name': 'category'}, header=0)
# take all independent variables
X = baseball_train.iloc[:,:-1]
# drop opp and result because I don't want them
X = X.drop(['Opp','Result'],axis=1)
# dependent variable
y = baseball_train.iloc[:,-1]

# Create logistic regression
logit = LogisticRegression(fit_intercept=True)
model = logit.fit(X,y)

Здесь Name - это зависимая переменная с категориями: «Nolan» и «Tom», а не 0 и 1 с

Ответы [ 2 ]

1 голос
/ 27 июня 2019

Если вы используете Pandas для чтения и кодирования ваших данных, категории сортируются (как и sklearn, см. Ниже).

import pandas as pd
import io

txt = """
HR,HBP,Name
0,0,Tommy
0,1,Nolan
0,2,Tommy
1,1,Nolan"""

df = pd.read_csv(io.StringIO(txt), dtype={'Name': 'category'})
print(df)
  HR  HBP Name
0 0   0   Tommy
1 0   1   Nolan
2 0   2   Tommy
3 1   1   Nolan

Если вы посмотрите на коды, то увидите, что хотя Томми был упомянут первым, его кодировка равна 1, а у Нолана - 0.

print(df.Name.cat.codes)
0    1
1    0
2    1
3    0
dtype: int8

Если вы хотите получить все как словарь:

encoded_categories = dict(enumerate(df.Name.cat.categories))
print(encoded_categories)

{0: 'Nolan', 1: 'Tommy'}


Первоначальный ответ

Вы пометили вопрос с помощью scikit-learn, поэтому я предполагаю, что вы используете LabelEncoder с sklearn.preprocessing. В этом случае значения действительно отсортированы.

Простой пример

from sklearn import preprocessing

le = preprocessing.LabelEncoder()
le.fit(["paris", "paris", "tokyo", "amsterdam"])

fit вызывает _encode, который в случае Python list или tuple (или чего-либо, кроме массива) сортирует его перед кодированием. numpy массивы также сортируются с помощью numpy.unique.

Вы можете проверить это через

print(le.classes_)
>> ['amsterdam' 'paris' 'tokyo']

Так в вашем случае

np.array_equal(le.fit(["healthy", "sick"]).classes_, 
               le.fit(["sick", "healthy"]).classes_)
>> True

np.array_equal(le.fit(["healthy", "sick"]).classes_, 
               le.fit(["sick", "healthy", "unknown"]).classes_)
>> False
1 голос
/ 27 июня 2019

Вы должны просто знать, как интерпретировать априорные значения 1 и 0.

В следующем руководстве объясняется, как использовать категориальные данные с очень хорошим рабочим примером: https://towardsdatascience.com/building-a-logistic-regression-in-python-step-by-step-becd4d56c9c8

...