モデルの精度を向上させるのは難しい場合があります。同じような問題で悩んだことがある方なら、きっと
私に同意していただけると思います。学んだすべての戦略とアルゴリズムを試しますが、モデルの精度は向上しません。これは無力感や行き詰まりを感じるときであり、
データ サイエンティストの 90% が諦め始めるときです。しかし、これはあなたの本当のスキルをテストする時です! これは、一般のデータサイエンティストとマスターデータサイエンティストの間のギャップでもあります。
上記では一連のアルゴリズムを紹介しましたが、それぞれのアルゴリズムには適用範囲が異なります。実生活では、問題を解決するために集合知がよく使用されます。では、機械学習では、複数の機械学習アルゴリズムを組み合わせて、より良い計算結果を得ることができるのでしょうか? これがアンサンブルアルゴリズムの考え方です。
統合アルゴリズムは、アルゴリズムの精度を向上させる効果的な方法の 1 つです。このセクションでは、scikit-learn を使用して統合アルゴリズムを実装する方法を紹介します。
このセクションでは、次のアルゴリズムを紹介します。
- バギングアルゴリズム。
- ブーストアルゴリズム。
- 投票アルゴリズム。
統合的アプローチ
以下に、アンサンブル アルゴリズムに対する 3 つの一般的なアプローチを示します。
- バギング アルゴリズム: まずトレーニング セットを複数のサブセットに分割し、次に各サブセットを通じて複数のモデルをトレーニングします。
- ブースティング アルゴリズム: 複数のモデルをトレーニングしてシーケンスを形成し、シーケンス内の各モデルが前のモデルのエラーを修正します。
- 投票アルゴリズム: 複数のモデルをトレーニングし、サンプル統計を使用してモデルの精度を向上させます。
ここでは、ピマ インディアン データ セットが使用され、10 分割交差検証を使用してデータが分離され、対応する評価行列を通じてアルゴリズム モデルが評価されます。
バギングアルゴリズムは、分類精度を向上させるためのアルゴリズムであり、与えられた投票の組み合わせによって最適解が得られます。例えば、病気でn件の病院に行ってn人の医師に診てもらった場合、各医師から処方箋が処方されますが、最終的に出てくる処方箋の回数が多いほど、その処方箋が最適解である可能性が高く、簡単です。これもバギングアルゴリズムの考え方です。
3 つの袋詰めモデルについて以下に説明します。
- 袋詰めされた決定木。
- ランダムフォレスト。
- 追加の木。
バギング決定ツリー
バギング アルゴリズムは、データの分散が大きい場合にうまく機能します。最も一般的な例は、デシジョン ツリーのバギング アルゴリズムです。以下はscikit-learn中通过BaggingClassifier实现分类
回帰木アルゴリズムを使用したものです。
この例では、100 個のデシジョン ツリーが作成されます。コードは次のとおりです。
import pandas as pd
from sklearn.ensemble import BaggingClassifier
from sklearn.model_selection import cross_val_score, KFold
from sklearn.tree import DecisionTreeClassifier
#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)
#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed = 7
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
#决策树
cart = DecisionTreeClassifier()
num_trees = 100
model = BaggingClassifier(base_estimator=cart, n_estimators=num_trees, random_state=seed)
result = cross_val_score(model, X, Y, cv=kflod)
print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
操作結果:
算法评估结果:0.758 (0.039)
前のセクションの分類木と回帰木の結果 (0.701708817498) と比較すると、結果が大幅に改善されていることがわかります。
ランダムフォレスト
ランダムフォレストはその名のとおり、ランダムな方法でフォレストを構築するもので、フォレストは多数の決定木で構成されており、それぞれの決定木には関連性がありません。フォレストを取得した後、新しい入力サンプルが入力されたときに、フォレスト内の各ディシジョン ツリーを個別に判断して、このサンプルがどのカテゴリに属するかを確認し、どのカテゴリが最も多く選択されているかを確認して、このサンプルがどのクラスに属するかを予測します。
各決定木を構築するプロセスでは、サンプリングと完全分割の 2 つの点に注意する必要があります。1 つ目は 2 つのランダム サンプリング プロセスで、ランダム フォレストでは行と列ごとに入力データをサンプリングします。行サンプリングでは、置換の方法が採用されます。つまり、サンプリングによって得られたサンプルセットには繰り返しのサンプルが存在する可能性があります。
N 個の入力サンプルがあると仮定すると、サンプリングされたサンプルも N 個になります。このように、トレーニング中、各ツリーの入力サンプルがすべてのサンプルではないため、オーバーフィットは比較的困難です。次に、列サンプリングを実行し、M 個の特徴から m 個の特徴を選択します (m<<M)。その後、サンプリングされたデータを完全に分割することによって決定木が確立されるため、決定木の特定の葉ノードはそれ以上分割できないようになり、すべてのサンプルが同じカテゴリを指すようになります。一般に、多くのデシジョン ツリー アルゴリズムには枝刈りという重要なステップがありますが、ここではこれは行われません。これは、前の 2 つのランダム サンプリング プロセスによってランダム性が確保されているため、枝刈りがなければ過剰適合は発生しません。
このアルゴリズムによって得られるランダムフォレスト内の決定木はそれぞれ非常に弱いものですが、それらを組み合わせると非常に強力になります。ランダム フォレストのアルゴリズムに例えると、各決定木は特定の分野に精通した専門家であるため、ランダム フォレストにはさまざまな分野に精通した専門家が多数存在します。入力データ) をさまざまな角度から見ることができ、最終結果はさまざまな専門家の投票によって決定されます。
このアルゴリズムは scikit-learn にあります实现类是RandomForestClassifier
。次の例では、100 本の木のランダム フォレストを実装します。
コードは以下のように表示されます:
import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier
from sklearn.model_selection import cross_val_score, KFold
#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)
#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
num_tree = 100
max_features = 3
model = RandomForestClassifier(n_estimators=num_tree, max_features=max_features)
result = cross_val_score(model, X, Y, cv=kflod)
print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
算法评估结果:0.777 (0.059)
極端なランダムツリー
エクストリーム ランダム ツリーは、2006 年に Pierre Geurts らによって提案されました。
ただし、ランダム フォレストとは主に 2 つの違いがあります。
(1) ランダム フォレストはバギング モデルを使用しますが、エクストリーム ランダム ツリーは各決定木を取得するためにすべてのトレーニング サンプルを使用します。つまり、各決定木は同じすべてのトレーニング サンプルを使用します。
(2) ランダムフォレストは、ランダムなサブセット内で最適な分岐特徴属性を取得するものであり、エクストリームランダムツリーは、決定木の分岐を実現するために完全にランダムに分岐特徴属性を選択するものです。scikit-learn の実装クラスは ExtraTreesClassifier です。以下の例は、100 個のツリーと 7 つのランダムな特徴を備えた極端なランダム ツリーの実装です。
コードは以下のように表示されます:
import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier
from sklearn.model_selection import cross_val_score, KFold
#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)
#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
num_tree = 100
max_features = 7
model = ExtraTreesClassifier(n_estimators=num_tree, max_features=max_features)
result = cross_val_score(model, X, Y, cv=kflod)
print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
操作結果:
算法评估结果:0.764 (0.056)
ブーストアルゴリズム
ブースティング アルゴリズムは、弱分類アルゴリズムの精度を向上させるために使用される手法で、最初に一連の予測関数を構築し、それらを特定の方法で組み合わせて予測関数を作成します。ブースティング アルゴリズムは、特定の学習アルゴリズムの精度を向上させる方法でもあります。これは、主にサンプル セットの操作を通じてサンプル サブセットを取得し、その後、弱分類アルゴリズムを使用してサンプル サブセットをトレーニングする統合アルゴリズムです。一連の基本分類子を生成します。
これは、他の弱分類アルゴリズムの認識率を向上させるために使用できます。つまり、他の弱分類アルゴリズムをプロモーション フレームワークの基本分類アルゴリズムとして配置し、トレーニング サンプルに対するプロモーション フレームワークの操作を通じてさまざまなトレーニング サンプル サブセットを取得します。を設定し、このサンプルのサブセットを使用して生成基本分類器をトレーニングします。サンプル セットが取得されるたびに、基本分類アルゴリズムを使用してサンプル セットに対して基本分類器を生成します。これにより、指定された数のトレーニング ラウンド n の後に、n 個の基本分類器が生成され、ブースティング アルゴリズムによって n 個の基本分類器が分類されます。分類子 重み付けされた融合が実行されて、最終結果の分類子が生成されます。n 個の基本分類器のうち、各分類器の認識率は必ずしも高いわけではありませんが、それらを結合した結果の認識率が高く、弱分類アルゴリズムの認識率が向上します。機械学習で使用される 2 つの非常に一般的なブースティング アルゴリズムを次に示します。
- アダブースト。
- 確率的勾配ブースティング。
エイダブースト
AdaBoost は反復アルゴリズムであり、その基本的な考え方は、同じトレーニング セットに対して異なる分類器 (弱分類器) をトレーニングし、これらの弱分類器を組み合わせてより強力な最終分類器 (強分類器) を形成することです。アルゴリズム自体はデータの分布を変えることで実現されており、各トレーニングセットの各サンプルの分類が正しいかどうかと、最後の全体的な分類の精度に応じて各サンプルの重みを決定します。重みが変更された新しいデータセットをトレーニングのために下位の分類器に送信し、毎回取得された分類器を最終的な決定分類器として融合します。AdaBoost 分類器を使用すると、一部の不要なトレーニング データの特徴を除外し、それらを主要なトレーニング データに含めることができます。
在scikit-learn中的实现类是AdaBoostClassifier
。
コードは以下のように表示されます:
import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier
from sklearn.model_selection import cross_val_score, KFold
#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)
#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
num_tree = 30
model = AdaBoostClassifier(n_estimators=num_tree, random_state=seed)
result = cross_val_score(model, X, Y, cv=kflod)
print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
操作結果:
算法评估结果:0.755 (0.037)
確率的勾配ブースティング
確率的勾配ブースティング法 (GBM) は、関数の最大値を見つける最良の方法は、関数の勾配方向に沿って探索することであるという考えに基づいています。勾配演算子は常に、関数の値が最も速く増加する方向を指します。勾配ブースティング アルゴリズムは、データ セットが更新されるたびにデータ セット全体を走査する必要があるため、計算の複雑さが高くなります。そのため、更新に一度に 1 つのサンプル ポイントのみを使用する、確率的勾配ブースティング アルゴリズムという改良されたアルゴリズムがあります。回帰係数アルゴリズムの計算の複雑さが大幅に改善されました。
在 scikit-learn中的实现类是 GradientBoostingClassifier
。
コードは以下のように表示されます:
import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, \
GradientBoostingClassifier
from sklearn.model_selection import cross_val_score, KFold
#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)
#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
num_tree = 100
model = GradientBoostingClassifier(n_estimators=num_tree, random_state=seed)
result = cross_val_score(model, X, Y, cv=kflod)
print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
操作結果:
算法评估结果:0.758 (0.056)
投票アルゴリズム
投票アルゴリズム (Voting) は、複数の機械学習アルゴリズムを統合した非常にシンプルなアルゴリズムです
。投票アルゴリズムは、2 つ以上のアルゴリズム モデルを作成し、投票アルゴリズムを使用してこれらのアルゴリズムをパッケージ化し、各サブモデルの平均予測ステータスを計算します。実際のアプリケーションでは、各サブモデルの予測結果に重みを追加して、アルゴリズムの精度を向上させることができます。ただし、scikit-learn には重み付けアルゴリズムは提供されていません。以下は、scikit-learn で投票アルゴリズムを実装する方法を示す例です。
在scikit-learn中的实现类是VotingClassifier。
コードは以下のように表示されます:
import pandas as pd
from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, \
GradientBoostingClassifier, VotingClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import cross_val_score, KFold
from sklearn.svm import SVC
from sklearn.tree import DecisionTreeClassifier
#数据预处理
path = 'D:\down\\archive\\diabetes.csv'
data = pd.read_csv(path)
#将数据转成数组
array = data.values
#分割数据,去掉最后一个标签
X = array[:, 0:8]
Y = array[:, 8]
num_folds = 10
seed = 7
#
kflod =KFold(n_splits=num_folds, random_state=seed, shuffle=True)
cart = DecisionTreeClassifier()
models= []
model_logistic = LogisticRegression()
models.append(('logistic', model_logistic))
model_cart = DecisionTreeClassifier()
models.append(('cart', model_cart))
model_svm = SVC()
models.append(('svm', model_svm))
ensemble_model = VotingClassifier(estimators=models)
result = cross_val_score(ensemble_model, X, Y, cv=kflod)
print("算法评估结果:%.3f (%.3f)" % (result.mean(), result.std()))
操作結果:
算法评估结果:0.767 (0.047)
このセクションでは、アルゴリズムの精度を向上させるための 3 つの統合アルゴリズムを紹介します。次のセクションでは、アルゴリズムの精度を向上させるための別の方法であるアルゴリズム チューニングを紹介します。