在Google AI平台上使用Scikitlearn获取预测时出现问题:“numpy.ndarray”对象没有属性“lower”

2024-06-01 22:46:12 发布

您现在位置:Python中文网/ 问答频道 /正文

一般来说,我对机器学习还比较陌生,希望将我的模型存储在云中,以便进行在线预测

我在Scikit learn Local(使用Jupyter笔记本)和Google AI平台(使用他们的培训工作功能)上成功地使用TfIdf vecotrizer(用于情绪分析)训练了一个逻辑回归模型

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

我的训练算法是这样的:

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

  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_
    

我可以使用

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格式不正确

谢谢你的帮助


Tags: 文件字符串from模型importgsfalsemodel
1条回答
网友
1楼 · 发布于 2024-06-01 22:46:12

好吧,我发现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"

相关问题 更多 >