【问题标题】:SKLearn warning "valid feature names" in version 1.0SKLearn 1.0 版中的警告“有效功能名称”
【发布时间】:2022-01-07 20:45:34
【问题描述】:

升级到 scikit-learn 1.0 版后,我收到以下警告:

UserWarning: X does not have valid feature names, but IsolationForest was 
fitted with feature name

我在文档中找不到什么是“有效的功能名称”。如何处理这个警告?

【问题讨论】:

  • 能否提供训练时使用的特征名称?我的猜测是有空格或大写字母。
  • 是的,有大写字母、下划线和点,比如'^back_2_PCA_3.3'。我会尝试摆脱它们,但其中一些是其他 python dicts 中的键。谢谢
  • 你有一个最小的工作示例吗?我遇到了同样的问题,但它是通过 sklearn、pandas 和 shap 的组合。
  • 我收到与 sklearn IsolationForest 相同的警告。我的功能名称不包含特殊字符。
  • 请提供足够的代码,以便其他人更好地理解或重现问题。

标签: python-3.x pandas scikit-learn


【解决方案1】:

我收到了与另一个 sklearn 模型相同的警告消息。我意识到它出现了,因为我用数据框中的数据拟合了模型,然后只使用这些值进行预测。从我修复它的那一刻起,警告就消失了。

这是一个例子:

model_reg.fit(scaled_x_train, y_train[vp].values)
data_pred = model_reg.predict(scaled_x_test.values)

第一个代码有警告,因为 scaled_x_train 是一个带有特征名称的 DataFrame,而 scaled_x_test.values 只是值,没有特征名称。然后,我改成这样:

model_reg.fit(scaled_x_train.values, y_train[vp].values)
data_pred = model_reg.predict(scaled_x_test.values)

现在我的代码上没有更多警告了。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题。问题是因为我用 X 训练数据作为数据框 (model.fit(X,Y)) 拟合了模型,并且我使用 X 测试作为数组 (model.predict([ [20,0] ]) ) 进行了预测。为了解决这个问题,我已将 X 列车数据帧转换为数组,如下图所示。

    之前

    model = DecisionTreeClassifier()
    model.fit(X,Y) # X train here is a dataFrame
    predictions = model.predict([20,0])  ## generates warning 
    

    之后

    model = DecisionTreeClassifier()
    X = X.values # conversion of X  into array
    model.fit(X,Y)
    model.predict([ [20,0] ])  #now ok , no warning
    

    【讨论】:

      【解决方案3】:

      到目前为止,其他答案建议使用 numpy 数组而不是训练数据的数据框进行(重新)训练。该警告是一种安全功能,可确保您传递您想要传递的数据,因此我建议您将数据框(带有正确的列标签!)传递给 predict 函数。

      另外,请注意,这只是一个警告,而不是错误。您可以忽略警告并继续执行其余代码而不会出现问题;只需确保数据与训练时的顺序相同!

      【讨论】:

        【解决方案4】:

        我在使用数据框时遇到了同样的错误,但是通过只传递值,它就不再存在了

        使用

        reg = reg.predict( x[['data']].values , y)
        

        显示错误是因为我们的数据框具有特征名称,但我们应该将数据拟合为 2d 数组(或矩阵),其中包含用于训练或测试数据集的值。

        这是上面提到的同一件事的图片image of jupytr notebook code

        【讨论】:

          【解决方案5】:

          我遇到了非常相似的错误,但在 FitPredict 的模块 DecisionTreeClassifier 上。

          最初我将数据帧作为输入发送以适合标头,但我收到了错误。

          当我修剪以删除标题并仅发送值时,错误消失了。 更改前后的示例代码。

          带有警告的代码:

          model = DecisionTreeClassifier()
          model.fit(x,y)  #Here x includes the dataframe with headers
          predictions = model.predict([
              [20,1], [20,0]
          ])
          print(predictions)
          

          没有警告的代码:

          model = DecisionTreeClassifier()
          model.fit(x.values,y)  #Here x.values will have only values without headers
          predictions = model.predict([
               [20,1], [20,0]
          ])
          print(predictions)
          

          【讨论】:

          • 感谢您的帮助!但是为什么y.values 不存在呢?
          猜你喜欢
          • 2021-10-07
          • 2010-11-15
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-11
          相关资源
          最近更新 更多