使用OneHotEncoder结果创建数据框时出现ValueError

我最近开始学习Python,以便为一个研究项目开发一个使用机器学习方法的预测模型。我已经使用OneHotEncoder对数据集中所有的分类变量进行了编码

    # 使用OneHotEncoder编码分类数据
    from sklearn.preprocessing import OneHotEncoder
    ohe = OneHotEncoder(handle_unknown='ignore')
    Z = ohe.fit_transform(Z)

现在我想用OneHotEncoder的结果创建一个数据框。我希望数据框的列是编码后生成的新类别,这就是为什么我使用了categories_属性。运行以下代码行时:

    ohe_df = pd.DataFrame(Z, columns=ohe.categories_)

我得到了错误:ValueError: all arrays must be same length

我理解错误信息中提到的数组是类别数组,每个数组的长度取决于它包含的类别数量,但我不确定在有多个特征的情况下,创建一个以新类别为列的数据框的正确方法是什么。

我尝试在一个只包含一个特征的小数据集上这样做,结果是成功的:

    ohe = OneHotEncoder(handle_unknown='ignore', sparse=False)
    df = pd.DataFrame(['Male', 'Female', 'Female'])
    results = ohe.fit_transform(df)
    ohe_df = pd.DataFrame(results, columns=ohe.categories_)
    ohe_df.head()
            Female  Male
    0   0.0     1.0
    1   1.0     0.0
    2   1.0     0.0

那么,我如何在包含众多特征的大数据集上做同样的事情呢?

提前感谢您。

编辑:

应要求,我提供了一个最小工作示例(MWE)来演示它为什么不起作用:

    import numpy as np
    import pandas as pd

    # 创建数据框
    df = pd.DataFrame(np.array([['Male', 'Yes', 'Forceps'], ['Female', 'No', 'Forceps and ventouse'],
                                 ['Female','missing','None'], ['Male','Yes','Ventouse']]),
                       columns=['gender', 'diabetes', 'assistance'])

    df.head()

    # 编码分类数据
    from sklearn.preprocessing import OneHotEncoder

    ohe = OneHotEncoder(handle_unknown='ignore')
    results = ohe.fit_transform(df)
    print(results)

到这一步,我已经创建了一个包含分类数据的数据框并对其进行了编码。现在我想创建另一个数据框,使新数据框的列是OneHotEncoder创建的类别,行为编码后的数据。为此,我尝试了两种方法:

    ohe_df = pd.DataFrame(results, columns=np.concatenate(ohe.categories_))

以及我尝试了:

    ohe_df = pd.DataFrame(results, columns=ohe.get_feature_names(input_features=df.columns))

这两种方法都导致了错误:ValueError: Shape of passed values is (4, 1), indices imply (4, 9)


回答:

如果我理解正确,

import numpy as np
import pandas as pd
# 创建数据框
df = pd.DataFrame(np.array([['Male', 'Yes', 'Forceps'], ['Female', 'No', 'Forceps and ventouse'],
                            ['Female','missing','None'], ['Male','Yes','Ventouse']]),
                     columns=['gender', 'diabetes', 'assistance'])
df.head()
# 编码分类数据
from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(handle_unknown='ignore')
results = ohe.fit_transform(df)
df_results = pd.DataFrame.sparse.from_spmatrix(results)
df_results.columns = ohe.get_feature_names(df.columns)
df_results

输出:

   gender_Female  gender_Male  diabetes_No  diabetes_Yes  diabetes_missing  assistance_Forceps  assistance_Forceps and ventouse  assistance_None  assistance_Ventouse
0            0.0          1.0          0.0           1.0               0.0                 1.0                              0.0              0.0                  0.0
1            1.0          0.0          1.0           0.0               0.0                 0.0                              1.0              0.0                  0.0
2            1.0          0.0          0.0           0.0               1.0                 0.0                              0.0              1.0                  0.0
3            0.0          1.0          0.0           1.0               0.0                 0.0                              0.0              0.0                  1.0

注意,ohe.fit_transform(df)的输出是一个稀疏矩阵。

print(type(results))
<class 'scipy.sparse.csr.csr_matrix'>

您可以使用pd.DataFrame.sparse.from_spmatrix将其转换为数据框。然后,我们可以使用ohe.get_feature_names并传入原始数据框的列来命名结果数据框df_results的列。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注