我是机器学习的新手。我有一个疑问:为什么在这里使用onehotencoding时要用toarray()
,而使用label encoding时却不需要?我完全不明白,请有人帮帮我。
from sklearn.preprocessing import LabelEncoder, OneHotEncoderlabel_encoder_x = LabelEncoder()x[:, 0] = label_encoder_x.fit_transform(x[:, 0])onehotencoder = OneHotEncoder(categorical_features= [0])x = onehotencoder.fit_transform(x).toarray()label_encoder_y = LabelEncoder()y = label_encoder_y.fit_transform(y)
回答:
正如文档中所述,OneHotEncoder
默认会返回一个稀疏矩阵,这种格式不太直观。举个简单的例子:
>>> df 00 21 22 23 14 15 26 27 18 19 1onehotencoder = OneHotEncoder(categorical_features= [0])>>> onehotencoder.fit_transform(df[0].values.reshape(1,-1))<1x10 sparse matrix of type '<class 'numpy.float64'>' with 10 stored elements in COOrdinate format>
然而,如果你调用toarray
,你会得到一个更容易处理或至少更容易理解的结果:
>>> onehotencoder.fit_transform(df[0].values.reshape(1,-1)).toarray()array([[1., 2., 2., 1., 1., 2., 2., 1., 1., 1.]])
另一种方法是在创建OneHotEncoder时使用sparse = False
,这样它默认会创建一个密集数组:
onehotencoder = OneHotEncoder(categorical_features= [0], sparse=False)>>> onehotencoder.fit_transform(df[0].values.reshape(1,-1))array([[1., 2., 2., 1., 1., 2., 2., 1., 1., 1.]])