【问题标题】:sci-kit learn: Reshape your data either using X.reshape(-1, 1)sci-kit learn:使用 X.reshape(-1, 1) 重塑数据
【发布时间】:2016-05-12 00:09:12
【问题描述】:

我正在训练一个用于文本分类的 python (2.7.11) 分类器,在运行时我收到一条已弃用的警告消息,我不知道我的代码中的哪一行导致了它!错误/警告。但是,代码可以正常工作并给我结果...

\AppData\Local\Enthought\Canopy\User\lib\site-packages\sklearn\utils\validation.py:386: DeprecationWarning: Passing 1d arrays as data 在 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 文件:“label \t text \n” 测试数据的标签列应该是什么?

提前致谢

【问题讨论】:

    标签: python scikit-learn


    【解决方案1】:

    clf.fit(vec,l).fit 中的“vec”输入必须是[[]] 类型,而不仅仅是[]。这是我在拟合模型时总是忘记的怪癖。

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

    【讨论】:

      【解决方案2】:

      预测方法需要二维数组,你可以看这个视频,我也找到了确切的时间https://youtu.be/KjJ7WzEL-es?t=2602。你必须从[]更改为[[]]。

      【讨论】:

        【解决方案3】:

        2 解决方案:哲学___使您的数据从一维变为二维

        1. 只需添加:[]

          vec = [vec]
          
        2. 重塑您的数据

          import numpy as np
          vec = np.array(vec).reshape(1, -1)
          

        【讨论】:

          【解决方案4】:

          由于一维数组将被弃用。尝试将二维数组作为参数传递。这可能会有所帮助。

          clf = joblib.load('model.pkl') 
          pred = clf.predict([vec]);
          

          【讨论】:

            【解决方案5】:

            是:

            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))
            

            【讨论】:

              【解决方案6】:

              如果您想了解Warning 的来源,可以暂时将Warnings 升级为Exceptions。这将为您提供完整的 Traceback 以及您的程序遇到警告的行。

              with warnings.catch_warnings():
                  warnings.simplefilter("error")
                  main()
              

              如果您从命令行运行程序,您还可以使用-W 标志。有关警告处理的更多信息,请参阅python documentation

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

              【讨论】:

              • 不,我没有调试,因为我在windows上使用canopy,需要升级才能下载调试工具,我是这一切的初学者!谢谢你的回答
              • 如果你的意思是控制台上的内容,那么我得到的是我上面粘贴的内容。仅此而已。如果您的意思是跟踪代码,那么我没有尝试过,但是似乎我可以导入 pdb 库,但是使用它并没有太大帮助(可能是因为我是初学者)...
              猜你喜欢
              • 2022-09-28
              • 2020-03-21
              • 2017-06-20
              • 2019-01-29
              • 2014-05-17
              • 1970-01-01
              • 2020-07-17
              • 2012-10-01
              • 1970-01-01
              相关资源
              最近更新 更多