逻辑回归 - 具有分类变量的多类分类

时间:2017-08-29 02:49:50

标签: python scikit-learn logistic-regression

我目前正在使用具有分类和连续功能的数据框,如下所示:

https://ibb.co/bKJwSQ

我想运行逻辑回归来预测目标值。在这种情况下,目标值是竞赛,可以是" A"," W"," B"," H",& #34; N"或" O",代表"亚洲","白","黑"," ;西班牙裔","美洲原住民"或"其他"。

我已将所有功能转换为虚拟变量(除了#34; race"列),在一个名为" dummies"的新数据框中。为了训练模型,我使用以下代码:

from sklearn import linear_model, metrics

X = dummies.drop("race", axis=1)
y = dummies["race"]

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=101)


from sklearn.linear_model import LogisticRegression

logmodel = LogisticRegression()
logmodel.fit(X_train, y_train)

predictions = logmodel.predict(X_test)

我没有得到任何错误,但是,当我查看分类矩阵时,我获得了精确,召回和f1分数的完美分数1.00。这似乎有点太好了,不是真的......我做错了吗?

这是我用来转换假人的代码:

dummies = pd.get_dummies(df[["date", "armed", "age", "gender", "city", "state", "signs_of_mental_illness", "threat_level", "flee", "body_camera", "total_population"]], drop_first=True)
dummies = pd.concat([df, dummies], axis=1)

dummies.drop(df[["date", "armed", "age", "gender", "city", "state", "signs_of_mental_illness", "threat_level", "flee", "body_camera", "total_population"]], axis=1, inplace=True)

2 个答案:

答案 0 :(得分:0)

您获得1.0分类得分的原因是因为您将数值数据视为分类数据。当您在数据框的所有列上使用pandas.get_dummies时,您就是基本上将所有日期,年龄等(即数值数据)转换为虚拟变量指标,这是不正确的。这是因为在这样做时,您要为数据集中的所有年龄创建虚拟变量。对于您的小型数据集,可以这样做,但在现实世界的情况下,这意味着在1到100岁时,您将拥有100种不同的可能组合! pandas.get_dummies的说明如下:

  

将分类变量转换为虚拟/指标变量

这是一种使用分类的错误方法。我建议你只使用pandas.get_dummies()转换分类变量,然后验证你的结果。 至于为什么你获得100%准确度它是因为你能够通过使用这种不正确的技术将数值列转换为分类类型来解释所有可能的场景(因为你的数据集很小) ,这种技术不会过载。但是,对于现实世界的场景,它是不正确的。)

如果您想查看其他一些方法来对数据进行编码,请check out this link

您的数据也包含数字列。考虑到这一点,只有这样你才能得到正确的结果。

答案 1 :(得分:0)

您应该使用LabelEncoder将分类功能转换为数字:http://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.LabelEncoder.html

现在,您实际上将目标数据(尽管以不同的形式)放入训练和测试数据中,因此您获得了满分 - 模型只需要将虚拟列转换回单列。当然,它是100%准确的。

另外,请看这里:Multi-Class Logistic Regression in SciKit Learn

相关问题