在现实生活中,很多问题并非“非黑即白”的问题,而是可以分为多个不同的类别,这些问题可以视为多分类学习任务。
多分类学习任务可以基于二分类算法进行推广后解决。有些二分类算法可以直接推广用于解决多分类问题,但是在更多情形下需要基于一些基本策略来对二分类算法进行处理从而更有效的解决多分类问题。
最经典和最基础的拆分策略包括两种:“一对一”(One vs. One,简称OvO)和“一对其余”(“One vs. Rest”,简称OvR)。本实训项目主要介绍这两类多分类处理策
OvO多分类策略
import numpy as np
# 逻辑回归
class tiny_logistic_regression(object):
def __init__(self):
#W
self.coef_ = None
#b
self.intercept_ = None
#所有的W和b
self._theta = None
#01到标签的映射
self.label_map = {
}
def _sigmoid(self, x):
return 1. / (1. + np.exp(-x))
#训练
def fit(self, train_datas, train_labels, learning_rate=1e-4, n_iters=1e3):
#loss
def J(theta, X_b, y):
y_hat = self._sigmoid(X_b.dot(theta))
try:
return -np.sum(y*np.log(y_hat)+(1-y)*np.log(1-y_hat)) / len(y)
except:
return float('inf')
# 算theta对loss的偏导
def dJ(theta, X_b, y):
return X_b.T.dot(self._sigmoid(X_b.dot(theta)) - y) / len(y)
# 批量梯度下降
def gradient_descent(X_b, y, initial_theta, leraning_rate, n_iters=1e2, epsilon=1e-6):
theta = initial_theta
cur_iter = 0
while cur_iter < n_iters:
gradient = dJ(theta, X_b, y)
last_theta = theta
theta = theta - leraning_rate * gradient
if (abs(J(theta, X_b, y) - J(last_theta, X_b, y)) < epsilon):
break
cur_iter += 1
return theta
unique_labels = list(set(train_labels))
labels = train_labels.copy()
self.label_map[0] = unique_labels[