2017-02-19 53 views
0

不幸的是,我在解決this question中描述的警告問題時遇到了一個可怕的時間,下面提出了修復方案,我沒有解決問題。在Sklearn 1d陣列中獲得棄用警告

顯然我正在喂一個數組到SVM.SVC預測和我越來越棄用警告。我只是無法弄清楚我做錯了什麼,我希望有人能幫我修復我的代碼。我相信這是我錯過的一個小小的改正。

我使用Python 2.7

我開始一個數據幀data_df(尺寸減小這裏爲了清楚,但代碼和結構是準確):

Price/Sales Price/Book Profit Margin Operating Margin 
0   2.80  6.01   29.56    11.97 
1   2.43  4.98   25.56    6.20 
2   1.61  3.24   4.86    5.38 
3   1.52  3.04   4.86    5.38 
4   3.31  4.26   6.38    3.58 

更改數據幀到numpy的數組:

X = data_df.values 

這給了我:

[[ 2.8, 6.01, 29.56, 11.97], 
[ 2.43, 4.98, 25.56, 6.2 ], 
[ 1.61, 3.24, 4.86, 5.38], 
[ 1.52, 3.04, 4.86, 5.38], 
[ 3.31, 4.26, 6.38, 3.58]] 

然後我中心和規範我的數據:

X = preprocessing.scale(X) 

這給我:

[[ 0.67746872 1.5428404 1.39746257 1.90843628] 
[ 0.13956437 0.61025495 1.03249454 -0.10540376] 
[-1.05254797 -0.96518067 -0.85621499 -0.3915994 ] 
[-1.18338957 -1.14626523 -0.85621499 -0.3915994 ] 
[ 1.41890444 -0.04164945 -0.71752714 -1.01983373]] 

我y是一系列的0和1的:

[0, 0, 1, 0, 1] 

的實際數據集大約有10,000個觀測值。我用下面的代碼來選擇用於培訓,測試的子集,和檢查精度:

test_size = 500 


clf = svm.SVC(kernel = "linear", C=1.0) 
clf.fit(X[:-test_size],y[:-test_size]) 

correct_count = 0 

for x in range(1, test_size+1): 
    if clf.predict(X[-x])[0] == y[-x]: 
     correct_count += 1 

print("Accuracy: ", correct_count/test_size * 100.00) 

測試集的因子I送入clf.predict(X [-x]爲x = 1到test_size 1)投以下警告:

C:\Users\me\AppData\Local\Continuum\Anaconda2\lib\site-packages\sklearn\ut 
ils\validation.py:386: DeprecationWarning: Passing 1d arrays as data is deprecat 
ed in 0.17 and willraise ValueError in 0.19. Reshape your data either using X.re 
shape(-1, 1) if your data has a single feature or X.reshape(1, -1) if it contain 
s a single sample. 
    DeprecationWarning) 

該代碼的工作原理和我得到的預測,並能夠計算準確性,但我仍然拋出警告。

據我可以告訴從搜索和上面引用的其他問題我的數據是在適當的形式。我錯過了什麼?

在此先感謝您的幫助。

回答

2

你只需要做什麼警告消息建議。您的變量X[-x]是1D,但需要是2D。它具備多項功能的單一樣本,所以只需添加.reshape(1,-1)它並警告消失了:

for x in range(1, test_size+1): 
    if clf.predict(X[-x].reshape(1,-1))[0] == y[-x]: 
     correct_count += 1 

clf.predict功能是能夠預測使用多個功能的多個值。如果您傳遞一維數組,則不清楚您的意圖是具有多個特徵的單個值,還是具有單個特徵的多個值。警告消息要求您自己組成2D陣列以明確區分。

+0

感謝您的回答。我以爲我嘗試了這個,但是我又有了一個重疊的警告,導致我認爲這不起作用。但是,你能否更詳細地解釋.reshape(-1,1)是做什麼的?該數組仍然是看起來是一維列表的數組。另外,您是否可以澄清您的陳述「目前還不清楚您的意圖是具有多個功能的單一值,還是具有單一功能的多個值。」謝謝。 – Windstorm1981

+0

'.reshape(1,-1)'中的'-1'在數組中創建一個新維度,將一維數組轉換爲二維數組。結果有1行,以及新維度中保存原始1D數據的值。在打印時請注意額外的括號,表示維度。 'clf.predict'可以使用多個獨立變量來預測單個結果,並且它可以一次預測多個結果,每個結果都有自己的2D輸入數組片段。如果給出了一維數組,那麼如果你打算使用許多獨立變量,或者預測許多結果,並不是很清楚。 – Brian