Метод подъема
Основная идея метода повышения состоит в том, чтобы объединить несколько классификаторов (слабых классификаторов) с очень общими эффектами для получения лучшего классификатора, что похоже на «три сапожника победили Чжугэ Ляна». Эффект обучения слабых учеников может быть лишь немного лучше, чем у случайных классификаторов, поэтому некоторые люди предлагают использовать набор слабых классификаторов для создания сильного классификатора.
Поскольку слабый классификатор повышается до сильного классификатора, он называется методом подъема.
AdaBoost
Существует множество алгоритмов повышения, наиболее типичным из которых является AdaBoost. AdaBoost - это аббревиатура адаптивного повышения, Основная идея состоит в том, чтобы увеличить вес образцов, которые были неправильно классифицированы слабой классификацией в предыдущем раунде, и в то же время уменьшить вес правильно классифицированных образцов, чтобы неправильные образцы могут привлечь больше внимания в следующем раунде. Кроме того, конечный классификатор AdaBoost представляет собой линейную комбинацию нескольких слабых классификаторов, а линейный коэффициент — это вес каждого слабого классификатора, наоборот, вес с большей частотой ошибок должен быть меньше.
Основные шаги AdaBoost
- набор образцов,.
- Инициализируйте вес для каждой выборки в наборе выборочных данных,,.
- Предположим, что всего имеется M классификаторов,.
- Обучите первый классификатор, используя данные набора обучающей выборки и его начальные веса..
- Рассчитайте частоту ошибок первого классификатора,.
- Рассчитайте вес, присвоенный первым классификатором, на основе частоты ошибок на предыдущем шаге,.
- Вес добавляется к неправильно классифицированному образцу первым классификатором, а вес правильного образца уменьшается.Формула обновления удельного веса:,в,Тот.
- Продолжайте обучать второй классификатор с новыми весами выборки., а затем вычислить частоту ошибок второго классификатораи веса, присвоенные вторым классификатором, и продолжайте обновлять веса, чтобы получить.
- Повторяйте вышеуказанные операции до тех пор, пока частота ошибок классификатора не станет равной 0 или не будет достигнуто заданное количество итераций.
- Взвешенное суммирование всех слабых классификаторов, т.е. линейная комбинация,, окончательный классификатор.
О слабых классификаторах
Не существует определенного стандарта для слабого классификатора adaboost.Пока классификатор, который может достичь классификации, может использоваться как слабый классификатор, общие могут быть следующими:
- логистическая регрессия
- простая нейронная сеть
- SVM
Слабые классификаторы adaboost должны быть одним и тем же классификатором и не могут использовать разные классификаторы.
О весах
В процессе adaboost задействованы два типа весов: один — это вес выборки, а другой — вес слабого классификатора. Вес выборки используется для обозначения веса каждой выборки.Отмеченная выборка имеет разное значение в обучении, и сумма всех весов ее выборок равна 1. Вес слабого классификатора используется для обозначения веса каждого классификатора Фактически это коэффициент линейной комбинации конечного классификатора, указывающий вклад каждого слабого классификатора в результат Сумма весов слабых классификаторов не обязательно 1. .
github
https://github.com/sea-boat/MachineLearning_Lab
demo
import numpy as np
def weak_model(data, Dt):
m = data.shape[0]
pred = []
pos = None
mark = None
min_err = np.inf
for j in range(m):
pred_temp = []
sub_mark = None
lsum = np.sum(data[:j, 1])
rsum = np.sum(data[j:, 1])
if lsum < rsum:
sub_mark = -1
pred_temp.extend([-1.] * (j))
pred_temp.extend([1.] * (m - j))
else:
sub_mark = 1
pred_temp.extend([1.] * (j))
pred_temp.extend([-1.] * (m - j))
err = np.sum(1 * (data[:, 1] != pred_temp) * Dt)
if err < min_err:
min_err = err
pos = (data[:, 0][j - 1] + data[:, 0][j]) / 2
mark = sub_mark
pred = pred_temp[:]
model = [pos, mark, min_err]
return model, pred
def adaboost(data):
models = []
N = data.shape[0]
D = np.zeros(N) + 1.0 / N
M = 3
y = data[:, -1]
for t in range(M):
Dt = D[:]
model, y_ = weak_model(data, Dt)
errt = model[-1]
alpha = 0.5 * np.log((1 - errt) / errt)
Zt = np.sum([Dt[i] * np.exp(-alpha * y[i] * y_[i]) for i in range(N)])
D = np.array([Dt[i] * np.exp(-alpha * y[i] * y_[i]) for i in range(N)]) / Zt
models.append([model, alpha])
return models
def predict(models, X):
pred = []
for x in X:
result = 0
for base in models:
alpha = base[1]
if x[0] > base[0][0]:
result -= base[0][1] * alpha
else:
result += base[0][1] * alpha
pred.append(np.sign(result))
return pred
if __name__ == "__main__":
data = np.array([[0, 1], [1, 1], [2, 1], [3, -1], [4, -1], [5, -1], [6, 1], [7, 1], [8, 1], [9, -1]],
dtype=np.float32)
models = adaboost(data)
X = data
Y = data[:, -1]
Y_ = predict(models, X)
acc = np.sum(1 * (Y == Y_)) / float(len(X))
print(acc)
------------- Рекомендуем прочитать ------------
Резюме моей статьи за 2017 год — машинное обучение
Краткое изложение моих статей за 2017 год — Java и промежуточное ПО
Резюме моих статей 2017 года — глубокое обучение
Краткое изложение моих статей за 2017 год — исходный код JDK
Резюме моей статьи за 2017 год — обработка естественного языка
Резюме моих статей 2017 года — Java Concurrency
------------------рекламное время----------------
Поговори со мной, задай мне вопросы:
Меню официальной учетной записи было разделено на «Распределенное», «Машинное обучение», «Глубокое обучение», «НЛП», «Глубина Java», «Ядро параллелизма Java», «Исходный код JDK», «Ядро Tomcat», и т.д. Там может быть один стиль, чтобы удовлетворить ваш аппетит.
Зачем писать «Анализ проектирования ядра Tomcat»
Добро пожаловать, чтобы следовать: