SKLearn 1.0 版中的警告“有效功能名称”
Posted
技术标签:
【中文标题】SKLearn 1.0 版中的警告“有效功能名称”【英文标题】:SKLearn warning "valid feature names" in version 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 相同的警告。我的功能名称不包含特殊字符。 请提供足够的代码,以便其他人更好地理解或重现问题。 【参考方案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】:我遇到了非常相似的错误,但在 Fit
和 Predict
的模块 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
不存在呢?以上是关于SKLearn 1.0 版中的警告“有效功能名称”的主要内容,如果未能解决你的问题,请参考以下文章
sklearn MiniBatchKMeans 中的弃用警告