Ожидается 2D-массив, вместо него 1D-массив. В чем ошибка? - PullRequest
0 голосов
/ 13 июля 2020

Я начинаю изучать SVM и PCA. Я пытался применить SVM к набору данных load_digits из Sci-Kit Learn.

Когда я применяю метод .fit на SV C, я получаю сообщение об ошибке:

"Ожидаемый 2D-массив, вместо него получен 1D-массив: array = [1.9142151 0.58897807 1.30203491 ... 1.02259477 1.07605691 -1.25769703]. Измените форму ваших данных, используя array.reshape (-1, 1), если ваши данные имеют одну функцию

или array.reshape (1, -1), если они содержат единственный образец. "

Вот код я написал: **

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
X_digits, y_digits = load_digits(return_X_y=True)
data = scale(X_digits)
pca=PCA(n_components=10).fit_transform(data)
reduced_data = PCA(n_components=2).fit_transform(data)
from sklearn.svm import SVC
clf = SVC(kernel='rbf', C=1E6)
X=[reduced_data[:,0]
y=reduced_data[:,1]
clf.fit(X, y)

Может ли кто-нибудь мне помочь? Заранее спасибо.

1 Ответ

0 голосов
/ 13 июля 2020

Ваша ошибка возникает из-за того, что clf.fit() требует, чтобы массив X имел размерность 2 (в настоящее время он одномерный), а при использовании X.reshape(-1, 1) X становится (N,1) (2D - как хотелось бы) массив, а не (N,) (1D), где N - количество выборок в наборе данных. Однако я также считаю, что ваша интерпретация reduced_data может быть неверной (из моего ограниченного опыта sklearn):

  • Имеющийся у вас массив reduced_data содержит два основных компонента (две наиболее важные функции в наборе данных, n_components=2), которые вы должны использовать в качестве новых «данных» (X).

  • Вместо этого вы взяли первый столбец reduced_data за образцы X, а второй столбец за целевые значения y. Насколько я понимаю, лучшим подходом было бы сделать X = reduced_data, поскольку образцы данных должны состоять как из функций PCA, так и сделать y = y_digits, поскольку метки (цели) не изменяются PCA.

(я также заметил, что вы определили pca = PCA(n_components=10).fit_transform(data), но не использовали go, поэтому я удалил его из кода в своем ответе).

В результате у вас будет что-то вроде этого:

from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from sklearn.preprocessing import scale
from sklearn.svm import SVC

X_digits, y_digits = load_digits(return_X_y=True)
data = scale(X_digits)
# pca=PCA(n_components=10).fit_transform(data)
reduced_data = PCA(n_components=2).fit_transform(data)

clf = SVC(kernel='rbf', C=1e6)
clf.fit(reduced_data, y_digits)

Надеюсь, это помогло!

...