Повышение точности SVM с линейным ядром

Я использую машины опорных векторов (SVM) с «линейным» ядром для мультиклассификации. Однако точность очень низкая. Можно ли повысить точность?

import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score,classification_report,confusion_matrix
from sklearn.svm import SVC

#Prepare data for SVM
Diabetes_SVM = Diabetes2[['metformin','repaglinide','nateglinide','chlorpropamide','glimepiride','acetohexamide', 'glipizide', 'glyburide','troglitazone', 'tolazamide', 'examide','citoglipton', 'insulin']]

#Create dummy variables
nominal = ['metformin','repaglinide','nateglinide','chlorpropamide','glimepiride','acetohexamide', 'glipizide', 'glyburide', 
           'tolbutamide', 'pioglitazone', 'rosiglitazone', 'acarbose', 'miglitol', 'troglitazone', 'tolazamide', 'examide',
           'citoglipton']
Diabetes_SVM = pd.get_dummies(Diabetes_SVM,columns=nominal)

#Map data for SVM
Diabetes_SVM['insulin']=Diabetes_SVM['insulin'].map({'Down': 1,'No': 2,
                                                     'Steady': 3,'Up': 4})

#Defining features and target variable for SVM
X_SVM = Diabetes_SVM.drop('insulin', axis=1).values
y_SVM = Diabetes_SVM['insulin'].values

#Split dataset into training set and test set for SVM
X_train, X_test, y_train, y_test = train_test_split(X_SVM, y_SVM, test_size=0.30, random_state=42)

#Fit SVC Class
svclassifier = SVC(kernel='linear')
svclassifier.fit(X_train, y_train)

#Making Predictions
y_pred = svclassifier.predict(X_test)
print(confusion_matrix(y_test,y_pred))
print(classification_report(y_test,y_pred))

Я уже пробовал SVM с линейным классификатором с точностью всего 0,47. Как я могу настроить точность?


person Nith    schedule 21.01.2021    source источник
comment
насколько велик тренировочный набор? он несбалансирован?   -  person Epimetheus    schedule 21.01.2021
comment
svclassifier = SVC (ядро = 'линейный'). вы используете линейное ядро.   -  person Epimetheus    schedule 21.01.2021
comment
обучающая выборка составляет около 68637 записей. Я пытаюсь это проверить.   -  person Nith    schedule 21.01.2021


Ответы (1)


попробуйте SVC (kernel = 'poly') и нормализуйте свои данные. Сравните свои результаты с классификатором LogisticRegression (). Используйте лучший классификатор для ваших данных. Проверьте свои данные, чтобы убедиться, что они нелинейны. Используйте pytorch, keras или GLM, если данные нелинейны.

 from sklearn.preprocessing import StandardScaler

 X=df[NUMERIC]
 y=df['Target']

 X_train,X_test,y_train, y_test=train_test_split(X,y,test_size=0.1,random_state=42)

 scaler = MinMaxScaler()
 X_train[X_train.columns] = scaler.fit_transform(X_train[X_train.columns])
 X_test[X_test.columns] = scaler.transform(X_test[X_test.columns])

 model=SVC(kernel='poly', degree=3,C=1E10)
 model.fit(X_train,y_train)
 y_pred=model.predict(X_test)
 print("Accuracy:",metrics.accuracy_score(y_test, y_pred))
person Golden Lion    schedule 09.03.2021
comment
увидеть повышение точности для моей машины векторов поддержки (методы stackoverflow.com/questions/39001936/) автор предлагает использовать BaggingClassifier и ансамблевой подход для повышения точности - person Golden Lion; 09.03.2021
comment
проводите тестирование на аномалии и ищите выбросы в своих данных. у вас есть кластер k-средних, чтобы увидеть, какие группировки существуют в ваших данных. Обычно, когда ваш счет низкий, данные плохие. - person Golden Lion; 09.03.2021
comment
Увеличьте C до большого числа для сходимости - person Golden Lion; 10.03.2021
comment
Посмотрите замену svm на pytorch. Я могу показать тебе как - person Golden Lion; 10.03.2021