我正在训练用于文本分类的python(2.7.11)分类器,并且在运行时我收到了一条弃用的警告消息,我不知道我的代码中的哪一行导致它!错误/警告。但是,代码工作正常并给我结果......
\ AppData \ Local \ Enthought \ Canopy \ User \ lib \ site-packages \ sklearn \ utils \ validation.py:386:DeprecationWarning:传递1d数组,因为数据在0.17中已弃用,并且会在0.19中提升ValueError。如果您的数据具有单个要素,则使用X.reshape(-1,1)重新整形数据;如果包含单个样本,则使用X.reshape(1,-1)重新整形数据。
我的代码:
def main():
data = []
folds = 10
ex = [ [] for x in range(0,10)]
results = []
for i,f in enumerate(sys.argv[1:]):
data.append(csv.DictReader(open(f,'r'),delimiter='\t'))
for f in data:
for i,datum in enumerate(f):
ex[i % folds].append(datum)
#print ex
for held_out in range(0,folds):
l = []
cor = []
l_test = []
cor_test = []
vec = []
vec_test = []
for i,fold in enumerate(ex):
for line in fold:
if i == held_out:
l_test.append(line['label'].rstrip("\n"))
cor_test.append(line['text'].rstrip("\n"))
else:
l.append(line['label'].rstrip("\n"))
cor.append(line['text'].rstrip("\n"))
vectorizer = CountVectorizer(ngram_range=(1,1),min_df=1)
X = vectorizer.fit_transform(cor)
for c in cor:
tmp = vectorizer.transform([c]).toarray()
vec.append(tmp[0])
for c in cor_test:
tmp = vectorizer.transform([c]).toarray()
vec_test.append(tmp[0])
clf = MultinomialNB()
clf .fit(vec,l)
result = accuracy(l_test,vec_test,clf)
print result
if __name__ == "__main__":
main()
知道哪条线引发了这个警告? 另一个问题是,使用不同的数据集运行此代码可以获得相同的准确度,我无法弄清楚这是什么情况? 如果我想在另一个python进程中使用这个模型,我查看了文档,我找到了一个使用pickle库的例子,但没有找到joblib。所以,我尝试使用相同的代码,但这给了我错误:
clf = joblib.load('model.pkl')
pred = clf.predict(vec);
此外,如果我的数据是具有以下格式的CSV文件:" lable \ t text \ n" 测试数据中的标签列应该是什么?
提前致谢
答案 0 :(得分:17)
你的' vec'输入你的clf.fit(vec,l).fit需要是[[]]类型,而不仅仅是[]。这是一个怪癖,当我适合模特时,我总是忘记这一点。
只需添加一组额外的方括号就行了!
答案 1 :(得分:11)
这是:
pred = clf.predict(vec);
我在我的代码中使用了它,它起作用了:
#This makes it into a 2d array
temp = [2 ,70 ,90 ,1] #an instance
temp = np.array(temp).reshape((1, -1))
print(model.predict(temp))
答案 2 :(得分:5)
如果您想了解Warning
的来源,您可以暂时将Warnings
提升为Exceptions
。这将为您提供完整的Traceback,从而为您的程序遇到警告的行提供。
with warnings.catch_warnings():
warnings.simplefilter("error")
main()
如果从命令行运行程序,您还可以使用-W
标志。有关警告处理的更多信息,请参阅python documentation。
我知道这只是我回答的问题的一部分,但您是否调试了代码?
答案 3 :(得分:5)
2解决方案:philosophy___将您的数据从1D制作到2D
只需添加:[]
vec = [vec]
重塑数据
import numpy as np
vec = np.array(vec).reshape(1, -1)
答案 4 :(得分:0)
由于不推荐使用1D数组。尝试将2D数组作为参数传递。这可能有所帮助。
clf = joblib.load('model.pkl')
pred = clf.predict([vec]);
答案 5 :(得分:0)
预测方法需要二维数组,您可以观看此视频,我也已经确定了准确的时间https://youtu.be/KjJ7WzEL-es?t=2602。您必须从[]更改为[[]]。