頻出パターンマイニング
頻繁なアイテム、アイテムセット、サブシーケンス、またはその他の部分構造のマイニングは、通常、大規模データセットの分析の最初のステップの 1 つであり、長年にわたってデータマイニングの活発な研究トピックとなっています。詳細については、Wikipedia の アソシエーションルール学習 を参照してください。
目次
FP-Growth
FP-growth アルゴリズムは、論文 Han et al., Mining frequent patterns without candidate generation で説明されています。ここで「FP」は頻繁パターンを表します。トランザクションのデータセットが与えられた場合、FP-growth の最初のステップは、アイテムの頻度を計算し、頻繁なアイテムを特定することです。同じ目的のために設計された Apriori ライクなアルゴリズムとは異なり、FP-growth の 2 番目のステップでは、サフィックスツリー (FP-tree) 構造を使用して、通常は生成にコストがかかる候補セットを明示的に生成せずにトランザクションをエンコードします。2 番目のステップの後、頻繁なアイテムセットは FP-tree から抽出できます。spark.mllib では、Li et al., PFP: Parallel FP-growth for query recommendation で説明されている PFP という FP-growth の並列バージョンを実装しました。PFP は、トランザクションのサフィックスに基づいて FP-tree を成長させる作業を分散するため、単一マシン実装よりもスケーラブルです。詳細については、論文を参照してください。
FP-growth はアイテムセット上で動作します。アイテムセットは、一意のアイテムの順序付けられていないコレクションです。Spark にはセット型がないため、アイテムセットは配列として表されます。
spark.ml の FP-growth 実装は、次の (ハイパー) パラメータを取ります。
minSupport: アイテムセットが頻繁として識別されるための最小サポート。たとえば、あるアイテムが 5 つのトランザクションのうち 3 つに出現する場合、そのサポートは 3/5=0.6 です。minConfidence: アソシエーションルールの生成のための最小信頼度。信頼度は、アソシエーションルールが真であることが判明した頻度を示す指標です。たとえば、トランザクションでアイテムセットXが 4 回出現し、XとYが共起するのは 2 回だけの場合、ルールX => Yの信頼度は 2/4 = 0.5 となります。このパラメータは頻繁なアイテムセットのマイニングには影響しませんが、頻繁なアイテムセットからアソシエーションルールを生成するための最小信頼度を指定します。numPartitions: 作業を分散するために使用されるパーティションの数。デフォルトではパラメータは設定されておらず、入力データセットのパーティション数が使用されます。
は以下を提供します。FPGrowthModel
freqItemsets: 次の列を持つ DataFrame の形式の頻繁なアイテムセット。items: array: 指定されたアイテムセット。freq: long: 設定されたモデルパラメータに基づいて、このアイテムセットが観測された回数。
associationRules:minConfidence以上の信頼度で生成されたアソシエーションルール。次の列を持つ DataFrame の形式。antecedent: array: アソシエーションルールの仮説となるアイテムセット。consequent: array: アソシエーションルールの結論を表す単一要素を含むアイテムセット。confidence: double:confidenceの定義については、上記のminConfidenceを参照してください。lift: double: 先行が後続をどれだけうまく予測できるかを示す尺度。次のように計算されます:support(antecedent U consequent) / (support(antecedent) x support(consequent))support: double:supportの定義については、上記のminSupportを参照してください。
transform:itemsColの各トランザクションについて、transformメソッドは、そのアイテムを各アソシエーションルールの先行と比較します。レコードが特定のアソシエーションルールのすべての先行を含んでいる場合、そのルールは適用可能と見なされ、その後続が予測結果に追加されます。transform メソッドは、適用可能なすべてのルールからの後続をまとめて予測とします。予測列はitemsColと同じデータ型であり、itemsColに既存のアイテムは含まれません。
例
詳細については、Python API ドキュメント を参照してください。
from pyspark.ml.fpm import FPGrowth
df = spark.createDataFrame([
(0, [1, 2, 5]),
(1, [1, 2, 3, 5]),
(2, [1, 2])
], ["id", "items"])
fpGrowth = FPGrowth(itemsCol="items", minSupport=0.5, minConfidence=0.6)
model = fpGrowth.fit(df)
# Display frequent itemsets.
model.freqItemsets.show()
# Display generated association rules.
model.associationRules.show()
# transform examines the input items against all the association rules and summarize the
# consequents as prediction
model.transform(df).show()詳細については、Scala API ドキュメント を参照してください。
import org.apache.spark.ml.fpm.FPGrowth
val dataset = spark.createDataset(Seq(
"1 2 5",
"1 2 3 5",
"1 2")
).map(t => t.split(" ")).toDF("items")
val fpgrowth = new FPGrowth().setItemsCol("items").setMinSupport(0.5).setMinConfidence(0.6)
val model = fpgrowth.fit(dataset)
// Display frequent itemsets.
model.freqItemsets.show()
// Display generated association rules.
model.associationRules.show()
// transform examines the input items against all the association rules and summarize the
// consequents as prediction
model.transform(dataset).show()詳細については、Java API ドキュメント を参照してください。
import java.util.Arrays;
import java.util.List;
import org.apache.spark.ml.fpm.FPGrowth;
import org.apache.spark.ml.fpm.FPGrowthModel;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.*;
List<Row> data = Arrays.asList(
RowFactory.create(Arrays.asList("1 2 5".split(" "))),
RowFactory.create(Arrays.asList("1 2 3 5".split(" "))),
RowFactory.create(Arrays.asList("1 2".split(" ")))
);
StructType schema = new StructType(new StructField[]{ new StructField(
"items", new ArrayType(DataTypes.StringType, true), false, Metadata.empty())
});
Dataset<Row> itemsDF = spark.createDataFrame(data, schema);
FPGrowthModel model = new FPGrowth()
.setItemsCol("items")
.setMinSupport(0.5)
.setMinConfidence(0.6)
.fit(itemsDF);
// Display frequent itemsets.
model.freqItemsets().show();
// Display generated association rules.
model.associationRules().show();
// transform examines the input items against all the association rules and summarize the
// consequents as prediction
model.transform(itemsDF).show();詳細については、R API ドキュメント を参照してください。
# Load training data
df <- selectExpr(createDataFrame(data.frame(rawItems = c(
"1,2,5", "1,2,3,5", "1,2"
))), "split(rawItems, ',') AS items")
fpm <- spark.fpGrowth(df, itemsCol="items", minSupport=0.5, minConfidence=0.6)
# Extracting frequent itemsets
spark.freqItemsets(fpm)
# Extracting association rules
spark.associationRules(fpm)
# Predict uses association rules to and combines possible consequents
predict(fpm, df)PrefixSpan
PrefixSpan は、Pei et al., Mining Sequential Patterns by Pattern-Growth: The PrefixSpan Approach で説明されているシーケンシャルパターンマイニングアルゴリズムです。シーケンシャルパターンマイニング問題の形式化については、参照論文を参照してください。
spark.ml の PrefixSpan 実装は、次のパラメータを取ります。
minSupport: 頻繁なシーケンシャルパターンと見なされるために必要な最小サポート。maxPatternLength: 頻繁なシーケンシャルパターンの最大長。この長さを超える頻繁なパターンは結果に含まれません。maxLocalProjDBSize: ローカル反復処理が開始される前に、プレフィックス射影データベースに含まれることができるアイテムの最大数。このパラメータは、Executor のサイズに合わせて調整する必要があります。sequenceCol: データセット内のシーケンス列の名前 (デフォルトは "sequence")。この列に NULL がある行は無視されます。
例
詳細については、Python API ドキュメント を参照してください。
from pyspark.ml.fpm import PrefixSpan
df = sc.parallelize([Row(sequence=[[1, 2], [3]]),
Row(sequence=[[1], [3, 2], [1, 2]]),
Row(sequence=[[1, 2], [5]]),
Row(sequence=[[6]])]).toDF()
prefixSpan = PrefixSpan(minSupport=0.5, maxPatternLength=5,
maxLocalProjDBSize=32000000)
# Find frequent sequential patterns.
prefixSpan.findFrequentSequentialPatterns(df).show()詳細については、Scala API ドキュメント を参照してください。
import org.apache.spark.ml.fpm.PrefixSpan
val smallTestData = Seq(
Seq(Seq(1, 2), Seq(3)),
Seq(Seq(1), Seq(3, 2), Seq(1, 2)),
Seq(Seq(1, 2), Seq(5)),
Seq(Seq(6)))
val df = smallTestData.toDF("sequence")
val result = new PrefixSpan()
.setMinSupport(0.5)
.setMaxPatternLength(5)
.setMaxLocalProjDBSize(32000000)
.findFrequentSequentialPatterns(df)
.show()詳細については、Java API ドキュメント を参照してください。
import java.util.Arrays;
import java.util.List;
import org.apache.spark.ml.fpm.PrefixSpan;
import org.apache.spark.sql.Dataset;
import org.apache.spark.sql.Row;
import org.apache.spark.sql.RowFactory;
import org.apache.spark.sql.SparkSession;
import org.apache.spark.sql.types.*;
List<Row> data = Arrays.asList(
RowFactory.create(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(3))),
RowFactory.create(Arrays.asList(Arrays.asList(1), Arrays.asList(3, 2), Arrays.asList(1,2))),
RowFactory.create(Arrays.asList(Arrays.asList(1, 2), Arrays.asList(5))),
RowFactory.create(Arrays.asList(Arrays.asList(6)))
);
StructType schema = new StructType(new StructField[]{ new StructField(
"sequence", new ArrayType(new ArrayType(DataTypes.IntegerType, true), true),
false, Metadata.empty())
});
Dataset<Row> sequenceDF = spark.createDataFrame(data, schema);
PrefixSpan prefixSpan = new PrefixSpan().setMinSupport(0.5).setMaxPatternLength(5);
// Finding frequent sequential patterns
prefixSpan.findFrequentSequentialPatterns(sequenceDF).show();詳細については、R API ドキュメント を参照してください。
# Load training data
df <- createDataFrame(list(list(list(list(1L, 2L), list(3L))),
list(list(list(1L), list(3L, 2L), list(1L, 2L))),
list(list(list(1L, 2L), list(5L))),
list(list(list(6L)))),
schema = c("sequence"))
# Finding frequent sequential patterns
frequency <- spark.findFrequentSequentialPatterns(df, minSupport = 0.5, maxPatternLength = 5L,
maxLocalProjDBSize = 32000000L)
showDF(frequency)