在Sklearn中通过1d数组获取弃用警告

时间:2017-02-19 00:59:40

标签: python scikit-learn svm

我很难解决this question中描述的警告问题,不幸的是,按照建议的解决方法,我没有解决问题。

显然我正在向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]]

我的系列是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)

我输入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)

代码有效,我确实得到了预测,并且能够计算准确度,但我仍然在发出警告。

据我所知,从搜索和上面引用的其他问题我的数据是正确的形式。我错过了什么?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分: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数组以使区分明确。