【问题标题】:Problem getting predictions with Scikit-learn on Google AI Platform: 'numpy.ndarray' object has no attribute 'lower'"在 Google AI Platform 上使用 Scikit-learn 获取预测时出现问题:“numpy.ndarray”对象没有属性“lower””
【发布时间】:2019-12-08 12:22:18
【问题描述】:

总的来说,我对机器学习还很陌生,我想将我的模型存储在云中,以便进行在线预测。

我使用 Jupyter Notebook 在本地 Scikit-learn 上使用 TfIdf vecotrizer(用于情绪分析)成功地训练了一个逻辑回归模型,并使用他们的 Training Job 功能在 Google AI Platform 上成功训练了一个逻辑回归模型。

我必须提到,我在培训包 setup.py 文件中包含了 bs4、nltk、lxml 作为所需的 PyPI 包。

我的训练算法是这样的:

  1. 将输入字符串及其标签(输出)的 CSV 文件导入为 pandas 数据框(模型有 1 个输入变量,即字符串。)

  2. 使用 bs4 和 nltk 预处理输入字符串,以删除不必要的字符、停用词,并使所有字符变为小写(要重现这一点,只需使用仅小写字母的字符串)。

  3. 创建管道

    from sklearn.feature_extraction.text import TfidfVectorizer
    tvec=TfidfVectorizer()
    lclf = LogisticRegression(fit_intercept = False, random_state = 255, max_iter = 1000)
    from sklearn.pipeline import Pipeline
    model_1= Pipeline([('vect',tvec),('clf',lclf)])
    
  4. 使用 GridSearchCV 进行交叉验证

    from sklearn.model_selection import GridSearchCV
    
    param_grid = [{'vect__ngram_range' : [(1, 1)],
           'clf__penalty' : ['l1', 'l2'],
           'clf__C' : [1.0, 10.0, 100.0]},
          {'vect__ngram_range' : [(1, 1)],
           'clf__penalty' : ['l1', 'l2'],
           'clf__C' : [1.0, 10.0, 100.0],
           'vect__use_idf' : [False],
           'vect__norm' : [False]}]
    
    gs_lr_tfidf = GridSearchCV(model_1, param_grid, scoring='accuracy', 
    cv=5, verbose=1, n_jobs=-1)
    gs_lr_tfidf.fit(X_train, y_train)
    
  5. 以最佳估计获得我想要的模型。这是保存在 Google model.joblib 文件中的模型。

    clf = gs_lr_tfidf.best_estimator_
    

我可以使用

在我的 Jupyter Notebook 文件上输出一个简单的预测
predicted = clf.predict(["INPUT STRING"])
print(predicted)

它为我的输入字符串打印预测标签。如['good']或['bad']

但是当模型成功训练并提交到 AI 平台时,当我尝试请求预测时,例如(以所需的 JSON 格式):

["the quick brown fox jumps over the lazy dog"]
["hi what is up"]

shell 返回此错误:

{
  "error": "Prediction failed: Exception during sklearn prediction: 
  'numpy.ndarray' object has no attribute 'lower'"
}

这里可能出了什么问题?

这可能是依赖项的问题,我也必须在我的 google 托管模型中安装 bs4、lxml 和 nltk 的软件包吗?

还是我输入的 JSON 格式不正确?

感谢您的帮助。

【问题讨论】:

    标签: python scikit-learn google-cloud-platform google-prediction


    【解决方案1】:

    好的,我发现 JSON 格式的格式确实不正确。 (回复https://stackoverflow.com/a/51693619/10570541

    正如官方文档所述,JSON 格式有换行符和方括号来分隔实例,例如:

    [6.8,  2.8,  4.8,  1.4]
    [6.0,  3.4,  4.5,  1.6]
    

    如果您有多个输入变量,则适用。

    仅对于一个输入变量,只需使用换行符即可。

    "the quick brown fox jumps over the lazy dog"
    "alright it works"
    

    【讨论】:

      猜你喜欢
      • 2019-06-18
      • 2020-09-22
      • 2014-12-09
      • 2020-10-06
      • 2019-01-12
      • 1970-01-01
      • 2019-12-07
      • 1970-01-01
      • 2020-10-22
      相关资源
      最近更新 更多