我最近开始学习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的列。