Нормально ли для класса в многоклассовой SVM иметь почти все точки данных в качестве опорных векторов (scikit-learn)?Python

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Нормально ли для класса в многоклассовой SVM иметь почти все точки данных в качестве опорных векторов (scikit-learn)?

Сообщение Anonymous »

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

Код: Выделить всё

import pandas as pd
import numpy as np
from sklearn.svm import SVC
from sklearn.multiclass import OneVsRestClassifier

# Read the Excel file
df = pd.read_excel("Classification iris.xlsx", index_col="instance_id")

# Split the data into training and test data
train_data = pd.concat([
df.loc[1:35],
df.loc[51:85],
df.loc[101:135]
])

test_data = pd.concat([
df.loc[36:50],
df.loc[86:100],
df.loc[136:150]
])

# Seperate the features and target variables
train_features = train_data.drop(columns=['class'])
train_target = train_data['class']
test_features = test_data.drop(columns=['class'])
test_target = test_data['class']

# Build the Support Vector Machine with One-vs-Rest strategy
svm = OneVsRestClassifier(SVC(kernel='linear', C=1e5))
svm.fit(train_features, train_target)

# Make predictions
targets_train_pred = svm.predict(train_features)
targets_test_pred = svm.predict(test_features)

# Calculate total errors
total_training_error =  sum(targets_train_pred != train_target) / len(train_data)
total_testing_error = sum(targets_test_pred != test_target) / len(test_data)

# Print the total training and testing errors
print(f"Q2.2.2 Calculation using Standard SVM Model:\ntotal training error: {total_training_error:.10f}, total testing error: {total_testing_error:.10f}")

# Initialize lists to store results
classes = ['setosa', 'versicolor', 'virginica']
linear_separable = []

for i, class_name in enumerate(classes):
# Get the binary classifier for the current class
classifier = svm.estimators_[i]

# Calculate the errors for each class
train_class_error = sum((targets_train_pred == class_name) != (train_target == class_name)) / len(train_data)
test_class_error = sum((targets_test_pred == class_name) != (test_target == class_name)) / len(test_data)

# Get the weight vector w and bias b
w = classifier.coef_[0]
b = classifier.intercept_[0]
support_vector_indices = classifier.support_

# Print the results for each class in the proper format
print(f"\nclass {class_name}:")
print(f"training error: {train_class_error:.10f}, testing error: {test_class_error:.10f}")
print(f"w: [{', '.join([f'{x:.10f}' for x in w])}]")
print(f"b: {b:.10f}")
print(f"support vector indices: {support_vector_indices.tolist()}")

# Check if the class is linearly separable
if train_class_error == 0:
linear_separable.append(class_name)

print(f"\nLinear separable classes: {', '.join(linear_separable)}")
Это результат:

Код: Выделить всё

Q2.2.2 Calculation using Standard SVM Model:
total training error: 0.0571428571, total testing error: 0.0888888889

class setosa:
training error: 0.0000000000, testing error: 0.0000000000
w: [0.0097327108, 0.5377790363, -0.8273513712, -0.3820427629]
b: 0.7734548984
support vector indices: [42, 23, 24]

class versicolor:
training error: 0.0000000000, testing error: 0.0000000000
w: [1.8485997715, -4.5023738999, -1.1043393026, 0.3212849949]
b: 5.6773042297
support vector indices: [1, 2, 8, 9, 13, 25, 27, 34, 71, 72, 73, 77, 78, 80, 81, 86, 88, 89, 90, 91, 92, 93, 96, 99, 100, 102, 103, 104, 35, 36, 37, 39, 40, 41, 42, 43, 44, 46, 47, 48, 49, 50, 52, 55, 58, 59, 60, 61, 62, 63, 65, 66, 67, 68, 69]

class virginica:
training error: 0.0000000000, testing error: 0.0000000000
w: [-3.6465034341, -5.1763639697, 7.4285254512, 11.0024158268]
b: -17.5703922240
support vector indices: [55, 57, 62, 68, 96, 97, 99, 103]

Linear separable classes: setosa, versicolor, virginica
Поскольку существует всего 35 точек обучающих данных Versicolor, я не ожидал, что все они будут векторами поддержки, основываясь на моем теоретическом понимании SVM. Кроме того, наличие ошибки обучения для отдельных классов кажется мне немного странным.
Ваша помощь очень ценится!

Подробнее здесь: https://stackoverflow.com/questions/790 ... nts-as-sup
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»