如何将30个类别转换为scikit

时间:2015-09-03 11:58:57

标签: machine-learning categorical-data python scipy

我是统计学,Python,机器学习和Scikit-learn的新手。但是,我正在尝试这个项目,我有一个包含35列学生数据的CSV。第一列是我认为我可以忽略的ID。最后3列是1年级,2年级和3年级的分数。我有400行。我想看看我是否可以用它学习一些机器学习,并了解我的数据。现在我知道Scikit适用于Numpy阵列,它不处理性别(“男性”,“女性”)等分类数据。所以我编写了所有30个类别,其中1个为男性,2个为女性,依此类推。然后我做了以下

X = my_data[:,1:33]
y = my_data[:,34]
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(X,y)
expected = y
predicted = model.predict(X)
mse = np.mean((predicted-expected)**2)
print(mse)
print(model.score(X,y))

我的MSE为6.0839840461,模型得分为0.709407474898.

我得到了一些结果。到目前为止,第一次尝试非常好。但是,我意识到,由于我为男性分配了增加的代码值,例如1,女性为2,因此线性回归会将它们视为权重。如何用[1,0]或[0,1]替换Gender列,我学到的是表示分类数据的正确方法?它是字典类型列还是列表类型列?如果是这样,它将如何成为Numpy阵列的一部分?

2 个答案:

答案 0 :(得分:3)

这称为指标虚拟变量,Pandas可以轻松编码这些分类值:

>>> import pandas as pd
>>> pd.get_dummies(['male', 'female'])
   female  male
0       0     1
1       1     0

不要忘记multicollinearity - 线性回归等算法依赖于变量的独立性,而在您的情况下,female=0绝对意味着male=1。在这种情况下,只需删除一个虚拟变量(例如,仅使用female var而不是male)。

答案 1 :(得分:3)

sklearn.preprocessing包中还有一个LabelEncoder():

from sklearn import preprocessing

le1 = preprocessing.LabelEncoder()
y = le1.transform(y)

您也可以使用le1.inverse_transform(y)反向变换。 编码是自动完成的,您无法更改顺序。