Я столкнулся со странной и необычной проблемой в моей модели SVM с перекрестной проверкой. Я знаю тот факт, что для сильно несбалансированного набора данных нужно выполнять передискретизацию или недостаточную выборку, или другое решение на основе ядра, которое требует чувствительных к стоимости методов. Но в моей модели я не реализовал выборку или чувствительную к затратам технику. Я использовал только стандартный SVM, что означает, что затраты на неправильную классификацию одинаковы как для большинства, так и для меньшинства. Хотя мой набор данных сильно разбалансирован (соотношение ~ 55: 1), у меня выше M CC, точность, специфичность, чувствительность и AU C. Вот мои данные набора данных.
- Размер набора данных: 6394
- 115 положительных экземпляров
- 6279 отрицательных экземпляров
Если кто-нибудь объяснит Я буду очень признателен за факт или покажу мне какую-либо проблему с моим кодом, которая может вызвать проблему перегрузки. Я прилагаю свой код и производительность, оцененную 5-кратной перекрестной проверкой (повторяется 5 раз) с показателями производительности sklearn.
import numpy as np
import pandas as pd
from sklearn.svm import SVC
from sklearn.model_selection import RepeatedKFold
import sklearn.metrics
from sklearn.metrics import matthews_corrcoef
from sklearn.metrics import accuracy_score
feature_name="ABC.csv"
path="C:\\X\\Y\\"
dataset = pd.read_csv(path+feature_name, header = None)
X_train = dataset.iloc[:, :].values
y = []
for i in range(115):
y.append(1);
for i in range(6279):
y.append(-1);
y = np.array(y, dtype=np.int64)
y_train = y
g = 1/X_train.shape[1]
classifier = SVC(C=1, kernel = 'rbf', gamma=g, cache_size=500, random_state = 0)
rkf = RepeatedKFold(n_splits=5, n_repeats=5, random_state=0)
performance = pd.DataFrame(columns=['acc','mcc','precision','sp','sn', 'auc'])
results = []
averages = []
i = 1
for_acc = []
for_mcc = []
for_prec = []
for_sp = []
for_sn = []
for_auc = []
best_p=[]
for train_index, test_index in rkf.split(X_train):
X_train_split, X_test_split = X_train[train_index], X_train[test_index]
y_train_split, y_test_split = y_train[train_index], y_train[test_index]
classifier.fit(X_train_split, y_train_split)
y_pred = classifier.predict(X_test_split)
acc = accuracy_score(y_true = y_test_split, y_pred = y_pred)
mcc = matthews_corrcoef(y_true = y_test_split, y_pred = y_pred, sample_weight=None)
precision = sklearn.metrics.precision_score(y_true = y_test_split, y_pred = y_pred)
sp = sklearn.metrics.recall_score(y_true = y_test_split, y_pred = y_pred, pos_label = -1)
sn = sklearn.metrics.recall_score(y_true = y_test_split, y_pred = y_pred, pos_label = 1)
auc = sklearn.metrics.roc_auc_score(y_true = y_test_split, y_score = y_pred)
curr_res = []
curr_res.append(acc)
curr_res.append(mcc)
curr_res.append(precision)
curr_res.append(sp)
curr_res.append(sn)
curr_res.append(auc)
for_acc.append(acc)
for_mcc.append(mcc)
for_prec.append(precision)
for_sp.append(sp)
for_sn.append(sn)
for_auc.append(auc)
curr_avg = []
if i % 5 == 0:
curr_avg.append(sum(for_acc)/len(for_acc))
curr_avg.append(sum(for_mcc)/len(for_mcc))
curr_avg.append(sum(for_prec)/len(for_prec))
curr_avg.append(sum(for_sp)/len(for_sp))
curr_avg.append(sum(for_sn)/len(for_sn))
curr_avg.append(sum(for_auc)/len(for_auc))
averages.append(curr_avg)
for_acc = []
for_mcc = []
for_prec = []
for_sp = []
for_sn = []
for_auc = []
results.append(curr_res)
print(i)
i+=1
print(averages)
import csv
averages.insert(0, ["Accuracy", "MCC", "precision","sp","sn","auc"])
result_path='C:\\X\\Y\\performance\\'
with open(result_path+'standard_svm.csv', 'w', newline="") as myfile2:
wr = csv.writer(myfile2)
wr.writerows(averages)
Производительность:
Accuracy MCC precision sp sn auc
0.9971 0.9124 0.9833 0.9996 0.8546 0.9271
0.9970 0.9122 0.9738 0.9995 0.8590 0.9292
0.9970 0.9066 0.9770 0.9996 0.8456 0.9226
0.9968 0.9011 0.9637 0.9995 0.8459 0.9227
0.9971 0.9228 0.9828 0.9996 0.8699 0.9348