我是统计学,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阵列的一部分?
答案 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)反向变换。 编码是自动完成的,您无法更改顺序。