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番のクラスター に分類された クラスター分類
した結果