AlteryxにはIntelligence SuiteがあるけどそれでもRが使いたい!

こんにちは、小澤です。

なぜ、時々「え?どうしてそんなことを?」ということをやりたくなってしまうのでしょうか? 特に何らかのメリットがあるわけではないのですが、Assisted ModelingをRツールから使いましょう。

なぜAssisted Modelingなのか

Assisted ModelingといえばIntelligence Suiteに含まれる機械学習を行うためのツール群です。 「Machine Learning」タブ内に存在しており、ステップバイステップで簡単に機械学習をするためのワークフローを作成できるものになっています。 その後、ステップバイステップのプロセスを自動的に行う機能やAutoMLツールといったものも追加されています。

Intelligence Suiteに含まれるツールはPython SDKを使って実装されており、その中でもAssisted Modelingに関してはPythonツールにエクスポートする機能も有しています。

今回目を付けたのはこのPythonツールにエクスポートする機能の存在です。 プログラムで記述されたものが得られるということは、それはすなわち他からも利用できるということではないでしょうか!?

というわけでどちらかというとPythonよりRの方が好きなのでRツールから使えないかやってみます。

RからPythonを利用する

Rには {reticulate} というPythonで実装された処理を呼び出すためのライブラリが存在しています。 はい、これを使います。

AlteryxのPredictiveツールに含まれるRには標準ではこのライブラリが入っていないため、まずは導入します。

if(!require("reticulate")){
  install.packages(
    "reticulate", 
    repos = "https://cran.rstudio.com/"
  )
  library("reticulate")
}

この処理でライブラリを読み込んで、失敗した場合はインストールするという流れを実現しています。 初回はインストールされますが、既にインストール済みの環境であれば読み込みの処理のみが実行されます。

次にAssisted Modelingで利用しているPython環境を利用する指定をすることで、必要なPythonライブラリが利用可能な状態となります。 AlteryxをAdmin版でインストールしている場合、以下のパスを指定します。

use_condaenv("C:/Program Files/Alteryx/bin/Miniconda3/envs/MachineLearningTools_venv")

Assisted Modelingを使う

さて、準備は整ったので、RツールからAssisted Modelingを使っていきましょう。 エクスポートされるPythonで実装されている内容や {reticulate} の詳細は解説しませんが、 ほぼ同等の処理を行っています。

まずは必要なライブラリを読み込みます。

evalml <- import("ayx_learn.evalml")
entities <- import("ayx_ml_toolkit.entities")
helpers <- import("ayx_ml_toolkit.utilities.evalml_helpers")

続いて、Assited ModelingではTransformationツールで実現される

  • Set Data Types
  • Clean Up Missing Values
  • Select Features
  • One Hot Encoding

に相当する処理の実装を行います。

feature_typing <-
    evalml$DataTyping(
        data_types = list(
            "Sepal.Length" = "numeric",
            "Sepal.Width"  = "numeric",
            "Petal.Length" = "numeric",
            "Petal.Width" = "numeric"
        )
    )
missing_values <-
    evalml$PerColumnAlwaysImputer(
        impute_strategies = list( 
            "Sepal.Length" = list("impute_strategy" = "most_frequent", "fill_value" = NULL),
            "Sepal.Width"  = list("impute_strategy" = "most_frequent", "fill_value" = NULL),
            "Petal.Length" = list("impute_strategy" = "most_frequent", "fill_value" = NULL),
            "Petal.Width" = list("impute_strategy" = "most_frequent", "fill_value" = NULL)
        ),
        default_impute_strategy = "most_frequent"
    )
feature_selection <- 
    evalml$SelectColumns(
        columns = NULL,
        selected_columns = list(
          "Sepal.Length" = TRUE,
          "Sepal.Width" = TRUE,
          "Petal.Length" = TRUE,
          "Petal.Width" = TRUE
      )
    )
one_hot_encoding <-
    evalml$OneHotEncoder(
        top_n = 60, 
        categories = NULL, 
        drop = NULL, 
        handle_unknown = "ignore", 
        handle_missing = "error", 
        columns_handle_unknown_strategy = NULL
    )

各種前処理の定義の次にはClassificationまたはRegressionツールに相当する処理の記述を行います。

classifier <- 
    evalml$XGBClassifier(
        learning_rate = 0.5680449930493713, 
        max_depth = as.integer(6), 
        min_child_weight = 8.524708871836399, 
        n_estimators =  as.integer(73)
    )

Assisted Modelingツールそのもの設定と同等のデータを読み込んで目的変数の設定を行う処理を記述します。 ここで必要となるのは目的変数の列名とAlteryx上でのデータの型に関する情報となりますのでそれらを設定しています。

training_data_df <- read.Alteryx2("#1")
training_metadata_df <- read.AlteryxMetaInfo("#1")


target_variable <- "Species"
target_type <- 
    training_metadata_df %>% 
    dplyr::filter(Name == target_variable)
target_type <- target_type[["Type"]]

target_metadata <- entities$ColumnMetadataEntity(
    col_name=target_variable,
    col_type=target_type
)

これらの情報を使って処理の流れを定義するパイプラインを作成します。

pipeline <- helpers$make_pipeline_from_components(
    list(
        feature_typing, 
        missing_values, 
        feature_selection, 
        one_hot_encoding, 
        classifier
    ), 
    problem_type="MULTICLASS")

pipeline_entity <- entities$PipelineEntity(
    training_data=training_data_df,
    target=target_metadata,
    pipeline=pipeline
)

必要な情報が揃ったので、Fitツールに相当するモデリングの処理を実行します

pipeline_entity$fit()

これで学習ができたので、最後に別なデータを読み込んでPredictツールに相当する推論処理を行い、その結果を出力してみましょう。

test_data_df <- read.Alteryx2("#2")
test_data_df['predict'] <- pipeline_entity$predict(test_data_df)
write.Alteryx2(test_data_df, 1)

predict列に推論結果が付与されているのが確認できました。

他のツールでもできる?

Assisted ModelingはPythonツールへのエクスポート機能があったため、その処理内容を確認してRツールで使うことが出来ました。 では、同じくIntelligence Suiteに含まれるAutoMLツールや、Text Mining系のツールで同じようなことは可能なのでしょうか?

これらにはエクスポート機能はないため、同じようなやり方でそのままRツールから使うのは難しいでしょう。 しかし、実はAssited Modelingでも利用されいてるEvalMLというライブラリはOSSとして公開されています。

このEvalMLにはAutoML機能が実装されているため、それを利用する処理を実装すれば同様に利用可能かもしれません。

おわりに

今回はPythonツールにエクスポートされたAssisted Modelingの処理をベースにRツールからそれを呼び出してみました。 AlteryxにはPythonツールもありますし、ワークフローとしてもそのまま実行可能なので、 動かすためわざわざRツールに移植しなおす必要はありませんが、内部の実装を知っておくためのきっかけの1つとしてはいいかもしれません。