构建预测性维护模型遇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
相关产品推荐
相关产品推荐

