2014-10-12 82 views
0

我使用numpy数组做支持向量机的问题如下。在Sklearn中运行SVM时的值错误

import numpy as np 
from sklearn import svm 

我有3类/标签(malefemalena),表示如下:

labels = [0,1,2] 

每个类是由3个变量(heightweightage)作为训练数据定义:

male_height = np.array([111,121,137,143,157]) 
male_weight = np.array([60,70,88,99,75]) 
male_age = np.array([41,32,73,54,35]) 

males = np.hstack([male_height,male_weight,male_age]) 

female_height = np.array([91,121,135,98,90]) 
female_weight = np.array([32,67,98,86,56]) 
female_age = np.array([51,35,33,67,61]) 

females = np.hstack([female_height,female_weight,female_age]) 

na_height = np.array([96,127,145,99,91]) 
na_weight = np.array([42,97,78,76,86]) 
na_age = np.array([56,35,49,64,66]) 

nas = np.hstack([na_height,na_weight,na_age]) 

现在我必须拟合支持向量机方法f或训练数据来预测类给出的三个变量:

height_weight_age = [100,100,100] 

clf = svm.SVC() 
trainingData = np.vstack([males,females,nas]) 

clf.fit(trainingData, labels) 

result = clf.predict(height_weight_age) 

print result 

不幸的是,出现以下错误:

ValueError: X.shape[1] = 3 should be equal to 15, the number of features at training time 

我应该如何修改trainingDatalabels,以得到正确的答案?

+0

@jonrsharpe感谢编辑我的原始问题,很好! – jean 2014-10-12 14:13:45

回答

2

hstack给出了一维数组。您需要形状为(n_samples, n_features)的二维阵列,您可以从vstack获取这些阵列。

In [7]: males = np.hstack([male_height,male_weight,male_age]) 

In [8]: males 
Out[8]: 
array([111, 121, 137, 143, 157, 60, 70, 88, 99, 75, 41, 32, 73, 
     54, 35]) 

In [9]: np.vstack([male_height,male_weight,male_age]) 
Out[9]: 
array([[111, 121, 137, 143, 157], 
     [ 60, 70, 88, 99, 75], 
     [ 41, 32, 73, 54, 35]]) 

In [10]: np.vstack([male_height,male_weight,male_age]).T 
Out[10]: 
array([[111, 60, 41], 
     [121, 70, 32], 
     [137, 88, 73], 
     [143, 99, 54], 
     [157, 75, 35]]) 

您还需要传递反映每个样本标签的标签列表/数组,而不仅仅是枚举存在的标签。固定所有变量后,我可以训练SVM和如下应用它。

In [19]: clf = svm.SVC() 

In [20]: y = ["male"] * 5 + ["female"] * 5 + ["na"] * 5 

In [21]: X = np.vstack([males, females, nas]) 

In [22]: clf.fit(X, y) 
Out[22]: 
SVC(C=1.0, cache_size=200, class_weight=None, coef0=0.0, degree=3, gamma=0.0, 
    kernel='rbf', max_iter=-1, probability=False, random_state=None, 
    shrinking=True, tol=0.001, verbose=False) 

In [23]: height_weight_age = [100,100,100] 

In [24]: clf.predict(height_weight_age) 
Out[24]: 
array(['female'], 
     dtype='|S6') 

(请注意,我使用的字符串标签而不是用数字我也劝你了标准化的特征值,因为他们有相当不同的范围。)

+0

我总是认为我需要在特征值变化数个数量级时进行标准化......即使在像这样的情况下,它们之间的差异依次为(微小的)常数,您会发现它有帮助吗? – Fred 2014-10-12 16:08:51

+1

@Fred这当然值得一试。它还改变了“C”(正则化)参数的规模,使其更容易处理。 – 2014-10-12 16:42:39

+0

@Fred什么是标准化?我该怎么做?例如:@ larsmans – jean 2014-10-13 01:13:30