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

Posted

技术标签:

【中文标题】SKLearn 1.0 版中的警告“有效功能名称”【英文标题】:SKLearn warning "valid feature names" in version 1.0 【发布时间】:2021-11-18 10:11:07 【问题描述】:

升级到 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 相同的警告。我的功能名称不包含特殊字符。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案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】:

我遇到了非常相似的错误,但在 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 不存在呢?【参考方案3】:

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

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

【讨论】:

【参考方案4】:

我也遇到了同样的问题。问题是因为我用 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

【讨论】:

【参考方案5】:

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

使用

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

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

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

【讨论】:

以上是关于SKLearn 1.0 版中的警告“有效功能名称”的主要内容,如果未能解决你的问题,请参考以下文章

Python 2.7 sklearn.svm 警告消息

sklearn MiniBatchKMeans 中的弃用警告

Error:(16, 16) 警告: BASE64Decoder是内部专用 API, 可能会在未来发行版中删除

sklearn:关闭警告

sklearn 的弃用警告

C++/Qt 发行版中的库链接