我通常是机器学习的新手,并希望将我的模型存储在云中以进行在线预测。
我使用Jupyter Notebook在Scikit-Learn上成功培训了使用TFIDF Vecotrizer(用于情感分析(的Logistic回归模型,并使用其培训工作功能在Google AI平台上进行了训练。
我必须提到我将BS4,NLTK,LXML包括在我的培训软件包设置中,作为所需的PYPI软件包。
我的培训算法是这样的:
-
导入输入字符串的CSV文件及其标签(输出(作为PANDAS DataFrame(该模型具有1个输入变量,即字符串。(
-
使用BS4和NLTK预处理字符串来删除不必要的字符,停止字符,并使所有字符较低(重现此字符((仅使用小写字母的仅限字母(。
-
创建管道
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)])
-
使用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)
-
以最佳的估计获取我所需的模型。这是保存在Google Model.joblib文件中的模型。
clf = gs_lr_tfidf.best_estimator_
我可以使用
在jupyter笔记本文件上输出一个简单的预测predicted = clf.predict(["INPUT STRING"])
print(predicted)
它为我的输入字符串打印了预测的标签。例如['好']或['bad']
但是,当模型经过成功培训并提交给AI平台时,当我尝试请求(以所需的JSON格式(之类的预测时:
["the quick brown fox jumps over the lazy dog"]
["hi what is up"]
外壳带有此错误返回:
{
"error": "Prediction failed: Exception during sklearn prediction:
'numpy.ndarray' object has no attribute 'lower'"
}
这里可能出了什么问题?
这可能是依赖关系的问题,我也必须在我的Google寄托模型中安装BS4,LXML和NLTK的软件包?
还是我的输入JSON格式不正确?
感谢您的帮助。
好吧,我发现确实对JSON格式进行了错误的格式。(在https://stackoverflow.com/a/51693619/10570541上回答(
正式文档指出,JSON格式具有新线和方括号可以分开的实例,例如:
[6.8, 2.8, 4.8, 1.4]
[6.0, 3.4, 4.5, 1.6]
如果您有多个输入变量,则适用。
仅对于一个输入变量,只需使用newlines即可。
"the quick brown fox jumps over the lazy dog"
"alright it works"