Проверка SVM: ValueError: Количество классов должно быть больше одного;получил 1 класс - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь создать новый алгоритм валидации для оценки производительности классификаторов.Но с тех пор я наткнулся на стену, по которой не могу подняться самостоятельно.Каждый раз, когда я пытаюсь выполнить оценку на 2 помеченных данных, как это

> ([[0.517, 0.118 | C2], [0.422, 0.745 | C2], [0.504, 0.422 | C2],
> [0.377, 0.520 | C2], [0.286, 0.636 | C1], [0.500, 0.066 | C2], [0.437,
> 0.639 | C2], [0.478, 0.138 | C2], [0.299, 0.140 | C1], [0.293, 0.275 | C1], [0.470, 0.246 | C2], [0.335, 0.405 | C1], [0.229, 0.563 | C1],
> [0.347, 0.295 | C1], [0.470, 0.176 | C2], [0.309, 0.069 | C1]])

Эта ошибка происходит SVM сбой с ошибкой: ValueError: Количество классов должно быть больше одного;получил 1 класс.

В связи с тем, что он рассчитывает, когда предоставляется достаточно данных (до 100 точек данных), мой профессор предложил мне отсортировать данные поочередно (C1, C2, C1,C2 ...).Но я думаю, что проблема скорее в потере ярлыка.Я напечатал np.unique этикетки self.data, X (trainset) и Y (testset) и получил для всех одинаковые (только с другими и намного больше поплавков):

E.g for X
[0.         0.17289992 0.20676427 0.24686935 0.47190027 0.48798112
 0.62406178 0.63207783 0.65526534 1.        ]

Я действительно не знаю, что с этим делать.Прошу прощения за мои плохие навыки кодирования, я психолог, а не кодер.

Это мой код

class IndependentValidation(Results):
"""
Independent Validation Testing
split data into test_data, train_data.
split test_data in n_splits = number of observations
---Loop---
for each n_split_test_data do:
train on train_data
predict and test on 1 observation = (1_split_test_data)
add used 1_split_test_data to train_data
(re)move used 1_split_test_data from test_data
do until test_data=0 / while test_data!=0   
Structure e.g = Leave One Out
"""
score_by_folds = False

def __init__(self, data, learners, store_data=False, store_models=False, preprocessor=None,
            callback=None, n_jobs=1, train_size=None, test_size=0.8, random_state=42):

    self.train_size = train_size
    self.test_size = test_size
    self.random_state = random_state

    super().__init__(data, learners=learners, store_data=store_data, store_models=store_models,
                     preprocessor=preprocessor, callback=callback, n_jobs=n_jobs)

def setup_indices(self, train_data, test_data):
    X, Y = skl.train_test_split(self.data, test_size=0.8, random_state=42, shuffle = True)
    train_data = np.array(range(_num_samples(X)))
    test_data = np.array(range(len(train_data), _num_samples(Y)))
    StratArr = []
    lngth = len(test_data)
    while lngth != 1:
        x, test_data = test_data[+0] , test_data[::-1]
        y, test_data = test_data[+0], test_data[:-1]
        z, test_data = test_data[+0], test_data[::-1]
        x = np.array([x])
        StratArr.insert(len(StratArr), ((train_data), (x)))
        train_data = np.concatenate((train_data,x), axis= 0)
        lngth = lngth - 1
    StratArr.insert(len(StratArr), ((train_data), (test_data)))
    self.indices = StratArr

def prepare_arrays(self, StratArr):
    # sped up version of super().prepare_arrays(data)
    self.row_indices = np.arange(len(StratArr))
    self.folds = self.row_indices
    self.actual = StratArr.Y.flatten()
...