【问题标题】: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 类型的对象,而在第二个中我没有,它会自动转换。

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

非常感谢您

【问题讨论】:

    标签: python scikit-learn data-science


    【解决方案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 吗?
    • 是的,您可以这样做,但请记住,稀疏内存会限制内存使用,尤其是当您有大量训练集时。所以检查你的最终输出矩阵有多大。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-07
    • 2020-02-25
    • 1970-01-01
    • 2022-11-13
    • 1970-01-01
    相关资源
    最近更新 更多