SKLearn 1.0 版本中警告“有效功能名称”

Jau*_*ras 91 python-3.x pandas scikit-learn

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

UserWarning:X 没有有效的功能名称,但 IsolationForest 已安装了功能名称

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

And*_* NR 131

我在另一个 sklearn 模型中收到了同样的警告消息。我意识到它之所以出现,是因为我用数据框中的数据拟合了模型,然后仅使用这些值进行预测。从我解决这个问题的那一刻起,警告就消失了。

这是一个例子:

model_reg.fit(scaled_x_train, y_train[vp].values)
data_pred = model_reg.predict(scaled_x_test.values)
Run Code Online (Sandbox Code Playgroud)

第一个代码有警告,因为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)
Run Code Online (Sandbox Code Playgroud)

现在我的代码中不再有警告。

  • @Coder Sci-kit-Learn 在拟合它们时需要 i/p(训练集)和 o/p 数据集作为参数。将它们作为带有标题/功能或仅值(即多维数组)的数据框插入不会产生任何区别。仅当加载值时选择的特征与特定训练或输出/测试数据集不对应时,才可能出现差异。 (3认同)
  • 您能否解释一下拟合数据框和值是否会对预测产生影响? (2认同)

小智 33

我遇到了非常类似的错误,但是在模块 DecisionTreeClassifier forFit和上Predict

最初,我发送数据帧作为输入以适应标头,但出现错误。

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

带警告的代码:

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

没有警告的代码:

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)
Run Code Online (Sandbox Code Playgroud)


GNE*_*QUE 18

我也遇到了同样的问题。问题是由于我使用 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 
Run Code Online (Sandbox Code Playgroud)

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

  • 谢谢..这就像一个魅力..!! 并且无需再次绕过任何错误。 (2认同)

Ben*_*ger 14

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

test_row = pd.Dataframe({
    "<feat1_name>": [20],
    "<feat2_name>": [0],
})
model.predict(test_row)
Run Code Online (Sandbox Code Playgroud)

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