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

解决端到端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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 09:14:55