Binary Decomposition ordinal classification
import numpy as np
import pandas as pd
from copy import deepcopy
from collections import OrderedDict
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, f1_score
from sklearn.model_selection import StratifiedKFold
def BDOC(X, y, absLabeled, test_idx):
modelDict = OrderedDict()
trainIndex = OrderedDict()
trainTarget = OrderedDict()
labels = np.unique(y)
target = np.array([_ for _ in np.arange(labels[0],labels[-1],1)])
###----------------------------------
for tar in target:
modelDict[tar] = LogisticRegression(solver='newton-cg', penalty='l2')
trainIndex[tar] = deepcopy(absLabeled)
trainTarget[tar] = deepcopy(y[absLabeled])
for j in range(len(absLabeled)):
if trainTarget[tar][j] <= tar:
trainTarget[tar][j] = tar
else:
trainTarget[tar][j] = tar + 1
###----------------------------------
###---------------------------------
for tar, model in modelDict.items():
model.fit(X[trainIndex[tar]], trainTarget[tar])
probDict = OrderedDict()
for tar, model in modelDict.items():
probDict[tar] = model.predict_proba(X[test_idx])
y_pred = []
for j, idx in enumerate(test_idx):
prob = OrderedDict()
for ele in labels:
if ele == labels[0]:
prob[ele] = probDict[ele][j][0]
elif ele == labels[-1]:
prob[ele] = probDict[ele-1][j][1]
else:
prob[ele] = probDict[ele-1][j][1] - probDict[ele][j][1]
y_pred.append(max(prob,key=prob.get))
y_pred = np.array(y_pred)
Acc = accuracy_score(y[test_idx],y_pred)
return Acc
已验证!