scikit-learn 統合学習コードの注釈と関連演習

1. コードのコメント

コードは以下から: https://scikit-learn.org/stable/auto_examples/ensemble/plot_adaboost_twoclass.html#sphx-glr-auto-examples-ensemble-plot-adaboost-twoclass-py

import numpy as np
import matplotlib.pyplot as plt
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.linear_model import SGDClassifier
from sklearn.datasets import make_gaussian_quantiles
from sklearn.datasets import make_classification

# 生成数据集
# X1, y1 = make_gaussian_quantiles(cov=2.0, n_samples=200, n_features=2, n_classes=2, random_state=1)
# X2, y2 = make_gaussian_quantiles(mean=(3, 3), cov=1.5, n_samples=300, n_features=2, n_classes=2, random_state=1)
# X = np.concatenate((X1, X2))
# y = np.concatenate((y1, -y2 + 1))
X, y = make_classification(n_samples=1000, n_features=2,  n_redundant=0, random_state=6)

# 生明AdaBoostClassifier预估器
bdt = AdaBoostClassifier(DecisionTreeClassifier(max_depth=1), algorithm="SAMME", n_estimators=3000)
# bdt = AdaBoostClassifier(SGDClassifier(loss='hinge'), algorithm="SAMME", n_estimators=1000)
# bdt = AdaBoostClassifier(LogisticRegression(), algorithm="SAMME", n_estimators=3000)
bdt.fit(X, y)

plot_colors = "br"
plot_step = 0.02
class_names = "AB"
plt.figure(figsize=(10, 5))

plt.subplot(121)
# 这里画图的方法与Knn的一样
# 画出决策边界,用不同颜色表示
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
# np.meshgrid:生成网格点坐标矩阵(因为pcolormesh需要这样使用)
# np.arange:起始,终点,步长
# xx,yy分别为两个特征
# 这里的意思就是为了有底色,每个x和y都都进行组合计算,算出它呢个点的底色。上面X和y相当于是训练集,这里差不多可以算作是没有结果的测试集
xx, yy = np.meshgrid(np.arange(x_min, x_max, plot_step), np.arange(y_min, y_max, plot_step))
# 用ravel()方法将数组拉成一维数组
# np.c 就是按列叠加两个矩阵,就是把两个矩阵左右组合,要求行数相等。
Z = bdt.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
# contourf:画轮廓图(与pcolormesh图形效果类似)
cs = plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
plt.axis("tight")

# 补充训练数据点
for i, n, c in zip(range(2), class_names, plot_colors):
    idx = np.where(y == i)
    plt.scatter(
        X[idx, 0],
        X[idx, 1],
        c=c,
        cmap=plt.cm.Paired,
        s=20,
        edgecolor="k",
        label="Class %s" % n,
    )
plt.xlim(x_min, x_max)
plt.ylim(y_min, y_max)
plt.legend(loc="upper right")
plt.xlabel("x")
plt.ylabel("y")
plt.title("Decision Boundary")

# 画出两类的分别决定成绩
twoclass_output = bdt.decision_function(X)
plot_range = (twoclass_output.min(), twoclass_output.max())
plt.subplot(122)
for i, n, c in zip(range(2), class_names, plot_colors):
    plt.hist(
        twoclass_output[y == i],
        bins=10,
        range=plot_range,
        facecolor=c,
        label="Class %s" % n,
        alpha=0.5,
        edgecolor="k",
    )
x1, x2, y1, y2 = plt.axis()
plt.axis((x1, x2, y1, y2 * 1.2))
plt.legend(loc="upper right")
plt.ylabel("Samples")
plt.xlabel("Score")
plt.title("Decision Scores")
plt.tight_layout()
plt.subplots_adjust(wspace=0.35)
plt.show()

2. 機械学習の数を変更する

AdaBoostClassifier の原理は、最初に弱い学習者モデルをトレーニングし、次にその結果を評価することです。このモデルの正しい問題についてはその注意を減らし、間違った問題についてはその注意を増やします。新しいモデルでは、以前のモデルでは解決できなかった困難を克服することに重点が置かれます 最後に、すべてのモデルを統合して大きなフレームワークを形成すると、大きなフレームワークの単純な問題に対処するモデルも存在します難しい問題に対処するため、大規模なフレームワークの全体的なパフォーマンスが多少向上します。
その原理によれば、基本学習器の数はタスク内で変更する必要があります。最初は、ステーキングのように、AdaBoostClassifier の Base_estimator にさらに多くのモデルを置くことだと思いましたが、AdaBoostClassifier ではこれはできません。Stack Overflow の一部のネチズンも回答しました。理論的には可能ですが、AdaBoostClassifier は弱い学習器がランダムな学習器よりも優れていることのみを必要とするため、多くの場合、同じ分類器が使用されます。
ここに画像の説明を挿入
タスク内の修正された基本学習器の数は、修正された n_estimators のサイズを参照する必要があります。これは、弱学習器の最大反復数であり、弱学習器の最大数とも言えます。下図の検定が小さすぎるとアンダーフィットしやすく、分類曲面が比較的規則的で大きすぎるとオーバーフィットしやすいため、1000程度が適当です。
ここに画像の説明を挿入

3. 機械学習の種類を変更する

base_estimator: デフォルトは DecisionTreeClassifier です。理論的には、任意の分類学習器または回帰学習器を選択できますが、サンプルの重みをサポートする必要があります。たとえば、Knn、MLP はそれをサポートしておらず、「xxx は、sample_weight をサポートしていません。」と報告されます。その後、ロジスティック回帰モデルを選択しましたが、「AdaBoostClassifierアンサンブルのBaseClassifierはランダムよりも悪く、アンサンブルが適合できない」という報告が続き、この理由についての説明はインターネット上にほとんどありません。ロジスティック回帰だけでなくSGDでも試してみたところ、下図のデータ生成方法をmake_classificationの方法に変更すると正常に実行されることが分かりましたが、理由は不明です。
ここに画像の説明を挿入
ここに画像の説明を挿入
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/Fishermen_sail/article/details/131855136