【问题标题】:Increase accuracy for SVM with linear kernel使用线性内核提高 SVM 的准确性
【发布时间】:2021-04-25 10:49:35
【问题描述】:

我正在使用带有“线性”内核的支持向量机 (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。如何调整精度?

【问题讨论】:

  • 训练集有多大?不平衡吗?
  • svclassifier = SVC(kernel='linear') 。您正在使用线性内核。
  • 训练集大约有 68637 条记录。我试着检查一下。

标签: python machine-learning scikit-learn svm


【解决方案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))

【讨论】:

  • 查看提高我的支持向量机的准确性 (stackoverflow.com/questions/39001936/…) 作者建议使用 BaggingClassifier 和集成方法来提高准确性
  • 进行异常测试并查找数据中的异常值。您是否使用 k-means 聚类来查看数据中存在哪些分组。通常,当您的分数较低时,数据就很差。
  • 将 C 增大到一个大数以实现收敛
  • 看看用 pytorch 替换 svm。我可以告诉你如何
猜你喜欢
  • 2014-08-05
  • 1970-01-01
  • 2018-10-20
  • 1970-01-01
  • 2017-11-20
  • 2012-09-28
  • 2014-11-28
  • 1970-01-01
  • 2017-11-16
相关资源
最近更新 更多