• 検索結果がありません。

STEP 4. R による機械学習 やその他の利用方法

4.1 R を利用したクラスタリング(k-means 法)

まずは、R でのクラスタリングの利用方法について説明します。クラスタリングは、顧客のセグメ ンテーションやデータを分類する際に、よく利用される機械学習の 1 つです。クラスタリングで定 番となっているのは、「k-means」(k 平均法)というアルゴリズムですが、RevoScaleR では

「rxKmeans」関数で利用することができます。

Let's Try

それでは、これも試してみましょう。

USE mlTestDB

EXEC sp_execute_external_script @language = N'R'

,@script = N'

clus1 <- rxKmeans(~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width ,data = InputDataSet, numClusters = 3 )

print(clus1) '

,@input_data_1 = N'SELECT * FROM iris'

これまで利用してきた機械学習のアルゴリズムでは、「目的変数 ~ 説明変数1 + 説明変数2 + 説明変数3 + …」という形で、目的変数に Species(アヤメの種類)を与えて、モデルを作成し ましたが、rxKmeans では、目的変数は不要で「~ 説明変数1 + 説明変数2 + 説明変数3 + …」

@input_data_1 にSELECT ステート メントでirisテーブルを指定

rxKmeans で Sepal とPetal を与える

クラスター数を3 に指定

3 つの クラスターが作成される

150 件のirisデータが 何番のクラスターに 属しているかが返る

という形で利用します(チルダを先頭で指定します)。

なお、これまで利用してきた機械学習のアルゴリズム(決定木やランダム フォレスト、サポート ベクター マシン、ニューラル ネットワークなど)は、「教師あり学習」(Supervised learning)と も呼ばれていて、正解データ(正解ラベルとも呼ばれます)を目的変数として与えてモデルを作成 するというものでした。これに対して、クラスタリングは「教師なし学習」とも呼ばれていて、説 明変数をもとに、データ分類を実施するというものになっています(正解データは不要です)。

「print(clus1)」で出力したクラスターの結果は、次のように解釈します。

150 件のデータが横並びで表示されて、何番のクラスターに属しているのかを確認できます。

rxKmeans の結果をテーブルに保存する

次に、rxKmeans の結果を SQL Server 上のテーブルとして保存してみましょう。これを行うに は、RevoScaleR の「RxSqlServerData」関数を利用します(以下のように記述します)。

-- クラスター結果をテーブルとして保存 EXEC sp_execute_external_script @language = N'R'

,@script = N'

cnstr <- "Driver=SQL Server;Server=localhost;Database=mlTestDB;UID=sa;PWD=saパスワード;"

ds1 <- RxSqlServerData( sqlQuery = input_query ,connectionString = cnstr ) ret1 <- RxSqlServerData( table = "iris_return_clusters"

,connectionString = cnstr )

clus1 <- rxKmeans( ~ Sepal.Length + Sepal.Width + Petal.Length + Petal.Width ,data = ds1, numClusters = 3

,outFile = ret1, writeModelVars = TRUE

,extraVarsToWrite = c("Species"), overwrite = TRUE ) '

,@input_data_1 = N''

,@params = N'@input_query nvarchar(1000)' ,@input_query = N'SELECT * FROM iris'

3 つの クラスターが作成される

1、2、3という番号

150 件の irisデータが

横並びで 表示されている 2件目のデータは

2番のクラスター に分類された 1件目のデータは

2番のクラスター に分類された 150件目のデータは

1番のクラスター に分類された

148件目のデータは 3番のクラスター

に分類された

-- 結果の確認(iris_return_clusters という名前のテーブルが自動作成されている)

SELECT * FROM iris_return_clusters

RxSqlServerData 関数では、接続文字列を利用して、SQL Server に接続するので、最初に

「cnstr <-」という形で Server= や Database= などで接続先の SQL Server 名とデータベー ス名を指定しています。

次の「ds1 <-」では「@input_query」入力変数で指定した SELECT ステートメント(iris テ ーブル)を「sqlQuery = input_query」という形で指定します。RxSqlServerData 関数では、

今まで利用してきた「@input_data_1」パラメーターではなく、別途「@params」で入力変数 を定義して、そこに SELECT ステートメントを記述する必要があります。

次の「ret1 <-」では、出力結果のテーブル名を定義していますが、「table="iris_return_clus ters"」とすることで、iris_return_clusters という名前のテーブルを SQL Server 上に自動作成 することができます(後述の rxKmeans の引数で outFile = ret1 と指定することで、

rxKmeans の出力結果をテーブルとして自動作成できます)。

rxKmeans の引数では、writeModelVars=TRUE を指定することで説明変数(Sepal や Petal)、

extraVarsToWrite で Species 列を指定することで、出力結果を分かりやすくすることができ ます。もし、これらを付けない場合は、クラスター番号だけが 150 件分出力される形になります。

overwrite=TRUE で既存のテーブルを上書き

writeModelVars=TRUE でモデルを作成したときに

説明変数で指定した データも出力に含める

extraVarsToWrite 出力に含めたい追加列を指定。

Species 列を追加している

RxSqlServerData input_queryを指定 RxSqlServerDataで出力先のテーブル

名をiris_return_clustersと指定 SQL Server

接続するための 接続文字列

writeModelVars=TRUE で出力した Sepal やPetal

extraVarsToWrite 出力したSpecies 3番のクラスター

に分類された

1番のクラスター に分類された クラスター分類

した結果