Ошибка атрибута у грейдера: AttributeError: у объекта «LinearRegression» нет атрибута «prept_proba » - PullRequest
1 голос
/ 09 октября 2019

Мне нужна помощь с ошибкой атрибута, сгенерированной школьным грейдером.

Моя задача: мне нужно создать собственный преобразователь для ввода в грейдер.

Грейдер передает списоксловарей для метода предиката илиgnast_proba моей оценки, а не DataFrame. Это означает, что модель должна работать с обоими типами данных. По этой причине мне нужно предоставить собственный ColumnSelectTransformer, чтобы использовать вместо него собственный ColumnTransformer от scikit-learn.

Это мой код для настраиваемого преобразователя, который нацелен на передачу нулевых значений в предоставленных столбцах.

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'

1 Ответ

4 голосов
/ 09 октября 2019

Модуль линейной регрессии действительно не имеет атрибута predict_proba (проверьте документы ) по очень простой причине: вероятностные оценки предназначены только для классификации моделей, а не длярегрессионные (то есть числовое прогнозирование), такие как линейная регрессия.

Поскольку из вашего поста не ясно, пытаетесь ли вы выполнить регрессию или классификацию:

  • Если вы находитесь внастройку регрессия , просто замените predict_proba на predict.
  • Если вы находитесь в настройке классификация , вы не можете использовать линейную регрессию - вместо этого попробуйте логистическую регрессию(несмотря на название, это алгоритм классификации), который действительно имеет атрибут predict_proba (снова см. документы ).
...