为啥它会自动转换为 numpy.ndarray?

Posted

技术标签:

【中文标题】为啥它会自动转换为 numpy.ndarray?【英文标题】:Why it did convert to numpy.ndarray automatically?为什么它会自动转换为 numpy.ndarray? 【发布时间】:2022-01-10 02:12:12 【问题描述】:

我在我的数据库中进行预测变量和类之间的划分,所以我意识到我必须先进行 LabelEncoder 转换,然后是 OneHotEncoder,在第一个数据库中我是这样做的:

label_encoder_workclass = LabelEncoder()
label_encoder_education = LabelEncoder()
label_encoder_marital = LabelEncoder()
label_encoder_occupation = LabelEncoder()
label_encoder_relationship = LabelEncoder()
label_encoder_race = LabelEncoder()
label_encoder_sex = LabelEncoder()
label_encoder_country = LabelEncoder()

X_census[:,1] = label_encoder_workclass.fit_transform(X_census[:,1])
X_census[:,3] = label_encoder_education.fit_transform(X_census[:,3])
X_census[:,5] = label_encoder_marital.fit_transform(X_census[:,5])
X_census[:,6] = label_encoder_occupation.fit_transform(X_census[:,6])
X_census[:,7] = label_encoder_relationship.fit_transform(X_census[:,7])
X_census[:,8] = label_encoder_race.fit_transform(X_census[:,8])
X_census[:,9] = label_encoder_sex.fit_transform(X_census[:,9])
X_census[:,13] = label_encoder_country.fit_transform(X_census[:, 13])

onehotenconder_census = ColumnTransformer(transformers=[('OneHot', OneHotEncoder(), [1,3,5,6,7,8,9,13])], remainder='passthrough')

X_census = onehotenconder_census.fit_transform(X_census).toarray()

在第二个数据库中是这样的:

label_encoder_personHomeOwnership = LabelEncoder()
label_encoder_loanIntent = LabelEncoder()
label_encoder_loanGrade = LabelEncoder()
label_encoder_cbPersonDefaultOnFile = LabelEncoder()

X_credit[:,2] = label_encoder_personHomeOwnership.fit_transform(X_credit[:,2])
X_credit[:,4] = label_encoder_loanIntent.fit_transform(X_credit[:,4])
X_credit[:,5] = label_encoder_loanGrade.fit_transform(X_credit[:,5])
X_credit[:,9] = label_encoder_personHomeOwnership.fit_transform(X_credit[:,9])

oneHotEncoder_credit = ColumnTransformer(transformers=[('OneHot', OneHotEncoder(), [2,4,5,9])], remainder='passthrough')

X_credit = oneHotEncoder_credit.fit_transform(X_credit)

让我感兴趣的是为什么在第一个中我必须使用 toarray() 方法将其转换为 numpy.ndarray 类型的对象,而在第二个中我没有,它会自动转换。

请有人问我这个问题。我是不是做错了什么?

非常感谢您

【问题讨论】:

【参考方案1】:

来自help page of ColumnTransformer:

sparse_thresholdfloat,默认=0.3

如果不同转换器的输出包含稀疏矩阵, 如果总密度为 低于这个值。使用 sparse_threshold=0 始终返回密集。 当转换后的输出由所有密集数据组成时,堆叠的 结果会很密集,这个关键字会被忽略。

在您的情况下,第一个示例比第二个示例具有更多的稀疏条目,因此它被转换为稀疏矩阵。 .toarray() 方法将其从稀疏转换为密集。

如果内存不是问题,将其设置为 sparse_threshold=0 将确保您每次都能获得密集矩阵。

例如,如果我们有很多类别的列:

from sklearn.compose import ColumnTransformer
import numpy as np

np.random.seed(111)

X = np.random.randint(0,10,(100,10))
ct = ColumnTransformer(transformers=[('OneHot', OneHotEncoder(),
np.arange(10))], remainder='passthrough')

type(ct.fit_transform(X))
scipy.sparse.csr.csr_matrix

ct = ColumnTransformer(transformers=[('OneHot', OneHotEncoder(),
np.arange(10))], remainder='passthrough',sparse_threshold=0)

type(ct.fit_transform(X))
numpy.ndarray

与类别较少的列相比:

X = np.random.randint(0,2,(100,10))
ct = ColumnTransformer(transformers=[('OneHot', OneHotEncoder(),
np.arange(10))], remainder='passthrough')

type(ct.fit_transform(X))
numpy.ndarray

【讨论】:

谢谢,这对我有帮助,但我有一个问题,我应该一直使用 sparse_threshold=0 吗? 是的,您可以这样做,但请记住,稀疏内存会限制内存使用,尤其是当您有大量训练集时。所以检查你的最终输出矩阵有多大。

以上是关于为啥它会自动转换为 numpy.ndarray?的主要内容,如果未能解决你的问题,请参考以下文章

无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)错误

不明白为啥我会收到“numpy.ndarray object not callable”错误?

是否有将 numpy.ndarray 转换为列表的有效方法?

如何将PyTorch张量转换为Numpy ndarray

TypeError:获取参数数组的类型无效 numpy.ndarray,必须是字符串或张量。 (不能将 ndarray 转换为张量或操作。)

“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)。在 TensorFlow CNN 中进行图像分类