解决端到端ML项目中DataTransformation无data_transformation_config属性错误
AttributeError: 'DataTransformation' object has no attribute 'data_transformation_config'
我正在参考Krish Naik YouTube频道的《Wine Quality Prediction End-to-End ML Project》教程开发Flight Fare Prediction项目,运行03_data_transformation.ipynb中的数据转换流水线代码时触发了AttributeError,提示'DataTransformation'对象没有'data_transformation_config'属性。
相关代码片段
DataTransformation类定义
from src.exception import CustomException from src.logger import logging import sys from sklearn.preprocessing import StandardScaler, OneHotEncoder from sklearn.compose import ColumnTransformer from sklearn.pipeline import Pipeline from sklearn.impute import SimpleImputer import pandas as pd import numpy as np from dataclasses import dataclass import os @dataclass class DataTransformationConfig: preprocessor_obj_file_path = os.path.join('artifacts', 'preprocessor.pkl') class DataTransformation: def __init__(self): # 问题核心:未初始化data_transformation_config属性 pass def get_data_transformer_object(self): try: numerical_features = ["age", "fare"] categorical_features = ["gender", "class"] num_pipeline = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="median")), ("scaler", StandardScaler()) ] ) cat_pipeline = Pipeline( steps=[ ("imputer", SimpleImputer(strategy="most_frequent")), ("one_hot_encoder", OneHotEncoder()), ("scaler", StandardScaler(with_mean=False)) ] ) logging.info(f"Numerical features: {numerical_features}") logging.info(f"Categorical features: {categorical_features}") preprocessor = ColumnTransformer( [ ("num_pipeline", num_pipeline, numerical_features), ("cat_pipelines", cat_pipeline, categorical_features) ] ) return preprocessor except Exception as e: raise CustomException(e, sys) def initiate_data_transformation(self, train_path, test_path): try: train_df = pd.read_csv(train_path) test_df = pd.read_csv(test_path) logging.info("Read train and test data completed") logging.info("Obtaining preprocessing object") preprocessing_obj = self.get_data_transformer_object() target_column_name = "price" input_feature_train_df = train_df.drop(columns=[target_column_name], axis=1) target_feature_train_df = train_df[target_column_name] input_feature_test_df = test_df.drop(columns=[target_column_name], axis=1) target_feature_test_df = test_df[target_column_name] logging.info( f"Applying preprocessing object on training dataframe and testing dataframe." ) input_feature_train_arr = preprocessing_obj.fit_transform(input_feature_train_df) input_feature_test_arr = preprocessing_obj.transform(input_feature_test_df) train_arr = np.c_[ input_feature_train_arr, np.array(target_feature_train_df) ] test_arr = np.c_[input_feature_test_arr, np.array(target_feature_test_df)] logging.info(f"Saved preprocessing object.") # 此处调用未初始化的data_transformation_config导致报错 save_object( file_path=self.data_transformation_config.preprocessor_obj_file_path, obj=preprocessing_obj ) return ( train_arr, test_arr, self.data_transformation_config.preprocessor_obj_file_path, ) except Exception as e: raise CustomException(e, sys)
错误回溯
AttributeError Traceback (most recent call last) Cell In[X], line Y 1 from src.pipeline.data_transformation_pipeline import DataTransformation 2 dt = DataTransformation() ----> 3 dt.initiate_data_transformation(train_path, test_path) File ~/FlightFarePrediction/src/components/data_transformation.py:ZZ, in DataTransformation.initiate_data_transformation(self, train_path, test_path) AA logging.info(f"Saved preprocessing object.") AB ---> AC save_object( AD file_path=self.data_transformation_config.preprocessor_obj_file_path, AE obj=preprocessing_obj AF ) AG AH return ( AI train_arr, AJ test_arr, AK self.data_transformation_config.preprocessor_obj_file_path, AL ) AttributeError: 'DataTransformation' object has no attribute 'data_transformation_config'
解决方法
1. 初始化类内的config属性
在DataTransformation的__init__方法中,添加DataTransformationConfig实例的初始化代码:
class DataTransformation: def __init__(self): self.data_transformation_config = DataTransformationConfig() # 新增该行
2. 验证config类的导入
确保DataTransformationConfig已被正确导入到当前文件中,如果是同文件定义则无需额外导入;如果是单独文件,需添加导入语句:
from src.components.data_transformation_config import DataTransformationConfig
3. 确保目标目录存在
可以在DataTransformationConfig中添加目录创建逻辑,避免保存文件时因目录不存在报错:
@dataclass class DataTransformationConfig: preprocessor_obj_file_path = os.path.join('artifacts', 'preprocessor.pkl') # 自动创建artifacts目录 os.makedirs(os.path.dirname(preprocessor_obj_file_path), exist_ok=True)
4. 检查save_object函数实现
确认save_object函数能正确处理文件路径和对象序列化:
import pickle def save_object(file_path, obj): try: dir_path = os.path.dirname(file_path) os.makedirs(dir_path, exist_ok=True) with open(file_path, "wb") as file_obj: pickle.dump(obj, file_obj) except Exception as e: raise CustomException(e, sys)
内容的提问来源于stack exchange,提问作者Md. Ehsanul Haque Kanan
相关产品推荐
相关产品推荐

