StackingCVClassifier: 交叉验证堆叠

一个集成学习元分类器,用于堆叠,通过交叉验证为第二层分类器准备输入,以防止过拟合。

from mlxtend.classifier import StackingCVClassifier

概述

堆叠是一种集成学习技术,通过元分类器组合多个分类模型。StackingCVClassifier 扩展了标准堆叠算法(实现为 StackingClassifier),使用交叉验证为第二层分类器准备输入数据。

在标准的堆叠过程中,第一层分类器拟合用于为第二层分类器准备输入的相同训练集,这可能导致过拟合。然而,StackingCVClassifier 使用了交叉验证的概念:数据集被分割成 k 个折叠,在 k 个连续的回合中,使用 k-1 个折叠来拟合第一层分类器;在每个回合中,然后将第一层分类器应用于在每次迭代中未用于模型拟合的剩余 1 个子集。然后将得到的预测堆叠起来并提供给第二层分类器作为输入数据。在 StackingCVClassifier 训练完成后,第一层分类器将拟合到整个数据集上,如下图所示。

更正式地,堆叠交叉验证算法可以概括如下(来源:[1])

参考文献

示例 1 - 简单交叉验证堆叠分类

from sklearn import datasets

iris = datasets.load_iris()
X, y = iris.data[:, 1:3], iris.target
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB 
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingCVClassifier
import numpy as np
import warnings

warnings.simplefilter('ignore')

RANDOM_SEED = 42

clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()

# Starting from v0.16.0, StackingCVRegressor supports
# `random_state` to get deterministic result.
sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],
                            meta_classifier=lr,
                            random_state=RANDOM_SEED)

print('3-fold cross validation:\n')

for clf, label in zip([clf1, clf2, clf3, sclf], 
                      ['KNN', 
                       'Random Forest', 
                       'Naive Bayes',
                       'StackingClassifier']):

    scores = model_selection.cross_val_score(clf, X, y, 
                                              cv=3, scoring='accuracy')
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" 
          % (scores.mean(), scores.std(), label))
3-fold cross validation:

Accuracy: 0.91 (+/- 0.01) [KNN]
Accuracy: 0.95 (+/- 0.01) [Random Forest]
Accuracy: 0.91 (+/- 0.02) [Naive Bayes]
Accuracy: 0.93 (+/- 0.02) [StackingClassifier]
import matplotlib.pyplot as plt
from mlxtend.plotting import plot_decision_regions
import matplotlib.gridspec as gridspec
import itertools

gs = gridspec.GridSpec(2, 2)

fig = plt.figure(figsize=(10,8))

for clf, lab, grd in zip([clf1, clf2, clf3, sclf], 
                         ['KNN', 
                          'Random Forest', 
                          'Naive Bayes',
                          'StackingCVClassifier'],
                          itertools.product([0, 1], repeat=2)):

    clf.fit(X, y)
    ax = plt.subplot(gs[grd[0], grd[1]])
    fig = plot_decision_regions(X=X, y=y, clf=clf)
    plt.title(lab)
plt.show()

png

示例 2 - 使用概率作为元特征

或者,可以通过设置 use_probas=True 使用第一层分类器的类别概率来训练元分类器(第二层分类器)。例如,在具有 2 个第一层分类器的 3 类设置中,这些分类器可能对 1 个训练样本做出以下“概率”预测

  • 分类器 1: [0.2, 0.5, 0.3]
  • 分类器 2: [0.3, 0.4, 0.4]

通过堆叠这些第一层概率,将产生 k 个特征,其中 k = [n_classes * n_classifiers]

  • [0.2, 0.5, 0.3, 0.3, 0.4, 0.4]
clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()
lr = LogisticRegression()

sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],
                            use_probas=True,
                            meta_classifier=lr,
                            random_state=42)

print('3-fold cross validation:\n')

for clf, label in zip([clf1, clf2, clf3, sclf], 
                      ['KNN', 
                       'Random Forest', 
                       'Naive Bayes',
                       'StackingClassifier']):

    scores = model_selection.cross_val_score(clf, X, y, 
                                              cv=3, scoring='accuracy')
    print("Accuracy: %0.2f (+/- %0.2f) [%s]" 
          % (scores.mean(), scores.std(), label))
3-fold cross validation:

Accuracy: 0.91 (+/- 0.01) [KNN]
Accuracy: 0.95 (+/- 0.01) [Random Forest]
Accuracy: 0.91 (+/- 0.02) [Naive Bayes]
Accuracy: 0.95 (+/- 0.02) [StackingClassifier]

示例 3 - 堆叠交叉验证分类与网格搜索

该堆叠允许调整基础模型和元模型的超参数!可以通过 estimator.get_params().keys() 获取可调参数的完整列表。

from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB 
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV
from mlxtend.classifier import StackingCVClassifier

# Initializing models

clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()

sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3], 
                            meta_classifier=lr,
                            random_state=42)

params = {'kneighborsclassifier__n_neighbors': [1, 5],
          'randomforestclassifier__n_estimators': [10, 50],
          'meta_classifier__C': [0.1, 10.0]}

grid = GridSearchCV(estimator=sclf, 
                    param_grid=params, 
                    cv=5,
                    refit=True)
grid.fit(X, y)

cv_keys = ('mean_test_score', 'std_test_score', 'params')

for r, _ in enumerate(grid.cv_results_['mean_test_score']):
    print("%0.3f +/- %0.2f %r"
          % (grid.cv_results_[cv_keys[0]][r],
             grid.cv_results_[cv_keys[1]][r] / 2.0,
             grid.cv_results_[cv_keys[2]][r]))

print('Best parameters: %s' % grid.best_params_)
print('Accuracy: %.2f' % grid.best_score_)
0.947 +/- 0.03 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
0.933 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}
0.940 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}
0.940 +/- 0.02 {'kneighborsclassifier__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}
0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}
0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}
Best parameters: {'kneighborsclassifier__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
Accuracy: 0.95

如果我们计划多次使用回归算法,我们只需在参数网格中添加额外的数字后缀,如下所示

from sklearn.model_selection import GridSearchCV

# Initializing models

clf1 = KNeighborsClassifier(n_neighbors=1)
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = GaussianNB()
lr = LogisticRegression()

sclf = StackingCVClassifier(classifiers=[clf1, clf1, clf2, clf3], 
                            meta_classifier=lr,
                            random_state=RANDOM_SEED)

params = {'kneighborsclassifier-1__n_neighbors': [1, 5],
          'kneighborsclassifier-2__n_neighbors': [1, 5],
          'randomforestclassifier__n_estimators': [10, 50],
          'meta_classifier__C': [0.1, 10.0]}

grid = GridSearchCV(estimator=sclf, 
                    param_grid=params, 
                    cv=5,
                    refit=True)
grid.fit(X, y)

cv_keys = ('mean_test_score', 'std_test_score', 'params')

for r, _ in enumerate(grid.cv_results_['mean_test_score']):
    print("%0.3f +/- %0.2f %r"
          % (grid.cv_results_[cv_keys[0]][r],
             grid.cv_results_[cv_keys[1]][r] / 2.0,
             grid.cv_results_[cv_keys[2]][r]))

print('Best parameters: %s' % grid.best_params_)
print('Accuracy: %.2f' % grid.best_score_)
0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}
0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}
0.940 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}
0.960 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}
0.960 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 1, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 50}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 10}
0.953 +/- 0.02 {'kneighborsclassifier-1__n_neighbors': 5, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 10.0, 'randomforestclassifier__n_estimators': 50}
Best parameters: {'kneighborsclassifier-1__n_neighbors': 1, 'kneighborsclassifier-2__n_neighbors': 5, 'meta_classifier__C': 0.1, 'randomforestclassifier__n_estimators': 10}
Accuracy: 0.96

注意

StackingClassifier 也支持对 classifiers 参数进行网格搜索。当存在混合层超参数时,GridSearchCV 将尝试按自上而下的顺序替换超参数,即 分类器 -> 单个基础分类器 -> 分类器超参数。例如,给定一个超参数网格,例如

params = {'randomforestclassifier__n_estimators': [1, 100],
'classifiers': [(clf1, clf1, clf1), (clf2, clf3)]}

它将首先使用 (clf1, clf1, clf1) 或 (clf2, clf3) 的实例设置。然后,它将根据 'randomforestclassifier__n_estimators': [1, 100] 替换匹配分类器的 'n_estimators' 设置。

示例 4 - 对在不同特征子集上操作的分类器进行堆叠

不同的第一层分类器可以拟合训练数据集中的不同特征子集。以下示例演示了如何使用 scikit-learn pipeline 和 ColumnSelector 在技术层面实现这一点

from sklearn.datasets import load_iris
from mlxtend.classifier import StackingCVClassifier
from mlxtend.feature_selection import ColumnSelector
from sklearn.pipeline import make_pipeline
from sklearn.linear_model import LogisticRegression

iris = load_iris()
X = iris.data
y = iris.target

pipe1 = make_pipeline(ColumnSelector(cols=(0, 2)),
                      LogisticRegression())
pipe2 = make_pipeline(ColumnSelector(cols=(1, 2, 3)),
                      LogisticRegression())

sclf = StackingCVClassifier(classifiers=[pipe1, pipe2], 
                            meta_classifier=LogisticRegression(),
                            random_state=42)

sclf.fit(X, y)
StackingCVClassifier(classifiers=[Pipeline(memory=None,
                                           steps=[('columnselector',
                                                   ColumnSelector(cols=(0, 2),
                                                                  drop_axis=False)),
                                                  ('logisticregression',
                                                   LogisticRegression(C=1.0,
                                                                      class_weight=None,
                                                                      dual=False,
                                                                      fit_intercept=True,
                                                                      intercept_scaling=1,
                                                                      l1_ratio=None,
                                                                      max_iter=100,
                                                                      multi_class='auto',
                                                                      n_jobs=None,
                                                                      penalty='l2',
                                                                      random_state=None,
                                                                      solver='lbfgs',
                                                                      tol=0.0...
                                                        fit_intercept=True,
                                                        intercept_scaling=1,
                                                        l1_ratio=None,
                                                        max_iter=100,
                                                        multi_class='auto',
                                                        n_jobs=None,
                                                        penalty='l2',
                                                        random_state=None,
                                                        solver='lbfgs',
                                                        tol=0.0001, verbose=0,
                                                        warm_start=False),
                     n_jobs=None, pre_dispatch='2*n_jobs', random_state=42,
                     shuffle=True, store_train_meta_features=False,
                     stratify=True, use_clones=True,
                     use_features_in_secondary=False, use_probas=False,
                     verbose=0)

示例 5 -- 使用 decision_function 的 ROC 曲线

与其他 scikit-learn 分类器一样,StackingCVClassifier 具有一个 decision_function 方法,可用于绘制 ROC 曲线。请注意,decision_function 期望并要求元分类器实现 decision_function

from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingCVClassifier
from sklearn.metrics import roc_curve, auc
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.preprocessing import label_binarize
from sklearn.multiclass import OneVsRestClassifier


iris = datasets.load_iris()
X, y = iris.data[:, [0, 1]], iris.target


# Binarize the output
y = label_binarize(y, classes=[0, 1, 2])
n_classes = y.shape[1]



RANDOM_SEED = 42


X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.33, random_state=RANDOM_SEED)

clf1 =  LogisticRegression()
clf2 = RandomForestClassifier(random_state=RANDOM_SEED)
clf3 = SVC(random_state=RANDOM_SEED)
lr = LogisticRegression()


sclf = StackingCVClassifier(classifiers=[clf1, clf2, clf3],
                            meta_classifier=lr)


# Learn to predict each class against the other
classifier = OneVsRestClassifier(sclf)

使用 predict_proba()

y_score = classifier.fit(X_train, y_train).predict_proba(X_test)

# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

png

使用 decision_function()

y_score = classifier.fit(X_train, y_train).decision_function(X_test)

# Compute ROC curve and ROC area for each class
fpr = dict()
tpr = dict()
roc_auc = dict()
for i in range(n_classes):
    fpr[i], tpr[i], _ = roc_curve(y_test[:, i], y_score[:, i])
    roc_auc[i] = auc(fpr[i], tpr[i])

# Compute micro-average ROC curve and ROC area
fpr["micro"], tpr["micro"], _ = roc_curve(y_test.ravel(), y_score.ravel())
roc_auc["micro"] = auc(fpr["micro"], tpr["micro"])

plt.figure()
lw = 2
plt.plot(fpr[2], tpr[2], color='darkorange',
         lw=lw, label='ROC curve (area = %0.2f)' % roc_auc[2])
plt.plot([0, 1], [0, 1], color='navy', lw=lw, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')
plt.title('Receiver operating characteristic example')
plt.legend(loc="lower right")
plt.show()

png

API

StackingCVClassifier(classifiers, meta_classifier, use_probas=False, drop_proba_col=None, cv=2, shuffle=True, random_state=None, stratify=True, verbose=0, use_features_in_secondary=False, store_train_meta_features=False, use_clones=True, n_jobs=None, pre_dispatch='2*n_jobs')

一个用于 scikit-learn 估计器的“堆叠交叉验证”分类器。

mlxtend v0.4.3 新增

参数

  • classifiers : array-like, shape = [n_classifiers]

    分类器列表。在 StackingCVClassifer 上调用 fit 方法将拟合这些原始分类器的克隆,这些克隆将存储在类属性 self.clfs_ 中。

  • meta_classifier : object

    用于拟合分类器集成的元分类器

  • use_probas : bool (默认值: False)

    如果为 True,则基于预测概率而不是类别标签训练元分类器。

  • drop_proba_col : string (默认值: None)

    删除特征集中的额外“概率”列,因为它存在冗余:p(y_c) = 1 - p(y_1) + p(y_2) + ... + p(y_{c-1})。这对于对完全共线特征敏感的元分类器很有用。如果设置为 last,则删除最后一个概率列。如果设置为 first,则删除第一个概率列。仅当 use_probas=True 时相关。

  • cv : int, 交叉验证生成器或可迭代对象, 可选 (默认值: 2)

    确定交叉验证分割策略。cv 的可能输入包括:- None,使用默认的 2 折交叉验证,- 整数,指定 (Stratified)KFold 中的折叠数,- 用作交叉验证生成器的对象,- 一个生成训练、测试分割的可迭代对象。对于整数/None 输入,将根据 stratify 参数的值使用 KFoldStratifiedKFold 交叉验证。

  • shuffle : bool (默认值: True)

    如果为 True 且 cv 参数是整数,则在交叉验证之前的拟合阶段将对训练数据进行洗牌。如果 cv 参数是特定的交叉验证技术,则忽略此参数。

  • random_state : int, RandomState 实例或 None, 可选 (默认值: None)

    控制 cv 分割器的随机性。当 cv 为整数且 shuffle=True 时使用。v0.16.0 新增。

  • stratify : bool (默认值: True)

    如果为 True 且 cv 参数是整数,它将遵循分层 K 折交叉验证技术。如果 cv 参数是特定的交叉验证技术,则忽略此参数。

  • verbose : int, 可选 (默认值=0)

    控制构建过程的详细程度。- verbose=0 (默认值):不打印任何内容 - verbose=1:打印正在拟合的回归器的编号和名称以及当前用于拟合的折叠 - verbose=2:打印有关正在拟合的回归器参数的信息 - verbose>2:将底层回归器的 verbose 参数更改为 self.verbose - 2

  • use_features_in_secondary : bool (默认值: False)

    如果为 True,元分类器将同时使用原始分类器的预测和原始数据集进行训练。如果为 False,元分类器将仅使用原始分类器的预测进行训练。

  • store_train_meta_features : bool (默认值: False)

    如果为 True,则计算自用于拟合元分类器的训练数据的元特征将存储在 self.train_meta_features_ 数组中,该数组可以在调用 fit 后访问。

  • use_clones : bool (默认值: True)

    如果为 True (默认值),则克隆分类器用于堆叠分类,否则使用原始分类器,它们将在调用 fit 方法时重新拟合数据集。因此,如果 use_clones=True,原始输入分类器在使用 StackingCVClassifier 的 fit 方法后将保持不变。如果您使用的估计器支持 scikit-learn 的 fit/predict API 接口但不兼容 scikit-learn 的 clone 函数,建议将 use_clones 设置为 False。

  • n_jobs : int 或 None, 可选 (默认值: None)

    用于计算的 CPU 数量。None 表示 1 个,除非在 :obj:joblib.parallel_backend 上下文中。-1 表示使用所有处理器。有关更多详细信息,请参见 :term:术语表 <n_jobs>。v0.16.0 新增。

  • pre_dispatch : int 或 string, 可选

    控制并行执行期间调度的作业数量。当调度的作业多于 CPU 可处理的数量时,减少此数字有助于避免内存消耗激增。此参数可以是:- None,在这种情况下,所有作业都会立即创建和生成。这适用于轻量级和快速运行的作业,以避免因按需生成作业而导致的延迟 - 一个整数,表示生成的总作业数量 - 一个字符串,表示一个与 n_jobs 相关的表达式,例如 '2*n_jobs'。v0.16.0 新增。

属性

  • clfs_ : list, shape=[n_classifiers]

    已拟合的分类器(原始分类器的克隆)

  • meta_clf_ : estimator

    已拟合的元分类器(原始元估计器的克隆)

  • train_meta_features : numpy array, shape = [n_samples, n_classifiers]

    训练数据的元特征,其中 n_samples 是训练数据中的样本数量,n_classifiers 是分类器的数量。

示例

有关使用示例,请参阅 https://mlxtend.cn/mlxtend/user_guide/classifier/StackingCVClassifier/

方法


decision_function(X)

预测 X 的类别置信度得分。

参数

  • X : {array-like, sparse matrix}, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

返回值

  • scores : shape=(n_samples,) 如果 n_classes == 2,否则为 (n_samples, n_classes)。

    每个(样本,类别)组合的置信度得分。在二元情况下,大于 0 的 self.classes_[1] 的置信度得分表示将预测此类别。


fit(X, y, groups=None, sample_weight=None)

拟合集成分类器和元分类器。

参数

  • X : numpy array, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

  • y : numpy array, shape = [n_samples]

    目标值。

  • groups : numpy array/None, shape = [n_samples]

    每个样本所属的组。特定折叠策略(如 GroupKFold())会使用此参数。

  • sample_weight : array-like, shape = [n_samples], 可选

    样本权重作为 sample_weights 传递给回归器列表中的每个回归器以及元回归器。如果某些回归器的 fit() 方法不支持 sample_weight,则会引发错误。

返回值

  • self : object

fit_transform(X, y=None, ***fit_params)

拟合数据,然后转换。

使用可选参数 fit_params 将转换器拟合到 X 和 y,并返回转换后的 X 版本。

参数

  • X : numpy array, shape [n_samples, n_features]

    训练集。

  • y : numpy array, shape [n_samples]

    目标值。

  • **fit_params : dict

    附加拟合参数。

返回值

  • X_new : numpy array, shape [n_samples, n_features_new]

    转换后的数组。


get_params(deep=True)

返回估计器参数名称,用于支持 GridSearch。


predict(X)

预测 X 的目标值。

参数

  • X : numpy array, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

返回值

  • labels : array-like, shape = [n_samples]

    预测的类别标签。


predict_meta_features(X)

获取测试数据的元特征。

参数

  • X : numpy array, shape = [n_samples, n_features]

    测试向量,其中 n_samples 是样本数量,n_features 是特征数量。

返回值

  • meta-features : numpy array, shape = [n_samples, n_classifiers]

    返回测试数据的元特征。


predict_proba(X)

预测 X 的类别概率。

参数

  • X : {array-like, sparse matrix}, shape = [n_samples, n_features]

    训练向量,其中 n_samples 是样本数量,n_features 是特征数量。

返回值

  • proba : array-like, shape = [n_samples, n_classes] 或如果 n_outputs > 1,则为包含 n_outputs 个此类数组的列表。

    每个样本的各类别概率。


score(X, y, sample_weight=None)

返回给定测试数据和标签上的平均准确率。

在多标签分类中,这是子集准确率,这是一个严格的指标,因为它要求每个样本的每个标签集都必须被正确预测。

参数

  • X : array-like, shape (n_samples, n_features)

    测试样本。

  • y : array-like, shape (n_samples,) 或 (n_samples, n_outputs)

    X 的真实标签。

  • sample_weight : array-like, shape (n_samples,), 默认值=None

    样本权重。

返回值

  • score : float

    self.predict(X) 相对于 y 的平均准确率。


set_params(**params)

设置此估计器的参数。

有效参数键可以通过 get_params() 列出。

返回值

self

属性


named_classifiers

None