sci-kit learn:使用X.reshape(-1,1)重塑数据

sar*_*eem 5 python scikit-learn

我正在训练一个用于文本分类的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()
Run Code Online (Sandbox Code Playgroud)

有什么想法提出这个警告吗?另一个问题是,使用不同的数据集运行此代码给出了相同的准确度,我无法弄清楚这是什么情况?如果我想在另一个python进程中使用这个模型,我查看了文档,我找到了一个使用pickle库的例子,但没有找到joblib.所以,我尝试使用相同的代码,但这给了我错误:

clf = joblib.load('model.pkl') 
pred = clf.predict(vec);
Run Code Online (Sandbox Code Playgroud)

此外,如果我的数据是具有以下格式的CSV文件:"lable\t text \n"测试数据中的标签列应该是什么?

提前致谢

Hea*_*ing 18

你的clf.fit(vec,l).fit中的'vec'输入必须是[[]]类型,而不仅仅是[].这是一个怪癖,当我适合模特时,我总是忘记这一点.

只需添加一组额外的方括号就可以了!


Ram*_*deh 12

它的:

pred = clf.predict(vec);
Run Code Online (Sandbox Code Playgroud)

我在我的代码中使用了它并且它有效:

#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))
Run Code Online (Sandbox Code Playgroud)


MSe*_*ert 5

如果你想找出的Warning是来自你可以即暂时提升WarningsExceptions.这将为您提供完整的Traceback,从而为您的程序遇到警告的行提供.

with warnings.catch_warnings():
    warnings.simplefilter("error")
    main()
Run Code Online (Sandbox Code Playgroud)

如果从命令行运行程序,也可以使用该-W标志.有关警告处理的更多信息,请参阅python文档.

我知道这只是你回答的问题的一部分,但是你调试了代码吗?


小智 5

2解决方案:philosophy___将您的数据从1D制作到2D

  1. 只需添加: []

    vec = [vec]
    
    Run Code Online (Sandbox Code Playgroud)
  2. 重塑您的数据

    import numpy as np
    vec = np.array(vec).reshape(1, -1)
    
    Run Code Online (Sandbox Code Playgroud)