Python 在一次热编码后拟合模型时出错

Python 在一次热编码后拟合模型时出错,python,scikit-learn,data-science,one-hot-encoding,Python,Scikit Learn,Data Science,One Hot Encoding,我对Titanic数据集的分类变量使用了一种热编码(我知道在本例中顺序编码更好)。一次热编码成功完成。但是,模型拟合会引发以下错误: ValueError:设置带有序列的数组元素。 以下是我正在运行的代码: from sklearn.preprocessing import OneHotEncoder def one_hot_encode_features(df_train,df_test): features = ['Fare', 'Cabin', 'Age', 'Sex']

我对Titanic数据集的分类变量使用了一种热编码(我知道在本例中顺序编码更好)。一次热编码成功完成。但是,模型拟合会引发以下错误:

ValueError:设置带有序列的数组元素。

以下是我正在运行的代码:

from sklearn.preprocessing import OneHotEncoder
def one_hot_encode_features(df_train,df_test):
    features = ['Fare', 'Cabin', 'Age', 'Sex']
    #features = [ 'Cabin', 'Sex']
    df_combined = pd.concat([df_train[features], df_test[features]])
    for feature in features:
        le = preprocessing.LabelEncoder()
        onehot_encoder = OneHotEncoder()
        le = le.fit(df_combined[feature])
        integer_encoding_train=le.transform(df_train[feature])
        integer_encoding_test=le.transform(df_test[feature])
        integer_encoding_train = integer_encoding_train.reshape(len(integer_encoding_train), 1)
        integer_encoding_test = integer_encoding_test.reshape(len(integer_encoding_test), 1)
        df_train[feature] = onehot_encoder.fit_transform(integer_encoding_train)

        df_test[feature] = onehot_encoder.fit_transform(integer_encoding_test)

    return df_train, df_test
data_train, data_test = one_hot_encode_features(data_train, data_test)

from sklearn.model_selection import train_test_split
X = data_train.drop(['Survived', 'PassengerId'], axis=1)
Y = data_train['Survived']
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, random_state=23)
    from sklearn.naive_bayes import GaussianNB
    from sklearn.metrics import make_scorer, accuracy_score
    from sklearn.model_selection import GridSearchCV
    clf = GaussianNB()
    acc_scorer = make_scorer(accuracy_score)
    clf.fit(X_train, Y_train)

如果我使用序数编码而不是一个热编码,则会删除错误。我不熟悉处理类别变量,因此无法找出错误

OneHotEncoder将返回一个二维数组,该数组存储在pandas中的单个列中。scikit无法正确处理此问题。你需要制作一个简单的二维数组(没有你现在所做的嵌套)。]在OneHotEncoder的上面,会返回一个稀疏矩阵,Panda将其视为单个元素,并用“单个元素”的副本填充整个列。正确的Vivek,我在导出到csv时看到了副本!如何获得一个简单的2d one热编码数组?谢谢。@VivekKumar:我应该使用sparse=False来避免稀疏矩阵。即使在这种情况下,
df\u train[feature]
也将仅由OneHotEncoder的第一列输出填充,而不是全部。您需要连接结果数据,然后将其放入数据帧中