sckit-научиться приспосабливать() приводит к ошибке после нормализации данных
Я пытался это сделать:
- Создание X объектов и y зависимых от набора данных
- разбить набор данных
- нормализовать данные
- тренируйтесь с использованием 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 ответ:
Ошибка здесь в 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