sckit-научиться приспосабливать() приводит к ошибке после нормализации данных


Я пытался это сделать:

  1. Создание X объектов и y зависимых от набора данных
  2. разбить набор данных
  3. нормализовать данные
  4. тренируйтесь с использованием SVR из Scikit-learn

Вот код, использующий фрейм данных pandas, заполненный случайными значениями

import pandas as pd
import numpy as np
df = pd.DataFrame(np.random.rand(20,5), columns=["A","B","C","D", "E"])
a = list(df.columns.values)
a.remove("A")

X = df[a]
y = df["A"]

X_train = X.iloc[0: floor(2 * len(X) /3)]
X_test = X.iloc[floor(2 * len(X) /3):]
y_train = y.iloc[0: floor(2 * len(y) /3)]
y_test = y.iloc[floor(2 * len(y) /3):]

# normalise

from sklearn import preprocessing

X_trainS = preprocessing.scale(X_train)
X_trainN = pd.DataFrame(X_trainS, columns=a)

X_testS = preprocessing.scale(X_test)
X_testN = pd.DataFrame(X_testS, columns=a)

y_trainS = preprocessing.scale(y_train)
y_trainN = pd.DataFrame(y_trainS)

y_testS = preprocessing.scale(y_test)
y_testN = pd.DataFrame(y_testS)

import sklearn
from sklearn.svm import SVR

clf = SVR(kernel='rbf', C=1e3, gamma=0.1)

pred = clf.fit(X_trainN,y_trainN).predict(X_testN)

Выдает такую ошибку:

C:Anaconda3libsite-packagespandascoreindex.py:542: FutureWarning: индексаторы среза при использовании iloc должны быть целыми числами и не с плавающей точкой " и не плавающая точка", FutureWarning) --------------------------------------------------------------------------- ValueError Traceback (последний вызов последний) в () 34 clf = SVR (ядро= 'rbf', C=1e3, гамма=0.1) Тридцать пять --- >36 пред = clf.посадка(X_trainN,y_trainN).прогнозирования(X_testN) 37

C:Anaconda3libsite-packagessklearnsvmbase.py in fit (self, X, y, вес образца) Сто семьдесят четыре 175 семя = рнд.рандинт(НП.iinfo ("я").максимум) -- >176 fit(X, y, sample_weight, solver_type, kernel, random_seed=seed) 177 # см. комментарий к другому вызову np.iinfo в этом файле 178

C:Anaconda3libsite-packagessklearnsvmbase.py in _dense_fit (self, Х, Y, sample_weight, solver_type, ядра, random_seed) 229 cache_size=self.cache_size, coef0=self.coef0, 230 гамма=самость._гамма, Эпсилон=самость.Ипсилон, --> 231 max_iter=собственн.max_iter, random_seed=random_seed) Двести тридцать два 233 самостоятельно._warn_from_fit_status ()

C:Anaconda3libsite-packagessklearnsvmlibsvm.PYD в sklearn.СВМ.libsvm.fit (sklearnsvmlibsvm.c: 1864) ()

ValueError: буфер имеет неправильное число измерений (ожидается 1, получено 2)

Я не уверен, почему. Кто-нибудь может объяснить? Я думаю, что это как-то связано с преобразованием обратно в фреймы данных после предварительной обработки.

1 3

1 ответ:

Ошибка здесь в df, который вы передаете как ваши метки: y_trainN

Если сравнить с версиейsample docs и вашим кодом:

In [40]:

n_samples, n_features = 10, 5
np.random.seed(0)
y = np.random.randn(n_samples)
print(y)
y_trainN.values
[ 1.76405235  0.40015721  0.97873798  2.2408932   1.86755799 -0.97727788
  0.95008842 -0.15135721 -0.10321885  0.4105985 ]
Out[40]:
array([[-0.06680594],
       [ 0.23535043],
       [-1.49265082],
       [ 1.22537862],
       [-0.46499134],
       [-0.23744759],
       [ 1.40520679],
       [ 0.95882677],
       [ 1.66996413],
       [-0.37515955],
       [-0.75826444],
       [-1.45945337],
       [-0.63995369]])
Таким образом, вы можете либо вызвать squeeze для получения ряда, либо выбрать единственный столбец в df, чтобы не было ошибок:
pred = clf.fit(X_trainN,y_trainN[0]).predict(X_testN)

Или

pred = clf.fit(X_trainN,y_trainN.squeeze()).predict(X_testN)

Таким образом, мы можем утверждать, что для df только с одним столбцом он должен возвращать что-то, что затем может быть принудительно введено в массив numpy, или что numpy не вызывает массив атрибут правильно, но на самом деле вы должны передать ряд или выбрать столбец из df как params