如何在Python中定义类别变量的级别?

时间:2019-06-27 14:30:01

标签: python scikit-learn logistic-regression

我知道逻辑回归使用0和1作为因变量。但是,当将变量定义为“健康”与“病态”类别时,如何分配0和1?换句话说,参考水平是多少?因为H在字母表中排在第一位,“健康”的数字是否为0?

Testing 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和1s

2 个答案:

答案 0 :(得分:1)

您只需要知道如何解释先验1和0。

以下教程在一个很好的示例中说明了如何使用分类数据:https://towardsdatascience.com/building-a-logistic-regression-in-python-step-by-step-becd4d56c9c8

答案 1 :(得分:1)

如果您使用熊猫来读取和编码数据,则会对categories进行排序(就像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

如果看一下代码,您会发现,尽管首先提到了汤米(Tommy),但其编码为1,而诺兰(Nolan)为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 listtuple(或除numpy数组以外的其他任何东西),它们会在编码之前对其进行排序。 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