Skip to main content
 首页 » 编程设计

machine-learning之我如何将 30 个类别转换为 scikit 的数字

2025年05月04日28mfrbuaa

我是统计学、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],我了解到这是表示分类数据的正确方法?它是字典类型的列还是列表类型的列?如果是这样,它将如何成为 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)。