You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

构建预测性维护模型遇ValueError:指定列不在DataFrame中求解决

预测性维护模型构建报错解决方案

我正在尝试构建一个预测性维护模型,但遇到了错误,试过其他话题中提出的所有解决方案,但都没有效果。

我的代码:

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

from IPython.display import display

## Data importation
data = pd.read_csv(r'C:\Users\berin\OneDrive\Bureau\Projet ML Predictive Maintenance\predictive_maintenance.csv')
display(data.head(5))
display(data.isna().sum()) ## Look if there is missing data
display(data.info())

# categorical = ["Product ID","Type","Failure_type"]
# numeric = ["Air temperature [K]", "Process temperature [K]", "Rotational speed [rpm]", "Torque [Nm]", "Tool wear [min]"]

transformer = make_column_transformer(
    (MinMaxScaler(), "Air temperature [K]"),
    (MinMaxScaler(), "Process temperature [K]"),
    (MinMaxScaler(), "Rotational speed [rpm]"),
    (MinMaxScaler(), "Torque [Nm]"),
    (MinMaxScaler(), "Tool wear [min]"),
    (OneHotEncoder(), "Product ID"),
    (OneHotEncoder(), "Type"),
    (OneHotEncoder(), "Failure_type"),
    remainder='drop' #Permet d'enlever UDI qui est inutile
)


x = data.drop('Failure_type', axis=1)
y = data['Failure_type']

X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)
model = make_pipeline(transformer, RandomForestClassifier(random_state=42))
model.fit(X_train, y_train)

报错信息:

Traceback (most recent call last):
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\indexes\base.py", line 3791, in get_loc
    return self._engine.get_loc(casted_key)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "index.pyx", line 152, in pandas._libs.index.IndexEngine.get_loc
  File "index.pyx", line 181, in pandas._libs.index.IndexEngine.get_loc
  File "pandas\_libs\hashtable_class_helper.pxi", line 7080, in pandas._libs.hashtable.PyObjectHashTable.get_item
  File "pandas\_libs\hashtable_class_helper.pxi", line 7088, in pandas._libs.hashtable.PyObjectHashTable.get_item
KeyError: 'Failure_type'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\utils\__init__.py", line 447, in _get_column_indices
    col_idx = all_columns.get_loc(col)
              ^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\pandas\core\indexes\base.py", line 3798, in get_loc
    raise KeyError(key) from err
KeyError: 'Failure_type'

The above exception was the direct cause of the following exception:

Traceback (most recent call last):
  File "c:\Users\berin\OneDrive\Bureau\Projet ML Predictive Maintenance\main.py", line 40, in <module>
    model.fit(X_train, y_train)
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\base.py", line 1152, in wrapper
    return fit_method(estimator, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\pipeline.py", line 423, in fit
    Xt = self._fit(X, y, **fit_params_steps)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\pipeline.py", line 377, in _fit
    X, fitted_transformer = fit_transform_one_cached(
                            ^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\joblib\memory.py", line 353, in __call__
    return self.func(*args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\pipeline.py", line 957, in _fit_transform_one
    res = transformer.fit_transform(X, y, **fit_params)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\utils\_set_output.py", line 157, in wrapped
    data_to_wrap = f(self, X, *args, **kwargs)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\base.py", line 1152, in wrapper
    return fit_method(estimator, *args, **kwargs)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\compose\_column_transformer.py", line 751, in fit_transform
    self._validate_column_callables(X)
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\compose\_column_transformer.py", line 459, in _validate_column_callables       
    transformer_to_input_indices[name] = _get_column_indices(all_columns, columns)
  File "C:\Users\berin\AppData\Local\Programs\Python\Python311\Lib\site-packages\sklearn\utils\__init__.py", line 455, in _get_column_indices
    raise ValueError("A given column is not a column of the dataframe") from e
ValueError: A given column is not a column of the dataframe

问题原因

你犯了一个典型的逻辑错误:

  • 你把Failure_type作为目标变量(y),并且通过x = data.drop('Failure_type', axis=1)从特征集X中移除了这个列
  • 但同时你又在make_column_transformer里配置了对Failure_type列的OneHotEncoder处理,导致训练时转换器在X_train里找不到这个列,直接触发KeyError

修正方案

1. 删除转换器中针对Failure_type的配置

目标变量不需要作为特征参与预处理流程,直接移除这一行即可。

2. 优化代码结构(可选但推荐)

把同类型的列用列表批量传入转换器,让代码更简洁易维护。

修正后的完整代码

import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler, OneHotEncoder
from sklearn.compose import make_column_transformer
from sklearn.pipeline import make_pipeline
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix

from IPython.display import display

## Data importation
data = pd.read_csv(r'C:\Users\berin\OneDrive\Bureau\Projet ML Predictive Maintenance\predictive_maintenance.csv')
display(data.head(5))
display(data.isna().sum()) ## 检查缺失值
display(data.info())

# 明确分类特征和数值特征列
categorical_cols = ["Product ID","Type"]
numeric_cols = ["Air temperature [K]", "Process temperature [K]", "Rotational speed [rpm]", "Torque [Nm]", "Tool wear [min]"]

transformer = make_column_transformer(
    (MinMaxScaler(), numeric_cols),  # 批量处理所有数值列
    (OneHotEncoder(sparse_output=False), categorical_cols),  # 批量处理所有分类列
    remainder='drop' # 移除UDI这类无用列
)

# 划分特征和目标变量
x = data.drop('Failure_type', axis=1)
y = data['Failure_type']

# 拆分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(x, y, test_size=0.2, random_state=42)

# 构建并训练模型
model = make_pipeline(transformer, RandomForestClassifier(random_state=42))
model.fit(X_train, y_train)

# 模型评估(可选)
y_pred = model.predict(X_test)
print(f"模型准确率: {accuracy_score(y_test, y_pred):.4f}")
print("\n分类报告:")
print(classification_report(y_test, y_pred))
print("\n混淆矩阵:")
print(confusion_matrix(y_test, y_pred))

额外说明

  • OneHotEncoder添加sparse_output=False是为了让输出为密集矩阵,避免后续模型处理时可能出现的稀疏矩阵兼容问题(sklearn新版本默认输出稀疏矩阵,根据需求调整即可)
  • 目标变量Failure_type不需要做任何预处理,模型会直接使用原始标签进行训练

内容的提问来源于stack exchange,提问作者marc beringuier

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 01:19:55