代码之家  ›  专栏  ›  技术社区  ›  moobi

在训练中使用一个热编码后,获得用于回归模型预测的数据点的正确形状

  •  6
  • moobi  · 技术社区  · 9 年前

    sklearn.linear_model.Ridge Ridge .我简要介绍了我的两个应用程序以及问题是如何出现的:

    第一次应用:

    .之后,数据点( X_hotEncoded )各有9个功能:

    import pandas as pd
    X_hotEncoded = pd.get_dummies(X)
    

    山脊 y

    from sklearn.externals import joblib
    joblib.dump(ridge, "ridge.pkl")
    

    第二次应用:

    y

    # X = one datapoint I like to predict y for 
    ridge= joblib.load("ridge.pkl")
    X_hotEncoded = pd.get_dummies(X)
    ridge.predict(X_hotEncoded) # this should give me the prediction
    

    这在最后一行代码中给出了以下错误:

    ValueError: shapes (1,1) and (9,) not aligned: 1 (dim 1) != 9 (dim 0)

    一种可能的解决方案可能是将列名写入第一个应用程序中的磁盘,并在第二个应用程序中将其检索,然后在那里重建数据点。可以检索一个热编码数组的列名,如下所述: Reversing 'one-hot' encoding in Pandas

    1 回复  |  直到 9 年前
        1
  •  7
  •   Guy C    7 年前

    这里发生了以下情况:

    在训练阶段,您决定使用编码将单个分类特征转换为9个数字特征(一个热特征)。您在此编码上训练了回归算法。因此,为了将其用于未知(测试)数据,您必须以与训练期间完全相同的方式转换这些数据。

    不幸的是,我认为您无法保存 pd.get_dummies 并重复使用。你应该使用 sklearn.preprocessing.OneHotEncoder()

    from sklearn.preprocessing import OneHotEncoder
    
    enc = OneHotEncoder()
    X_hotEncoded = enc.fit_transform(X)
    

    fit_transform() 首先使编码器适合您的训练数据,然后使用它转换数据。区别在于 pd.get_dummies() 您现在有了一个编码器对象,可以在以后保存和重用:

    joblib.dump(enc, "encoder.pkl")
    

    在测试过程中,您可以应用与培训过程中相同的编码,如下所示:

    enc = joblib.load("encoder.pkl")
    X_hotEncoded = enc.transform(X)
    

    pd.get\u dummies()

    注意:

    如果测试数据包含训练数据中不存在的值,则会遇到问题(因为编码器不知道如何对这些未知值进行编码)。为了避免这种情况,您可以:

    • 提供 OneHotEncoder() categories 参数,并将所有类别的列表传递给它。
    • OneHotEncoder() handle_unknown ignore
    • 执行一次热编码 之前 将数据分解为训练集和测试集。
    • 提供 n_values 参数,告诉编码器每个输入功能需要多少不同的类别[编辑:自版本0.20以来已弃用]。
    推荐文章