Openstack DevOps and IBM/Informix Certified DBA . Phd in Math (Duality of spaces of... · 21 янв 2022
Ансамбль голосования можно считать метамоделью, моделью моделей.
В качестве метамодели ее можно использовать с любой коллекцией существующих обученных моделей машинного обучения, и существующие модели не должны знать, что они используются в ансамбле. Это означает, что вы можете исследовать использование ансамбля голосования на любом наборе или подмножестве подходящих моделей для своей задачи прогнозного моделирования.
Ансамбль голосования подходит, когда у вас есть две или более модели, которые хорошо работают в задаче прогнозного моделирования. Модели, используемые в ансамбле, должны в основном согласовываться с их предсказаниями.
========================
Используйте ансамбли для голосования, когда:
Все модели в ансамбле имеют в целом одинаково хорошие характеристики. Все модели в ансамбле в основном уже согласны.
Жесткое голосование уместно, когда модели, используемые в ансамбле голосования, предсказывают четкие метки классов.
========================
Мягкое голосование уместно, когда модели, используемые в ансамбле голосования, предсказывают вероятность принадлежности к классу. Мягкое голосование можно использовать для моделей, которые изначально не предсказывают вероятность принадлежности к классу, хотя может потребоваться калибровка их вероятностных оценок перед использованием в ансамбле (например, машина опорных векторов, k-ближайших соседей и деревья решений).
========================
Жесткое голосование предназначено для моделей, которые предсказывают метки классов.
========================
Мягкое голосование предназначено для моделей, которые предсказывают вероятности членства в классе.
========================
Не гарантируется, что ансамбль для голосования обеспечит лучшую производительность, чем любая отдельная модель, используемая в ансамбле. Если какая-либо данная модель, используемая в ансамбле, работает лучше, чем ансамбль с голосованием, эту модель, вероятно, следует использовать вместо ансамбля с голосованием.
=======================
Это не всегда так. Ансамбль голосования может предложить меньшую дисперсию прогнозов, сделанных по отдельным моделям. Это можно увидеть в более низкой дисперсии ошибки прогнозирования для задач регрессии. Это также можно увидеть в более низкой дисперсии точности для задач классификации. Эта более низкая дисперсия может привести к более низкой средней производительности ансамбля, что может быть желательно, учитывая более высокую стабильность или достоверность модели.
Используйте ансамбль для голосования, если:
Это приводит к лучшей производительности, чем любая модель, используемая в ансамбле.
Это приводит к более низкой дисперсии, чем любая модель, используемая в ансамбле.
======================
Ансамбль голосования особенно полезен для моделей машинного обучения, которые используют алгоритм стохастического обучения и приводят к получению другой конечной модели каждый раз, когда она обучается на одном и том же наборе данных. Одним из примеров являются нейронные сети, которые подходят с использованием стохастического градиентного спуска.
=======================
Ансамбль жесткого голосования для классификации
Мы можем продемонстрировать жесткое голосование с помощью алгоритма k-ближайших соседей. Мы можем подобрать пять разных версий алгоритма KNN, каждая из которых имеет разное количество соседей, используемых при прогнозировании. Мы будем использовать 1, 3, 5, 7 и 9 соседей (нечетные числа, чтобы избежать ничьи).
Мы ожидаем, что путем объединения предсказанных меток классов, предсказанных каждой отдельной моделью KNN, ансамбль с жестким голосованием в среднем достигнет лучших прогнозирующих характеристик, чем любая автономная модель, используемая в ансамбле.Мы видим, что ансамбль жесткого голосования обеспечивает лучшую точность классификации около 90,2% по сравнению со всеми автономными версиями модели.
# compare hard voting to standalone classifiers
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import VotingClassifier
from matplotlib import pyplot
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=2)
return X, y
# get a voting ensemble of models
def get_voting():
# define the base models
models = list()
models.append(('knn1', KNeighborsClassifier(n_neighbors=1)))
models.append(('knn3', KNeighborsClassifier(n_neighbors=3)))
models.append(('knn5', KNeighborsClassifier(n_neighbors=5)))
models.append(('knn7', KNeighborsClassifier(n_neighbors=7)))
models.append(('knn9', KNeighborsClassifier(n_neighbors=9)))
# define the voting ensemble
ensemble = VotingClassifier(estimators=models, voting='hard')
return ensemble
# get a list of models to evaluate
def get_models():
models = dict()
models['knn1'] = KNeighborsClassifier(n_neighbors=1)
models['knn3'] = KNeighborsClassifier(n_neighbors=3)
models['knn5'] = KNeighborsClassifier(n_neighbors=5)
models['knn7'] = KNeighborsClassifier(n_neighbors=7)
models['knn9'] = KNeighborsClassifier(n_neighbors=9)
models['hard_voting'] = get_voting()
return models
# evaluate a give model using cross-validation
def evaluate_model(model, X, y):
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
return scores
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
scores = evaluate_model(model, X, y)
results.append(scores)
names.append(name)
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
[[pyplot.show](http://pyplot.show)]([http://pyplot.show](http://pyplot.show))()
Если мы выберем ансамбль жесткого голосования в качестве нашей окончательной модели, мы сможем подобрать и использовать его для прогнозирования новых данных, как и любую другую модель.
Во-первых, ансамбль жесткого голосования подходит ко всем доступным данным, затем можно вызвать функцию прогнозирования (), чтобы сделать прогнозы по новым данным.
Пример ниже демонстрирует это на нашем наборе данных бинарной классификации.
# make a prediction with a hard voting ensemble
from sklearn.datasets import make_classification
from sklearn.ensemble import VotingClassifier
from sklearn.neighbors import KNeighborsClassifier
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=2)
# define the base models
models = list()
models.append(('knn1', KNeighborsClassifier(n_neighbors=1)))
models.append(('knn3', KNeighborsClassifier(n_neighbors=3)))
models.append(('knn5', KNeighborsClassifier(n_neighbors=5)))
models.append(('knn7', KNeighborsClassifier(n_neighbors=7)))
models.append(('knn9', KNeighborsClassifier(n_neighbors=9)))
# define the hard voting ensemble
ensemble = VotingClassifier(estimators=models, voting='hard')
# fit the model on all available data
[[ensemble.fit](http://ensemble.fit)]([http://ensemble.fit](http://ensemble.fit))(X, y)
# make a prediction for one example
data = [[5.88891819,2.64867662,-0.42728226,-1.24988856,-0.00822,-3.57895574,2.87938412,-1.55614691,-0.38168784,7.50285659,-1.16710354,-5.02492712,-0.46196105,-0.64539455,-1.71297469,0.25987852,-0.193401,-5.52022952,0.0364453,-1.960039]]
yhat = ensemble.predict(data)
print('Predicted Class: %d' % (yhat))
Мы можем продемонстрировать мягкое голосование с помощью алгоритма машины опорных векторов (SVM).
Алгоритм SVM изначально не предсказывает вероятности, хотя его можно настроить для предсказания вероятностных оценок, установив для аргумента «вероятность» значение «Истина» в классе SVC.
Мы можем подобрать пять различных версий алгоритма SVM с полиномиальным ядром, каждая из которых имеет разную полиномиальную степень, заданную с помощью аргумента «степень». Мы будем использовать степени 1-5. Мы ожидаем, что путем объединения предсказанных оценок вероятности членства в классе, предсказанных каждой отдельной моделью SVM, ансамбль мягкого голосования в среднем достигнет лучших прогнозирующих характеристик, чем любая автономная модель, используемая в ансамбле.
# compare soft voting ensemble to standalone classifiers
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from matplotlib import pyplot
# get the dataset
def get_dataset():
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=2)
return X, y
# get a voting ensemble of models
def get_voting():
# define the base models
models = list()
models.append(('svm1', SVC(probability=True, kernel='poly', degree=1)))
models.append(('svm2', SVC(probability=True, kernel='poly', degree=2)))
models.append(('svm3', SVC(probability=True, kernel='poly', degree=3)))
models.append(('svm4', SVC(probability=True, kernel='poly', degree=4)))
models.append(('svm5', SVC(probability=True, kernel='poly', degree=5)))
# define the voting ensemble
ensemble = VotingClassifier(estimators=models, voting='soft')
return ensemble
# get a list of models to evaluate
def get_models():
models = dict()
models['svm1'] = SVC(probability=True, kernel='poly', degree=1)
models['svm2'] = SVC(probability=True, kernel='poly', degree=2)
models['svm3'] = SVC(probability=True, kernel='poly', degree=3)
models['svm4'] = SVC(probability=True, kernel='poly', degree=4)
models['svm5'] = SVC(probability=True, kernel='poly', degree=5)
models['soft_voting'] = get_voting()
return models
# evaluate a give model using cross-validation
def evaluate_model(model, X, y):
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1, error_score='raise')
return scores
# define dataset
X, y = get_dataset()
# get the models to evaluate
models = get_models()
# evaluate the models and store results
results, names = list(), list()
for name, model in models.items():
scores = evaluate_model(model, X, y)
results.append(scores)
names.append(name)
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# plot model performance for comparison
pyplot.boxplot(results, labels=names, showmeans=True)
[[pyplot.show](http://pyplot.show)]([http://pyplot.show](http://pyplot.show))()
Если мы выберем ансамбль мягкого голосования в качестве нашей окончательной модели, мы сможем подобрать и использовать его для прогнозирования новых данных, как и любую другую модель.
Во-первых, ансамбль мягкого голосования подгоняется ко всем доступным данным, затем можно вызвать функцию предсказать(), чтобы сделать прогнозы по новым данным.
Пример ниже демонстрирует это на нашем наборе данных бинарной классификации.
# make a prediction with a soft voting ensemble
from sklearn.datasets import make_classification
from sklearn.ensemble import VotingClassifier
from sklearn.svm import SVC
# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=2)
# define the base models
models = list()
models.append(('svm1', SVC(probability=True, kernel='poly', degree=1)))
models.append(('svm2', SVC(probability=True, kernel='poly', degree=2)))
models.append(('svm3', SVC(probability=True, kernel='poly', degree=3)))
models.append(('svm4', SVC(probability=True, kernel='poly', degree=4)))
models.append(('svm5', SVC(probability=True, kernel='poly', degree=5)))
# define the soft voting ensemble
ensemble = VotingClassifier(estimators=models, voting='soft')
# fit the model on all available data
[[ensemble.fit](http://ensemble.fit)]([http://ensemble.fit](http://ensemble.fit))(X, y)
# make a prediction for one example
data = [[5.88891819,2.64867662,-0.42728226,-1.24988856,-0.00822,-3.57895574,2.87938412,-1.55614691,-0.38168784,7.50285659,-1.16710354,-5.02492712,-0.46196105,-0.64539455,-1.71297469,0.25987852,-0.193401,-5.52022952,0.0364453,-1.960039]]
yhat = ensemble.predict(data)
print('Predicted Class: %d' % (yhat))