ValueError: y should be a 1d array, got an array of shape () instead

Есть код который должен делать классификацию с помощью машин опорных векторов, но возникает 2 проблемы:

  1. Код ругается на то что нужно увеличить кол-во итераций, но когда увеличиваю ничего не меняется.
  2. Возникает ошибка на 78 строке, numpy ругается на то что не получил на вход не одномерный массив а кортеж, хотя на вход передаётся именно массив(список).
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import preprocessing
    from sklearn.svm import LinearSVC
    from sklearn.multiclass import OneVsOneClassifier
    from sklearn.model_selection import train_test_split, cross_val_score
    
    # Input file containing data
    input_file = 'income_data.txt'
    
    # Read the data
    X = []
    y = []
    count_class1 = 0
    count_class2 = 0
    max_datapoints = 25000
    
    with open(input_file, 'r') as f:
        for line in f.readlines():
            if count_class1 >= max_datapoints and count_class2 >= max_datapoints:
                break
    
            if '?' in line:
                continue
    
            data = line[:-1].split(', ')
    
            if data[-1] == '<=50K' and count_class1 < max_datapoints:
                X.append(data)
                count_class1 += 1
    
            if data[-1] == '>50K' and count_class2 < max_datapoints:
                X.append(data)
                count_class2 += 1
    
    # Convert to numpy array
    X = np.array(X)
    
    # Convert string data to numerical data
    label_encoder = []
    X_encoded = np.empty(X.shape)
    for i, item in enumerate(X[0]):
        if item.isdigit():
            X_encoded[:, i] = X[:, i]
        else:
            label_encoder.append(preprocessing.LabelEncoder())
            X_encoded[:, i] = label_encoder[-1].fit_transform(X[:, i])
    
    X = X_encoded[:, :-1].astype(int)
    y = X_encoded[:, -1].astype(int)
    
    # Create SVM classifier
    classifier = OneVsOneClassifier(LinearSVC(random_state=0))
    
    # Train the classifier
    classifier.fit(X, y)
    
    # Cross validation
    X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=5)
    classifier = OneVsOneClassifier(LinearSVC(random_state=0))
    classifier.fit(X_train, y_train)
    y_test_pred = classifier.predict(X_test)
    
    # Compute the F1 score of the SVM classifier
    f1 = cross_val_score(classifier, X, y, scoring='f1_weighted', cv=3)
    print("F1 score: " + str(round(100*f1.mean(), 2)) + "%")
    
    # Predict output for a test datapoint
    input_data = ['37', 'Private', '215646', 'HS-grad', '9', 'Never-married', 'Handlers-cleaners', 'Not-in-family', 'White', 'Male', '0', '0', '40', 'United-States']
    
    # Encode test datapoint
    input_data_encoded = [-1] * len(input_data)
    count = 0
    for i, item in enumerate(input_data):
        if item.isdigit():
            input_data_encoded[i] = int(input_data[i])
        else:
            input_data_encoded[i] = int(label_encoder[count].transform(input_data[i]))
        count += 1
    input_data_encoded = np.array(input_data_encoded)
    
    # Run classifier on encoded datapoint and print output
    predicted_class = classifier.predict(input_data_encoded)
    print(label_encoder[-1].inverse_transform(predicted_class)[0]) 

Ссылка на файл с тестовыми данными: https://drive.google.com/file/d/1ojUWNPpNeGPAwsER31bGgFO3GqkqxBMI/view?usp=sharing


Ответы (0 шт):