簡體   English   中英

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

[英]sci-kit learn: Reshape your data either using X.reshape(-1, 1)

我正在訓練一個用於文本分類的 python (2.7.11) 分類器,在運行時我收到一條已棄用的警告消息,我不知道代碼中的哪一行導致了它! 錯誤/警告。 但是,代碼工作正常並給我結果......

\\AppData\\Local\\Enthought\\Canopy\\User\\lib\\site-packages\\sklearn\\utils\\validation.py:386:DeprecationWarning:將一維數組作為數據在 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” 測試數據的標簽列中應該包含什么?

提前致謝

您在clf.fit(vec,l).fit “vec”輸入需要是[[]]類型,而不僅僅是[] 這是我在擬合模型時總是忘記的一個怪癖。

只需添加一組額外的方括號就可以解決問題!

它的:

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 解決方案:哲學___讓你的數據從一維到二維

  1. 只需添加: []

     vec = [vec]
  2. 重塑您的數據

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

如果您想找出Warning的來源,您可以暫時將Warnings提升為Exceptions 這會給你一個完整的回溯,因此你的程序遇到警告的行。

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

如果您從命令行運行程序,您還可以使用-W標志。 有關警告處理的更多信息可以在python 文檔中找到。

我知道這只是我回答的問題的一部分,但是您是否調試了代碼?

因為一維數組將被棄用。 嘗試將二維數組作為參數傳遞。 這可能會有所幫助。

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

預測方法需要二維數組,你可以看這個視頻,我也找到了准確的時間https://youtu.be/KjJ7WzEL-es?t=2602 。你必須從 [] 更改為 [[]]。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM