機械翻訳について

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メソッドは、フィット・プロセスで定義された同じ列を使用してデータセットの空間ラグを計算し、ロジスティック回帰に従って最も高い確率のカテゴリを返します。

use_fit_lag=Trueパラメータを設定することで、アルゴリズムはトレーニング・セットから空間ラグを計算します。 これは、予測データセットに観測がほとんど含まれていない場合に役立ちます。

fit_predict トレーニング・データを使用して、fitおよびpredictメソッドを順番にコールします。
score 指定されたデータの精度を返します。 use_fit_lag=Trueを設定すると、アルゴリズムはトレーニング・セットから空間ラグを計算します。 それ以外の場合は、指定されたデータから空間ラグを計算します。

詳細は、「Oracle Spatial AI Python APIリファレンス」SLXClassifierクラスを参照してください。

次の例では、block_groups SpatialDataFrameを使用して次のステップを実行します:

  1. MEDIAN_INCOME列に基づいて、ターゲット変数として使用するカテゴリ変数INCOME_LABELを作成します。
  2. balance_methodおよびbalance_ratioパラメータを指定して、SXLClassifierのインスタンスを作成します。
  3. トレーニング・セットを使用してモデルをトレーニングします。
  4. テスト・セットを使用して、モデルからの予測とモデルの精度を出力します。
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