SLX分類子
空間クロスレグレッシブ(SLX)分類アルゴリズムは、フィーチャ・エンジニアリング・ステップを含むロジスティック回帰を実行して、データに空間コンテキストを提供するフィーチャを追加します。
このアルゴリズムは、隣接する観測からの平均を表す、特定の特徴の空間ラグを持つ1つ以上の列を追加します。
SLXClassifier
クラスを使用するには、隣接する観測間の相互作用を確立するspatial_weights_definition
パラメータを使用して空間重みを定義する必要があります。
マルチ・クラスの分類の問題の場合、アルゴリズムはone-vs-rest戦略を使用し、各クラスのモデルをトレーニングします。 この戦略の一般的な問題の1つは、一方のクラスの要素の割合が他方のクラスよりもはるかに大きい場合に、不均衡なデータセットになる可能性があることです。 このシナリオを処理するために、SLXClassifier
クラスには、次の2つのオーバー・サンプリング・メソッドが用意されています:
- ランダム このメソッドは、マイノリティ・クラスからランダム・サンプル(置換あり)の複製を作成します。
- Synthetic Minority Oversampling Technique (SMOTE)とは。 このアルゴリズムは、マイノリティ・クラスaのランダム・サンプルを選択し、kに最も近いネイバーからランダム・ネイバーbを選択します。 ベクトルabに[0、1]の範囲の乱数が乗算され、その結果がサンプルaに追加され、新しい合成インスタンスが生成されます。 SMOTEの詳細については、[ 5 ]を参照してください。
次のパラメータでは、オーバー・サンプリング・メソッドと新しいサンプルの数を指定します:
パラメータ | 説明 |
---|---|
balance_method |
オーバー・サンプリング・メソッド。 デフォルト値はNone で、その他のオプションは「ランダム」およびsmoteです。
|
balance_ratio
|
[0, 1] の範囲内の数値は、マイノリティ・クラスからの観測の望ましい比率を表します。 1 の値は、両方のクラスで同じ数の観測結果になります。
|
次の表に、SLXClassifier
クラスの主なメソッドを示します。
メソッド | 説明 |
---|---|
fit |
fit メソッドのパラメータは、ほとんどの回帰アルゴリズムで同じですが、空間ラグのコンピュートに使用される列を指定するcolumn_ids パラメータを除きます。
このアルゴリズムは、説明変数のパラメータと、空間ラグで追加されたパラメータに関連付けられたパラメータを推定します。 |
predict |
predict メソッドは、フィット・プロセスで定義された同じ列を使用してデータセットの空間ラグを計算し、ロジスティック回帰に従って最も高い確率のカテゴリを返します。
|
fit_predict |
トレーニング・データを使用して、fit およびpredict メソッドを順番にコールします。
|
score |
指定されたデータの精度を返します。 use_fit_lag=True を設定すると、アルゴリズムはトレーニング・セットから空間ラグを計算します。 それ以外の場合は、指定されたデータから空間ラグを計算します。
|
詳細は、「Oracle Spatial AI Python APIリファレンス」のSLXClassifierクラスを参照してください。
次の例では、block_groups
SpatialDataFrame
を使用して次のステップを実行します:
MEDIAN_INCOME
列に基づいて、ターゲット変数として使用するカテゴリ変数INCOME_LABEL
を作成します。balance_method
およびbalance_ratio
パラメータを指定して、SXLClassifier
のインスタンスを作成します。- トレーニング・セットを使用してモデルをトレーニングします。
- テスト・セットを使用して、モデルからの予測とモデルの精度を出力します。
import numpy as np
from oraclesai.preprocessing import spatial_train_test_split
from oraclesai.weights import KNNWeightsDefinition
from oraclesai.classification import SLXClassifier
from oraclesai.pipeline import SpatialPipeline
from sklearn.preprocessing import StandardScaler
# Define the categories for the target variable
labels=["low", "medium-low", "medium-high", "high"]
# The target variable comes from the column MEDIAN_INCOME
income_array = block_groups['MEDIAN_INCOME'].values
# Define constants to create the target variable
min_income = np.min(income_array)
max_income = np.max(income_array)
delta = (max_income - min_income) / 4
# Define a function that returns a category based on the median income
def get_label(income):
if income <= min_income + delta:
return "low"
elif min_income + delta < income <= min_income + 2 * delta:
return "medium-low"
elif min_income + 2 * delta < income <= min_income + 3 * delta:
return "medium-high"
return "high"
# Create a new SpatialDataFrame with the target variable "INCOME_LABEL"
block_groups_extended = block_groups.add_column("INCOME_LABEL", [get_label(income) for income in income_array])
# Define the target and explanatory variables
X = block_groups_extended[['INCOME_LABEL', 'MEAN_AGE', 'MEAN_EDUCATION_LEVEL', 'HOUSE_VALUE', 'INTERNET', 'geometry']]
# Split the data into training and test sets
X_train, X_test, _, _, _, _ = spatial_train_test_split(X, y="INCOME_LABEL", test_size=0.2, random_state=32)
# Define the spatial weights
weights_definition = KNNWeightsDefinition(k=20)
# Create the instance of SLXClassifier
slx_classifier = SLXClassifier(spatial_weights_definition=weights_definition,
random_state=15,
balance_method="smote",
balance_ratio=0.05)
# Add the model to a spatial pipeline along with a pre-processing step
classifier_pipeline = SpatialPipeline([('scale', StandardScaler()), ('classifier', slx_classifier)])
# Train the model specifying the target variable and the parameter column_ids
classifier_pipeline.fit(X_train, "INCOME_LABEL", classifier__column_ids=["MEAN_AGE", "HOUSE_VALUE"])
# Print the predictions with the test set
slx_predictions_test = classifier_pipeline.predict(X_test.drop("INCOME_LABEL")).flatten()
print(f"\n>> predictions (X_test):\n {slx_predictions_test[:10]}")
# Print the accuracy with the test set
slx_accuracy_test = classifier_pipeline.score(X_test, "INCOME_LABEL")
print(f"\n>> accuracy (X_test):\n {slx_accuracy_test}")
出力は、最初の10個の観測の予測と、テスト・セットを使用したモデルの精度で構成されます。
>> predictions (X_test):
['medium-low' 'medium-low' 'low' 'low' 'high' 'low' 'medium-low' 'low'
'low' 'low']
>> accuracy (X_test):
0.7438136826783115
summary
プロパティは、トレーニング済モデルの統計、またはマルチ・クラスの場合のモデルの統計を、推定パラメータの平均値とともに表示します。
Multi-Class Logistic Model Results
---------------------------------------------------------------------------
label deviance llf aic bic D2 adj_D2
high 342.409525 -171.204763 356.409525 -21710.554931 0.553921 0.552958
low 1855.672117 -927.836058 1869.672117 -20197.292339 0.498926 0.497844
medium-low 2506.593561 -1253.296780 2520.593561 -19546.370895 0.249868 0.248249
medium-high 840.588033 -420.294016 854.588033 -21212.376424 0.357128 0.355741
Parameters (Average Results)
Variable Est. STD Min Median Max
------------------------------- ---------- ---------- ---------- ---------- ----------
constant -3.740 4.007 -9.350 -3.432 1.256
MEAN_AGE -0.043 0.275 -0.345 -0.062 0.296
MEAN_EDUCATION_LEVEL 0.960 1.229 -1.077 1.472 1.974
HOUSE_VALUE -0.037 0.867 -1.175 -0.047 1.119
INTERNET 0.652 1.369 -1.435 0.824 2.394
SLX-MEAN_AGE 0.018 0.016 -0.006 0.022 0.035
SLX-HOUSE_VALUE 0.001 0.026 -0.017 -0.012 0.047