为啥它会自动转换为 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 转换为列表的有效方法?
TypeError:获取参数数组的类型无效 numpy.ndarray,必须是字符串或张量。 (不能将 ndarray 转换为张量或操作。)
“ValueError:无法将 NumPy 数组转换为张量(不支持的对象类型 numpy.ndarray)。在 TensorFlow CNN 中进行图像分类