勾配ブースティングは、分類タスクに使用されるデータサイエンスの強力かつ広く使用されている機械学習アルゴリズムです。これは、バギングとともに、複数のより単純なモデルの予測を組み合わせて全体的な性能を向上させるアンサンブル学習手法のファミリーの一部です。勾配ブースティング回帰では、勾配ブースティングを使用して、線形回帰に基づいてアウトプットをより適切に生成します。チュートリアルで説明する勾配ブースティング分類器は、勾配ブースティングを使用して、インプットデータを2つ以上の異なるクラスに属するものとしてより適切に分類します。
勾配ブースティングは、ツリーではなく決定スタンプを使用するadaboostアルゴリズムのアップデートです。これらの意思決定スタンプは、ランダム・フォレストのツリーに似ていますが、1つのノードと2つの葉しか持ちません。勾配ブースティング・アルゴリズムはモデルを順番に構築し、各ステップで前の反復の間違いを修正しようとします。多くの場合、トレーニング・プロセスは、トレーニング・データ用に浅い決定木のような弱い学習器を作成することから始まります。その初期トレーニングの後、勾配ブースティングは実際の値と予測値(しばしば残差と呼ばれる)の間の誤差を計算し、この誤差を予測するための新しい推定器をトレーニングします。その新しいツリーがアンサンブルに追加され、予測が更新され、強力な学習器が作成されます。勾配ブースティングでは、改善が停止するまで、または一定の反復数に到達するまで、このプロセスを繰り返します。ブースティング自体は勾配降下法に似ていますが、新しいモデルを導入することで勾配を「降下」させます。
ブースティングにはいくつかの利点があります。表データに対する性能が優れていることや、数値データとカテゴリー・データの両方を処理できることです。デフォルトのパラメーターでもうまく機能し、データ・セット内の外れ値に対して堅牢です。ただし、トレーニングに時間がかかり、多くの場合、トレーニング・プロセスに設定されたハイパーパラメーターに非常に敏感です。作成されるツリーの数を少なく保つと、大規模なデータ・セットを扱う際のトレーニング・プロセスを高速化できます。このステップは通常、最大深度パラメーターを使用して実行されます。また、勾配ブーストは、適切に調整されないと、過学習になる傾向があります。過学習を防ぐために、トレーニング・プロセスの学習率を設定できます。このプロセスは分類器や勾配ブースティング回帰器でほぼ同じであり、正規化を追加することで勾配ブースティングを構築する人気のxgboostで使用されます。
このチュートリアルでは、2つの異なるプログラミング言語と勾配ブースティングライブラリを使用して、人気のPalmer Penguinsモデルを使用してペンギンを分類する方法を学びます。データ・セット。
このチュートリアルのノートブックは、Githubからダウンロードできます。
いくつかあるツールの中から選択することもできますが、このチュートリアルでは、watsonx®でJupyter Notebookを使用してIBMアカウントを設定する方法について説明します。
IBM® Cloudアカウントを使用して、watsonx.ai®にログインします。
watsonx.aiプロジェクトを作成します。
プロジェクトIDはプロジェクト内から取得できます。「管理」タブをクリックし、「全般」ページの「詳細」セクションからプロジェクトIDをコピーします。このチュートリアルではこのIDが必要になります。
Jupyter Notebookを作成します。
ノートブックを作成するときに、「Runtime 24.1 on R 4.3 S (4 vCPU 16 GB RAM)」を選択してください。このステップでは、このチュートリアルからコードをコピーできるノートブック環境が開きます。あるいは、このノートブックをローカル・システムにダウンロードし、watsonx.aiプロジェクトにアセットとしてアップロードすることもできます。さらにGraniteのチュートリアルを表示するには、IBM® Granite Communityをご覧ください。このJupyter Notebookは GitHubにあります。
Rでは、ケアセット・ライブラリーは、一般的なデータの準備とモデルの適合のための強力なツールです。これを使用して、データを準備し、モデル自体をトレーニングします。
install.packages('gbm')
install.packages('caret')
install.packages('palmerpenguins')
library(gbm)
library(caret)
library(palmerpenguins)
head(penguins) # head() returns the top 6 rows of the dataframe
summary(penguins) # prints a statistical summary of the data columns
caretパッケージのcreateDataPartition関数を使用して、元のデータ・セットをトレーニング・セットとテスト・セットに分割し、データをトレーニング・セット(70%)とテスト・セット(30%)に分割します。
dim(penguins)
# get rid of any NA
penguins <- na.omit(penguins)
parts = caret::createDataPartition(penguins$species, p = 0.7, list = F)
train = penguins[parts, ]
test = penguins[-parts, ]
これで、トレーニングとテストの準備が整いました。
ケアセット・ライブラリーのトレーニング方法ではR式を使用しており、従属変数(しばしばターゲットとも呼ばれる)はチルダ「~」の左側にあります。独立変数(しばしば主要な機能とも呼ばれる)は「~」の右側にあります。例えば:
height ~ age
このステップでは、年齢に基づいて身長を予測します。
ケア・トレーニングには、公式、トレーニング・データ、および使用する方法を渡します。Caretライブラリーにはさまざまなタイプのトレーニングのメソッドが用意されているため、メソッドを「gbm」として設定することで、勾配ブースティングの使用を指定します。次のパラメーターは、トレーニング・プロセスを構成します。「Recycledcv」メソッドでは、トレーニング・セットのデータ・ポイントのサブサンプルに対してX分割交差検証を行います。ここでは、交差検証ごとに異なるフォールドのセットを使用して、5分割交差検証を3回繰り返す指定を指定します。
model_gbm <- caret::train("species ~ .",
data = train,
method = "gbm", # gbm for gradient boosting machine
trControl = trainControl(method = "repeatedcv",
number = 5,
repeats = 3,
verboseIter = FALSE),
verbose = 0)
これで、予測モデルを使用してテスト・データの予測を行うことができます。
pred_test = caret::confusionMatrix(
data = predict(model_gbm, test),
reference = test$species
)
print(pred_test)
このステップでは次のように出力されます:
Confusion Matrix and Statistics
Reference
Prediction Adelie Chinstrap Gentoo
Adelie 42 0 0
Chinstrap 0 20 0
Gentoo 1 0 35
Overall Statistics
Accuracy : 0.9898
95% CI : (0.9445, 0.9997)
No Information Rate : 0.4388
P-Value [Acc > NIR] : < 2.2e-16
Kappa : 0.984
Mcnemar's Test P-Value : NA
Statistics by Class:
Class: Adelie Class: Chinstrap Class: Gentoo
Sensitivity 0.9767 1.0000 1.0000
Specificity 1.0000 1.0000 0.9841
Pos Pred Value 1.0000 1.0000 0.9722
Neg Pred Value 0.9821 1.0000 1.0000
Prevalence 0.4388 0.2041 0.3571
Detection Rate 0.4286 0.2041 0.3571
Detection Prevalence 0.4286 0.2041 0.3673
Balanced Accuracy 0.9884 1.0000 0.9921
フォールドを使用したクロス検証の性質上、精度は同じですが、各クラスの感度と特異度はここで観察されるものとは若干異なる場合があります。トレーニング・データ・セットの20%を占めるChinstrapペンギンを使用しても、精度は非常に優れています。
次に、Pythonで勾配ブースティング・モデルを作成する方法を学びます。以前に作成したのと同じプロジェクト内で、Jupyter Notebookを作成します。
IBM Watson StudioのPython 3.11を使用して、Jupyter Notebookを作成できます。ノートブックを作成するときに「Runtime 24.1 on Python 3.11 XXS (1 vCPU 4 GB RAM)」を確実に選択します。これで、Pythonを使用して勾配ブースティング分類器を作成する準備が整いました。
このステップでは、勾配ブースティング分類器のトレーニングとテストに使用するライブラリーをインストールします。トレーニング自体はscikit-learnで行われ、データはPamerpenguins社のライブラリから取得します。
!pip install seaborn pandas scikit-learn palmerpenguins
次に、ノートブック環境にライブラリをインストールします。
import pandas as pd
import seaborn as sns
from sklearn.compose import ColumnTransformer
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.metrics import classification_report
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import OneHotEncoder, StandardScaler
from palmerpenguins import load_penguins
Rコードと同様に、ペンギン データ・セットには削除する必要がある NAがいくつかあります。このコードスニペットはデータ・セットを読み込み、NA行を削除し、データを主要な機能とターゲットに分割します。
# Load the penguins
penguins = load_penguins() #initialize the dataset
penguins = penguins.dropna()
X = penguins.drop("species", axis=1)
y = penguins["species"]
データ・セットのトレーニングとテストの分割を作成し、データの70%をトレーニング用に抽出し、30%をテスト用に確保します。
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
次に、主要な機能の2つのリストを収集します。1つはXのカテゴリー別の主要な機能、もう1つは数値的主要な機能(例:FLoat64またはint64の次に、scikit-learnのColumnTransformerを使用して、列タイプごとに異なる前処理を適用します。主要な機能にOneHotEncoderを適用することで、バイナリ・ベクトルに変換できます。StandardScalerは数値の主要な機能に適用され、平均f 0と分散1の周りに標準化されます。
# Define categorical and numerical features
categorical_features = X.select_dtypes(
include=["object"]
).columns.tolist()
numerical_features = X.select_dtypes(
include=["float64", "int64"]
).columns.tolist()
preprocessor = ColumnTransformer(
transformers=[
("cat", OneHotEncoder(), categorical_features),
("num", StandardScaler(), numerical_features),
]
)
主要な機能のセットとプリプロセッサーを作成できたら、主要な機能をトレーニングするパイプラインを作成できますこのパイプラインは、インプットデータに対してプレプロセッサーを使用し、それを勾配ブースティング・アルゴリズムに渡して分類器を構築します。大規模または複雑なデータ・セットの場合、設定したい他のトレーニング・パラメーターがあります。例えば、最適な分割を探す際に考慮する主要な機能の数を設定するmax_featuresや、ツリー内の主要な機能の数を制限するmax_depthなどがあります。 このコード・スニペットは、トレーニングのための分割の品質を測定する基準パラメーターを設定します。この場合、[Jerry Friedman](https://jerryfriedman.su.domains/ftp/trebst.pdf)(IBMの外部に存在)による改善スコア付き平均二乗誤差を使用しています
pipeline = Pipeline([
("preprocessor", preprocessor),
("classifier", GradientBoostingClassifier(random_state=42,
criterion='friedman_mse', max_features=2)),
])
次に、クロス検証を実行して、機械学習パイプラインがトレーニング データに対してどの程度適切に機能するかを評価します。作成したパイプラインのfitメソッドを呼び出すと、モデルがトレーニングされます。損失関数はデフォルトで平均二乗誤差(MSE)を使用します。
# Perform 5-fold cross-validation
cv_scores = cross_val_score(pipeline, X_train, y_train, cv=5)
# Fit the model on the training data
pipeline.fit(X_train, y_train)
モデルがトレーニングされたことを確認し、テスト・セットを予測して性能を確認します。
# Predict on the test set
y_pred = pipeline.predict(X_test)
# Generate classification report
report = classification_report(y_test, y_pred)
成果を出力します。
print(f"Mean Cross-Validation Accuracy: {cv_scores.mean():.4f}")
print("\nClassification Report:")
print(report)
この手順では、次の成果が出力されます。
Mean Cross-Validation Accuracy: 0.9775
Classification Report:
precision recall f1-score support
Adelie 1.00 1.00 1.00 31
Chinstrap 1.00 1.00 1.00 18
Gentoo 1.00 1.00 1.00 18
accuracy 1.00 67
macro avg 1.00 1.00 1.00 67
weighted avg 1.00 1.00 1.00 67
これらの成果は、このチュートリアルの最初の部分でRメソッドによって報告された精度に非常に近いです。
AI開発者向けの次世代エンタープライズ・スタジオであるIBM watsonx.aiを使用して、生成AI、基盤モデル、機械学習機能をトレーニング、検証、チューニング、導入しましょう。わずかなデータとわずかな時間でAIアプリケーションを構築できます。
業界をリードするIBMのAI専門知識とソリューション製品群を使用すれば、ビジネスにAIを活用できます。
AIの導入で重要なワークフローと業務を再構築し、エクスペリエンス、リアルタイムの意思決定とビジネス価値を最大化します。