我如何将 30 个类别转换为 scikit 的数字

How do i convert 30 categories into numbers for scikit

我不熟悉统计学,Python,机器学习和 Scikit-learn。但是,我正在尝试这个项目,其中我有一个包含 35 列学生数据的 CSV。第一列是我认为可以忽略的 ID。最后 3 列是 1 年级、2 年级和 3 年级的分数。我有 400 行。我想看看我是否可以用它学习一些机器学习,并理解我拥有的数据。现在我明白了 Scikit 适用于 Numpy 数组,这些数组不处理诸如性别 ('male'、'female') 等分类数据。所以我将所有 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],我了解到这是表示分类数据的正确方法?它是字典类型的列还是列表类型的列?如果是这样,它将如何成为 Numpy 数组的一部分?

这称为指标虚拟变量,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)。

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

from sklearn import preprocessing

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

你也可以用le1.inverse_transform(y)反变换回来。 虽然编码是自动完成的,但您不能更改顺序。