Библиотека машинного обучения Python sklearn — мультикласс, мультиметка, мультивыход

машинное обучение Python

Руководство по разработке Full Stack Engineer (Автор: Luan Peng)

Серия руководств по интеллектуальному анализу данных Python

Мультиклассовая классификация: означает, что задача классификации должна классифицировать данные более чем двух классов. Например, классифицируйте серию изображений апельсинов, яблок или груш. Мультиклассовая классификация предполагает, что каждый образец имеет одну и только одну этикетку: фрукт может быть отнесен к яблоку или груше, но не к тому и другому одновременно.

Многоуровневая классификация: Назначьте серию меток каждому образцу. Это можно рассматривать как предсказание свойств точек данных, которые не являются взаимоисключающими, например темы, связанные с типами документов. Текст может быть отнесен к любой категории, например, он может быть связан с политикой, финансами, образованием одновременно или не принадлежать ни к одной из вышеперечисленных категорий.

Многовыходная регрессионная многовыходная классификация: Назначьте набор целевых значений для каждого образца. Это можно рассматривать как предсказание нескольких свойств каждой выборки, таких как направление и сила ветра в определенном месте.

Собственный многоклассовый классификатор:

  • sklearn.naive_bayes.BernoulliNB
  • sklearn.tree.DecisionTreeClassifier
  • sklearn.tree.ExtraTreeClassifier
  • sklearn.ensemble.ExtraTreesClassifier
  • sklearn.naive_bayes.GaussianNB
  • sklearn.neighbors.KNeighborsClassifier
  • sklearn.semi_supervised.LabelPropagation
  • sklearn.semi_supervised.LabelSpreading
  • sklearn.discriminant_analysis.LinearDiscriminantAnalysis
  • sklearn.svm.LinearSVC (настройка multi_class="crammer_singer")
  • sklearn.linear_model.LogisticRegression (настройка multi_class = «многочлен»)
  • sklearn.linear_model.LogisticRegressionCV (настройка multi_class = «многочлен»)
  • sklearn.neural_network.MLPClassifier
  • sklearn.neighbors.NearestCentroid
  • sklearn.discriminant_analysis.QuadraticDiscriminantAnalysis
  • sklearn.neighbors.RadiusNeighborsClassifier
  • sklearn.ensemble.RandomForestClassifier
  • sklearn.linear_model.RidgeClassifier
  • sklearn.linear_model.RidgeClassifierCV

Многоклассовый классификатор 1-к-1:

  • sklearn.svm.NuSVC
  • sklearn.svm.SVC.
  • sklearn.gaussian_process.GaussianProcessClassifier (настройка multi_class = «one_vs_one»)

Многоклассовый классификатор 1 ко многим:

  • sklearn.ensemble.GradientBoostingClassifier
  • sklearn.gaussian_process.GaussianProcessClassifier (настройка multi_class = «one_vs_rest»)
  • sklearn.svm.LinearSVC (настройка multi_class=”ovr”)
  • sklearn.linear_model.LogisticRegression (настройка multi_class=”ovr”)
  • sklearn.linear_model.LogisticRegressionCV (настройка multi_class=”ovr”)
  • sklearn.linear_model.SGDClassifier
  • sklearn.linear_model.Perceptron
  • sklearn.linear_model.PassiveAggressiveClassifier

Классификаторы, поддерживающие многоуровневую классификацию:

  • sklearn.tree.DecisionTreeClassifier
  • sklearn.tree.ExtraTreeClassifier
  • sklearn.ensemble.ExtraTreesClassifier
  • sklearn.neighbors.KNeighborsClassifier
  • sklearn.neural_network.MLPClassifier
  • sklearn.neighbors.RadiusNeighborsClassifier
  • sklearn.ensemble.RandomForestClassifier
  • sklearn.linear_model.RidgeClassifierCV

Классификаторы, поддерживающие классификацию с несколькими классами и несколькими выходами:

  • sklearn.tree.DecisionTreeClassifier
  • sklearn.tree.ExtraTreeClassifier
  • sklearn.ensemble.ExtraTreesClassifier
  • sklearn.neighbors.KNeighborsClassifier
  • sklearn.neighbors.RadiusNeighborsClassifier
  • sklearn.ensemble.RandomForestClassifier

преобразование формата

При многоуровневом обучении набор задач бинарной классификации представляется в виде двоичного массива: каждый образец представляет собой строку двоичных значений в двумерном массиве размера (n_samples, n_classes), таких как ненулевые элементы, представленные как подмножество соответствующей метки. Массив np.array([[1, 0, 0], [0, 1, 1], [0, 0, 0]]) означает, что первая выборка принадлежит 0-й метке, а вторая выборка принадлежит первой и вторая метка, третий образец не принадлежит никакой метке.

# 多标签分类格式。将多分类转换为二分类的格式,类似于one-hot编码
from sklearn.preprocessing import MultiLabelBinarizer
y = [[2, 3, 4], [2], [0, 1, 3], [0, 1, 2, 3, 4], [0, 1, 2]]
y_new = MultiLabelBinarizer().fit_transform(y)
print('新的输出格式:\n',y_new)

1 к остальным

Этот метод, также известный как «один ко многим», реализован в модуле OneVsRestClassifier.

# =========1对其余的多分类构造方式================
from sklearn import datasets
from sklearn.multiclass import OneVsRestClassifier
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = LinearSVC(random_state=0)  # 构建二分类器
clf = OneVsRestClassifier(clf)  # 根据二分类器构建多分类器
clf.fit(X, y)  # 训练模型
y_pred = clf.predict(X) # 预测样本
print('预测正确的个数:%d,预测错误的个数:%d' %((y==y_pred).sum(),(y!=y_pred).sum()))

1 к 1

Классификатор OneVsOneClassifier 1-к-1 создаст классификатор для каждой пары классов, и на этапе прогнозирования будет выбран класс, получивший наибольшее количество голосов. Когда есть узел (когда два класса имеют одинаковое количество голосов), классификатор 1-к-1 выберет класс с наивысшей общей достоверностью классификации, где общая достоверность классификации представляет собой попарную достоверность, рассчитанную нижним бинарным классификатором. Уровни накапливаются.

Поскольку для этого требуется обучение n_classes * (n_classes - 1)/2 классификаторов, этот метод обычно медленнее, чем один против остальных, из-за сложности O (n_classes ^ 2). Однако этот метод также имеет преимущества, например, в методах ядра, которые плохо масштабируют данные n_samples. Это связано с тем, что каждая отдельная задача обучения включает в себя лишь небольшую часть данных, в то время как «один против остальных» будет использовать полные данные n_classes раз.

# =========1对1的多分类构造方式================
from sklearn import datasets
from sklearn.multiclass import OneVsOneClassifier
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = LinearSVC(random_state=0)  # 构建二分类器
clf = OneVsOneClassifier(clf)  # 根据二分类器构建多分类器
clf.fit(X, y)  # 训练模型
y_pred = clf.predict(X) # 预测样本
print('预测正确的个数:%d,预测错误的个数:%d' %((y==y_pred).sum(),(y!=y_pred).sum()))

Выходной код исправления ошибок

Подход, основанный на выходном коде, отличается от подходов «один против остальных» и «один против одного». Используя эти методы, каждый класс будет отображаться в евклидовом пространстве, где значение каждого измерения может быть только 0 или 1. Другой способ объяснить это состоит в том, что каждый класс представлен как двоичный код (массив нулей и единиц). Матрица, которая содержит местоположение/код для каждого класса, называется кодовой книгой. Размер кодировки — это широта евклидова пространства, упомянутого ранее. Интуитивно понятно, что каждый класс должен использовать уникальную кодировку, а хорошая кодовая книга должна оптимизировать точность классификации. В реализации мы используем случайно сгенерированные кодовая книга

# =========误差校正输出代码================
from sklearn import datasets
from sklearn.multiclass import OutputCodeClassifier
from sklearn.svm import LinearSVC

iris = datasets.load_iris()
X, y = iris.data, iris.target
clf = LinearSVC(random_state=0)  # 构建二分类器
clf = OutputCodeClassifier(clf,code_size=2, random_state=0)  # 根据二分类器构建多分类器
clf.fit(X, y)  # 训练模型
y_pred = clf.predict(X) # 预测样本
print('预测正确的个数:%d,预测错误的个数:%d' %((y==y_pred).sum(),(y!=y_pred).sum()))

Множественная выходная регрессия

Поддержка нескольких выходных регрессоров MultiOutputRegressor может быть добавлен к любому регрессору. Эта стратегия состоит в подгонке регрессора к каждой цели. Поскольку каждая цель может быть точно представлена ​​регрессором, информация о цели может быть получена путем изучения соответствующего регрессора. Поскольку MultiOutputRegressor может обучать регрессор для каждой цели, он не может использовать информацию о корреляции между целями.

# =========多输出回归================
from sklearn.datasets import make_regression
from sklearn.multioutput import MultiOutputRegressor
from sklearn.ensemble import GradientBoostingRegressor
from sklearn import metrics
X, y = make_regression(n_samples=10, n_targets=3, random_state=1)  # 产生10个样本,每个样本100个属性,每个样本3个输出值
print('样本特征维度',X.shape)
print('样本输出维度',y.shape)
clf = GradientBoostingRegressor(random_state=0)
clf =MultiOutputRegressor(clf)
clf.fit(X, y)
y_pred = clf.predict(X) # 预测样本
print('均方误差:',metrics.mean_squared_error(y, y_pred))  # 均方误差

Многовыходная классификация

Поддержка классификации с несколькими выходами может быть добавлена ​​к любому классификатору с помощью флага MultiOutputClassifier.Этот метод обучает классификатор для каждой цели. Это позволяет создавать многокритериальные классификаторы переменных. Цель этого класса — расширить оценщик для оценки ряда целевых функций (f1,f2,f3…,fn), обученных на одной матрице предсказания для предсказания ряда ответов (y1,y2,y3...,yn ).

# =========多输出分类================
from sklearn.datasets import make_classification
from sklearn.multioutput import MultiOutputClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.utils import shuffle
import numpy as np
X, y1 = make_classification(n_samples=10, n_features=100, n_informative=30, n_classes=3, random_state=1) # 生成分类数据集,10个样本,100个特征,30个有效特征,3种分类
y2 = shuffle(y1, random_state=1)  # 分类结果随机排序
y3 = shuffle(y1, random_state=2)  # 分类结果随机排序
Y = np.vstack((y1, y2, y3)).T  # 多种分类结果组合成
print('多输出多分类器真实输出分类:\n',Y)
n_samples, n_features = X.shape # 10,100
n_outputs = Y.shape[1] # 3个输出
n_classes = 3 # 每种输出有3种分类
forest = RandomForestClassifier(n_estimators=100, random_state=1)  # 生成随机森林多分类器
multi_target_forest = MultiOutputClassifier(forest)  # 构建多输出多分类器
y_pred = multi_target_forest.fit(X, Y).predict(X)
print('多输出多分类器预测输出分类:\n',y_pred)