【问题标题】:How can I fix this ValueError in One Hot Encoding?如何在 One Hot Encoding 中修复此 ValueError?
【发布时间】:2021-08-13 20:40:02
【问题描述】:

尝试在 Jupyter-Notebook 中运行以下代码时,会导致以下错误:

dataset_train.drop_duplicates(inplace=True)
dataset_test.drop_duplicates(inplace=True)

#One-Hot-Encoding¶
enc = OneHotEncoder()
dataset_train_categorical_values_encenc = enc.fit_transform(dataset_train_categorical_values_enc)
dataset_train_cat_data = pd.DataFrame(dataset_train_categorical_values_encenc.toarray(),columns=dumcols)
# test set
dataset_test_categorical_values_encenc = enc.fit_transform(dataset_test_categorical_values_enc)
dataset_test_cat_data = pd.DataFrame(dataset_test_categorical_values_encenc.toarray(),columns=testdumcols)

错误:ValueError:传递值的形状为 (82332, 151),索引暗示 (82332, 155)

到目前为止,这是放在上面的工作表之前的整个代码:

#Label Encoder

ategorical_columns=['proto', 'service', 'state']
# insert code to get a list of categorical columns into a variable, categorical_columns
categorical_columns=['proto', 'service', 'state'] 
 # Get the categorical values into a 2D numpy array
dataset_train_categorical_values = dataset_train[categorical_columns]
dataset_test_categorical_values = dataset_test[categorical_columns]

    
    #Transform categorical features into numbers using LabelEncoder()
dataset_train = pd.read_csv('BMW_Theftprotection_trainer.csv')
dataset_test = pd.read_csv('BMW_Theftprotection_tester.csv') 

dataset_train_categorical_values_enc=dataset_train_categorical_values.apply(LabelEncoder().fit_transform) 打印(dataset_train_categorical_values_enc.head()) # 测试集 dataset_test_categorical_values_enc=dataset_test_categorical_values.apply(LabelEncoder().fit_transform)

#Dummy Columns


# protocol type
unique_protocol=sorted(dataset_train.proto.unique())
string1 = 'proto_'
unique_protocol2=[string1 + x for x in unique_protocol]
# service
unique_service=sorted(dataset_train.service.unique())
string2 = 'service_'
unique_service2=[string2 + x for x in unique_service]
# flag
unique_flag=sorted(dataset_train.state.unique())
string3 = 'state_'
unique_flag2=[string3 + x for x in unique_flag]
# put together
dumcols=unique_protocol2 + unique_service2 + unique_flag2
print(dumcols)

#do same for test set
unique_service_test=sorted(dataset_test.service.unique())
unique_service2_test=[string2 + x for x in unique_service_test]
testdumcols=unique_protocol2 + unique_service2_test + unique_flag2

有人知道怎么解决吗?

【问题讨论】:

    标签: python data-science data-mining


    【解决方案1】:

    这可能是因为您在一个数据帧中的数据值没有出现在另一个数据帧中,这会在一个热编码时改变您的尺寸。

    在一个热编码之前合并它们,然后将它们拆分回来。这将为您提供相等的列尺寸。

    import pandas as pd
    
    dataframe_train = pd.DataFrame(
        {"one": ["a", "e", "i", "a", "a", "b"], "two": ["x", "x", "y", "x", "y", "y"] }, 
    )
    dataframe_test = pd.DataFrame(
        {"one": ["a", "e", "r"], "two": ["x", "x", "y"], },
    )
    
    train_test_df = pd.concat(
        [dataframe_test, dataframe_train],
        keys=['test','train']
    ).droplevel(level=1, axis=0)
    
    ohe = pd.get_dummies(train_test_df )
    test_ohe = ohe.loc['test',:].values
    train_ohe = ohe.loc['train',:].values
    

    我在这里使用 pandas 进行了一次热编码,因为它使之后的拆分更加容易。

    【讨论】:

    • 是的,训练数据集的类别确实比测试数据集多。我如何才能将基于一个类别的这两个数据集之间的差异放在另一个类别中?
    • 我不太明白你的问题。上面的代码将通过使它们具有相同的列来修复您遇到的错误。如果它有效并且您有后续问题,最好将其标记为正确并询问另一个问题。如果是关于 ValueError ,请澄清,因为我不确定你的意思。
    • 我将您的代码放入 jupyter notebook 中,它给了我一条错误消息,并发出了关于不适合数据帧格式的输入格式(训练数据集)的信息。为什么我这样做 One Hot Coding 实际上是将测试数据集的缺失类别从训练数据集中转移到测试数据集中。我认为 One Hot Coding 可以解决问题
    • 您需要更清楚地了解错误描述。这个页面上没有出现“训练数据集”这个词,我无法分辨哪一行出错了,这使得它很难提供帮助。尝试使用Minimal Reproducible Example 重现您的问题。这样我们就可以讨论相同的代码,避免混淆。
    • 您当前的问题是关于 One Hot Enconding 中的 ValueError。如果新问题与原始问题相去甚远,最好将其关闭并询问另一个问题。这样就可以为其他人解决您的第一个问题。
    猜你喜欢
    • 2017-05-11
    • 1970-01-01
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-21
    • 2019-10-11
    相关资源
    最近更新 更多