【问题标题】:sklearn throws ValueError: bad input shape (600000, 24)sklearn 抛出 ValueError: bad input shape (600000, 24)
【发布时间】:2021-01-22 06:55:26
【问题描述】:

下面是我的一段标签编码代码。在一次为 Dataframe 的一列实施标签编码器时,它工作得很好。但是,当我尝试一次实现整个分类特征时 sklearn 抛出

ValueError: 错误的输入形状 (600000, 24)。我找不到任何具体原因。

df = pd.read_csv("../inputs/cat-in-the-dat-train-folds.csv")
    
# extracting the categorical features 
cat_features = [x for x in df.columns if x not in ( "id", "target", "kflod")]
    
for col in cat_features:
    df.loc[:, col] = df[col].astype(str).fillna("NONE")
df_train = df[df["kfold"] != fold].reset_index(drop=True)
df_valid = df[df["kfold"] == fold].reset_index(drop=True)
lbl_enc = preprocessing.LabelEncoder()
full_cat_data = pd.concat(
        [df_train[cat_features], df_valid[cat_features]],
        axis=0)
lbl_enc.fit(full_cat_data)
x_train = lbl_enc.transform(df_train[cat_features])
x_valid = lbl_enc.transform(df_valid[cat_features])

【问题讨论】:

  • 也许this 可以帮助你。
  • 在cat_features listcomp 中,"kflod" 是故意的还是"kfold" 的拼写错误?

标签: python scikit-learn


【解决方案1】:

sklearn.preprocessing.LabelEncoder.fit 只接受一维数组作为参数。

要适应多列,请使用sklearn.preprocessing.OrdinalEncoder.fit,它可以通过 [n_samples, n_features] 获取多维数据(根据文档)

在您的示例中,尝试将lbl_enc = preprocessing.LabelEncoder() 替换为lbl_enc = preprocessing.OrdinalEncoder(),这样应该可以。

有关 LabelEncoder 和 OrdinalEncoder 之间区别的更多信息,请参阅此答案 here

其他资源:

【讨论】:

  • 感谢您抽出宝贵时间对此进行解释。
  • @RakeshKumarKuwar 当然!这能解决您的问题吗?
  • 是的,我实现了序数编码器来转换整个分类数据并且它有效。虽然使用 Logres 无法获得很高的准确性,但会尝试使用 xgboost 模型。衷心感谢您的帮助。
猜你喜欢
  • 2021-04-14
  • 2023-03-19
  • 2016-12-01
  • 2015-09-27
  • 2016-11-12
  • 2019-08-07
  • 2019-09-22
  • 2020-09-06
  • 2018-06-25
相关资源
最近更新 更多