Модель ScikitLearn, предоставляющая объект «LocalOutlierFactor», не имеет атрибута «ести »Ошибка - PullRequest
0 голосов
/ 25 апреля 2018

Я новичок в мире машинного обучения, и я создал и обучил модель ml, используя библиотеку ScikitLearn. Она отлично работает в записной книжке Jupyter, но когда я развернул эту модель в Google Cloud ML и попытался обслужить ее с помощью Python скрипт выдает ошибку.

Вот фрагмент из кода моей модели:

Обновлен:

from sklearn.metrics import classification_report, accuracy_score
from sklearn.ensemble import IsolationForest
from sklearn.neighbors import LocalOutlierFactor

# define a random state
state = 1

classifiers = {
    "Isolation Forest": IsolationForest(max_samples=len(X),
                                       contamination=outlier_fraction,
                                       random_state=state),
    # "Local Outlier Factor": LocalOutlierFactor(
    # n_neighbors = 20,
    # contamination = outlier_fraction)
}

import pickle
# fit the model
n_outliers = len(Fraud)

for i, (clf_name, clf) in enumerate(classifiers.items()):

    # fit te data and tag outliers
    if clf_name == "Local Outlier Factor":
        y_pred = clf.fit_predict(X)
        print("LOF executed")
        scores_pred = clf.negative_outlier_factor_
        # Export the classifier to a file
        with open('model.pkl', 'wb') as model_file:
            pickle.dump(clf, model_file)
    else:
        clf.fit(X)
        scores_pred = clf.decision_function(X)
        y_pred = clf.predict(X)
        print("IF executed")
        # Export the classifier to a file
        with open('model.pkl', 'wb') as model_file:
            pickle.dump(clf, model_file)
    # Reshape the prediction values to 0 for valid and 1 for fraudulent
    y_pred[y_pred == 1] = 0
    y_pred[y_pred == -1] = 1

    n_errors = (y_pred != Y).sum()

# run classification metrics 
print('{}:{}'.format(clf_name, n_errors))
print(accuracy_score(Y, y_pred ))
print(classification_report(Y, y_pred ))

и вот вывод в блокноте Jupyter:

Лес изоляции: 7

0,93

               precision    recall  f1-score   support


         0       0.97      0.96      0.96        94
         1       0.43      0.50      0.46         6

  avg / total    0.94      0.93      0.93       100

Я развернул эту модель в Google Cloud ML-Engine, а затем попытался обслужить ее, используя следующий скрипт Python:

import os
from googleapiclient import discovery
from oauth2client.service_account import ServiceAccountCredentials
credentials = ServiceAccountCredentials.from_json_keyfile_name('Machine Learning 001-dafe42dfb46f.json')

PROJECT_ID = "machine-learning-001-201312"
VERSION_NAME = "v1"
MODEL_NAME = "mlfd"
service = discovery.build('ml', 'v1', credentials=credentials)
name = 'projects/{}/models/{}'.format(PROJECT_ID, MODEL_NAME)
name += '/versions/{}'.format(VERSION_NAME)

data = [[265580, 7, 68728, 8.36, 4.76, 84.12, 79.36, 3346, 1, 11.99, 1.14,655012, 0.65, 258374, 0, 84.12] ]

response = service.projects().predict(
    name=name,
    body={'instances': data}
).execute()

if 'error' in response:
  print (response['error'])
else:
  online_results = response['predictions']
  print(online_results)

Вот вывод этого скрипта:

Ошибка прогнозирования: исключение во время прогнозирования sklearn: у объекта 'LocalOutlierFactor' нет атрибута'ести '

Ответы [ 4 ]

0 голосов
/ 15 мая 2018

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

С уважением Лоренц

0 голосов
/ 25 апреля 2018

Похоже, что это может быть в версии Python (хотя мне не ясно, почему scikit learn ведет себя по-разному в Python 2 по сравнению с Python 3).Я был в состоянии проверить локально - на той же машине - что моя установка Python 2 воспроизводит ошибку выше, в то время как Python 3 успешно (оба используют sci-kit learn 0.19.1).

Решение состоит в том, чтобыукажите версию Python при развертывании модели (обратите внимание на последнюю строку, которая, если она не указана, по умолчанию имеет значение «2,7»):

gcloud beta ml-engine versions create $VERSION_NAME \
    --model $MODEL_NAME --origin $DEPLOYMENT_SOURCE \
    --runtime-version="1.5" --framework $FRAMEWORK
    --python-version="3.5"
0 голосов
/ 25 апреля 2018

Удивительно, но проблема заключается в runtime version, она будет решена, когда вы пересоздаете версию своей модели следующим образом:

gcloud beta ml-engine versions create $VERSION_NAME  --model $MODEL_NAME --origin $DEPLOYMENT_SOURCE --runtime-version="1.6" --framework $FRAMEWORK --python-version="3.5"

Использовать рабочую версию 1.6 вместо 1,5 включите его как минимум в работающую модель.

0 голосов
/ 25 апреля 2018

LocalOutlierFactor не имеет метода predict, а только частный метод _predict. Вот оправдание из источника.

def _predict(self, X=None):
    """Predict the labels (1 inlier, -1 outlier) of X according to LOF.
    If X is None, returns the same as fit_predict(X_train).
    This method allows to generalize prediction to new observations (not
    in the training set). As LOF originally does not deal with new data,
    this method is kept private.

https://github.com/scikit-learn/scikit-learn/blob/a24c8b46/sklearn/neighbors/lof.py#L200

...