Skip to main content
 首页 » 编程设计

python之属性错误 : 'LinearRegression' object has no attribute 'predict_proba'

2025年05月04日19Terrylee

我需要帮助解决学校评分员生成的属性错误。

我的任务: 我需要创建一个自定义转换器以输入到评分器中。

评分器将字典列表传递给我的估算器的 predict 或 predict_proba 方法,而不是 DataFrame。这意味着该模型必须适用于两种数据类型。出于这个原因,我需要提供一个自定义 ColumnSelectTransformer 来使用 scikit-learn 自己的 ColumnTransformer。

这是我的自定义转换器代码,旨在在提供的列中估算空值。

from sklearn.impute import SimpleImputer 
 
simple_cols = ['BEDCERT', 'RESTOT', 'INHOSP', 'CCRC_FACIL', 'SFF', 'CHOW_LAST_12MOS', 'SPRINKLER_STATUS', 'EXP_TOTAL', 'ADJ_TOTAL'] 
 
class ColumnSelectTransformer(BaseEstimator, TransformerMixin): 
    def __init__(self, columns): 
        self.columns = columns 
 
    def fit(self, X, y=None): 
        return self 
 
    def transform(self, X): 
        if not isinstance(X, pd.DataFrame): 
            X = pd.DataFrame(X) 
        return X[self.columns].values 
 
simple_features = Pipeline([ 
    ('cst', ColumnSelectTransformer(simple_cols)), 
    ('imputer', SimpleImputer(strategy='mean')), 
]) 
 

然后我的任务是创建一个新的管道并用一个估算器来拟合它,下面是我的尝试。

from sklearn.linear_model import LinearRegression 
 
simple_features_model = Pipeline([ 
    ('simple', simple_features), 
    ('linear', LinearRegression()), 
]) 
 
simple_features_model.fit(data, fine_counts > 0) 

管道生成成功

Pipeline(memory=None, 
         steps=[('simple', 
                 Pipeline(memory=None, 
                          steps=[('cst', 
                                  ColumnSelectTransformer(columns=['BEDCERT', 
                                                                   'RESTOT', 
                                                                   'INHOSP', 
                                                                   'CCRC_FACIL', 
                                                                   'SFF', 
                                                                   'CHOW_LAST_12MOS', 
                                                                   'SPRINKLER_STATUS', 
                                                                   'EXP_TOTAL', 
                                                                   'ADJ_TOTAL'])), 
                                 ('imputer', 
                                  SimpleImputer(add_indicator=False, copy=True, 
                                                fill_value=None, 
                                                missing_values=nan, 
                                                strategy='mean', verbose=0))], 
                          verbose=False)), 
                ('linear', 
                 LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, 
                                  normalize=False))], 
         verbose=False) 

但是,当我将 simple_features_model 传递给学校的评分器时

def positive_probability(model): 
    def predict_proba(X): 
        return model.predict_proba(X)[:, 1] 
    return predict_proba 
 
grader.score.ml__simple_features(positive_probability(simple_features_model)) 

出现以下错误

AttributeError                            Traceback (most recent call last) 
<ipython-input-87-243f592b48ee> in <module>() 
      4     return predict_proba 
      5  
----> 6 grader.score.ml__simple_features(positive_probability(simple_features_model)) 
 
/opt/conda/lib/python3.7/site-packages/static_grader/grader.py in func(*args, **kw) 
     92   def __getattr__(self, method): 
     93     def func(*args, **kw): 
---> 94       return self(method, *args, **kw) 
     95     return func 
     96  
 
/opt/conda/lib/python3.7/site-packages/static_grader/grader.py in __call__(self, question_name, func) 
     88       return 
     89     test_cases = json.loads(resp.text) 
---> 90     test_cases_grading(question_name, func, test_cases) 
     91  
     92   def __getattr__(self, method): 
 
/opt/conda/lib/python3.7/site-packages/static_grader/grader.py in test_cases_grading(question_name, func, test_cases) 
     40   for test_case in test_cases: 
     41     if inspect.isroutine(func): 
---> 42       sub_res = func(*test_case['args'], **test_case['kwargs']) 
     43     elif not test_case['args'] and not test_case['kwargs']: 
     44       sub_res = func 
 
<ipython-input-87-243f592b48ee> in predict_proba(X) 
      1 def positive_probability(model): 
      2     def predict_proba(X): 
----> 3         return model.predict_proba(X)[:, 1] 
      4     return predict_proba 
      5  
 
/opt/conda/lib/python3.7/site-packages/sklearn/utils/metaestimators.py in __get__(self, obj, type) 
    108                     continue 
    109                 else: 
--> 110                     getattr(delegate, self.attribute_name) 
    111                     break 
    112             else: 
 
AttributeError: 'LinearRegression' object has no attribute 'predict_proba' 

请您参考如下方法:

线性回归模块确实没有 predict_proba 属性(检查 docs ),原因很简单:概率估计仅用于分类 模型,并且不适用于回归(即数字预测),例如线性回归。

由于您的帖子中不清楚您是在尝试进行回归还是分类:

  • 如果您处于回归设置中,只需将 predict_proba 替换为 predict。
  • 如果您处于分类设置中,则不能使用线性回归 - 尝试使用逻辑回归(尽管名称不同,它是一种分类算法),它确实有一个predict_proba 属性(再次参见 docs )。