scikit拟合数据错误

时间:2017-02-01 05:23:44

标签: python numpy machine-learning scikit-learn svm

我正在尝试实施一种学习算法,用于预测图片的目标值是1还是0。首先,我的目标值设置为......

real = [1] * len(images)
fake = [0] * len(fake_images)

total_target = real + fake
total_target = numpy.array(total_target)

>>> [1 1 1 ... 0 0 0 0]

接下来,我将图像列表转换为numpy数组的numpy数组。所以我将每个图像存储为numpy数组......

training_set = []
for image in total_images:
    im = image.convert("L")
    dataset = numpy.asarray(im)
    training_set.append(dataset)
training_set = numpy.array(training_set)

所以training_set保存图像。 training_set的顺序与total_target的顺序相对应,因此training_set中的第一个图片对应total_target1的第一个值n_samples = len(training_set) data = training_set.reshape((n_samples, -1)) 在上面的例子中。

接下来我把训练集弄平了......

classifier = svm.SVC(gamma=0.001)
classifier.fit(data[:n_samples-1], total_target[:n_samples-1])

现在我把它传递给以下......

expected = total_target[-1]
predicted = classifier.predict(data[-1])

我没有包含最后一张图片及其各自的值,因为这是我想要预测的值......

total_target

当我运行所有这些时,我收到以下错误......

  

DeprecationWarning:传递1d数组作为数据在0.17中弃用,并且将ValueError用于0.19。如果数据具有单个要素,则使用X.reshape(-1,1)重新整形数据;如果包含单个样本,则使用X.reshape(1,-1)重新整形数据。     DeprecationWarning)

好的,所以错误看起来我的total_target = numpy.array(total_target).reshape(-1, 1) 格式错误,所以我添加以下内容......

ravel()

我运行它,现在我收到以下错误

  

DataConversionWarning:当期望1d数组时,传递了列向量y。请将y的形状更改为(n_samples,),例如使用ravel()。 y_ = column_or_1d(y,warn = True)

     

C:\ Users \ Eric \ Anaconda2 \ lib \ site-packages \ sklearn \ utils \ validation.py:386:DeprecationWarning:传递1d数组,因为数据在0.17中已弃用,并且会在0.19中提升ValueError。如果数据具有单个要素,则使用X.reshape(-1,1)重新整形数据;如果包含单个样本,则使用X.reshape(1,-1)重新整形数据。     DeprecationWarning)

我尝试在total_target上使用numpy,但它只是让我回到之前的错误。我认为我的格式错误,我对import win32con import win32gui try: import _winreg as winreg except ImportError: # this has been renamed in python 3 import winreg def set_environment_variable(variable, value, user_env=True): if user_env: # This is for the user's environment variables reg_key = winreg.OpenKey( winreg.HKEY_CURRENT_USER, 'Environment', 0, winreg.KEY_SET_VALUE) else: # This is for the system environment variables reg_key = winreg.OpenKey( winreg.HKEY_LOCAL_MACHINE, r'SYSTEM\CurrentControlSet\Control\Session Manager\Environment', 0, winreg.KEY_SET_VALUE) if '%' in value: var_type = winreg.REG_EXPAND_SZ else: var_type = winreg.REG_SZ with reg_key: winreg.SetValueEx(reg_key, variable, 0, var_type, value) # notify about environment change win32gui.SendMessageTimeout( win32con.HWND_BROADCAST, win32con.WM_SETTINGCHANGE, 0, 'Environment', win32con.SMTO_ABORTIFHUNG, 1000) 数组很新。

1 个答案:

答案 0 :(得分:1)

Numpy的atleast_2d让代码生效。

让我们首先生成一些模拟数据,即500行乘1200列的5个真实和5个假8位图像:

In [111]: import numpy as np

In [112]: real, fake = 5, 5

In [113]: rows, cols = 800, 1200

In [114]: bits = 8

In [115]: target = np.hstack([np.ones(real), np.zeros(fake)])

In [116]: np.random.seed(2017)

In [117]: images = np.random.randint(2**bits, size=(real + fake, rows, cols))

In [118]: data = images.reshape(images.shape[0], -1)

In [119]: data
Out[119]: 
array([[ 59,   9, 198, ..., 189, 201,  38],
       [150, 251, 145, ...,  95, 214, 175],
       [156, 212, 220, ..., 179,  63,  48],
       ..., 
       [ 25,  94, 108, ..., 159, 144, 216],
       [179, 103, 217, ...,  92, 219,  34],
       [198, 209, 177, ...,   6,   4, 144]])

In [120]: data.shape
Out[120]: (10L, 960000L)

然后我们使用除最后一张图像以外的所有图像训练分类器:

In [121]: from sklearn import svm

In [122]: classifier = svm.SVC(gamma=0.001)

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

如果您现在尝试通过classifier.predict(data[-1])对最后一张图片进行分类,那么sklearn会抱怨。为了让sklearn满意,您只需确保测试数据是二维的,如下所示:

In [124]: classifier.predict(np.atleast_2d(data[-1]))
Out[124]: array([ 1.])