スパースモデリング技術
1. 少ないデータで分析できるAIソリューション
ディープラーニング1では、多くのデータから統計的に本質部分を捉えることを目指すが、スパースモデリング技術では少ないデータで本質に近づくことです。
意思決定者が求めるデータを集め分析できる資料を提示するためには多大な労力が必要であるが、スパースモデリング技術を用いることで迅速に資料作成が可能となり、結果、業務改善に役立てることができます。
スパースモデリング技術も「相関の強い説明変数が別にある場合、どちらか一方しか抽出できない」「線形回帰がベースなので、非線形の関係がある説明変数は抽出できない」という欠点はありますが、ビジネスで活用するには陳腐化しないデータによるスピーディーな分析ができることは大きなアドバンテージとなります。
2. 機械学習とスパースモデリング
2-1. 機械学習について
「来客数、気温、天気や立地から売上を予測したい」というテーマを「勘と経験」に頼らなくシステム化する場合機械学習を用いれば「売上予測」に対して入力と結果に潜む関連性を機械に学び取らせることで予測や分類といったタスクを実行するシステムを作ることができます。
機械学習と通常のシステムの違いは、機械学習のシステムは「間違えることがある」ということです。ここで、通常のシステムでは不具合を修正することができますが、機械学習のシステムでは説明が困難です。
以下のケースでは、機械学習のシステムには向きません。
- データを集めるのにコストや時間がかけられない。
- 結果に対する説明が求められる。
2-2. スパースモデリングについて
「データが少ない」状況でも「解釈性の高い」結果を導き出すことができます。
数学の理論に裏打ちされているので安心できます。
特性
- スパースモデリングAIは、少量データでも高精度ソリューションの提供ができます。
- 結論にいたった根拠もフィードバックができるので、次の展開への応用が可能です。
2-3. スパースモデリングの手法Lasso
データが少なく説明責任が求められる状況に力を発揮するスパースモデリングの中には、様々な手法があります。
スパースモデリングの代表的な手法であるLASSOについて確認します。
ベースは次の線形回帰2の式となります。 $$y_{i} = β_{1}x_{1} + \cdot\cdot\cdot + β_{p}x_{n} + ε$$
3. スパースモデリングの手法Lasso
対象のデータ(x,y)から各βを算出してモデルを作成するのですが、xの変数が非常に多いがデータ点数が少ない場合は、各βを算出することが数理的にできません。
このような場合、「目的変数に関与するのは僅かな説明変数のみ(スパース性という)」という仮定を置くことで、絞り込んだ目的変数についてのβを算出することができます。 これを解くための統計理論を*Lasso(L1正則化)*と言います。
Lassoの特徴
- データレコード数よりデータ種類数(変数)が多い場合(p>n)でも、解くことができる。
- 変数の絞り込みや係数の重みより、重要なデータの種類が何かが直感的に理解可能である。
次のような状況を解決してくれる事が期待できます。
- データの種類はたくさんあるがデータ点数は十分にない。その場合でも解析できる。
- 多くのデータ種の中から、予測において重要なデータ種のみを知る事ができる。
4. R言語を用いての実装
R言語でLASSOについてはglmnet、HMLassoについてはhmlassoというパッケージをインストールします。
# Install package for Lasso
if(!require("glmnet")){
install.packages("glmnet", dependencies = T)
}
# Install package for HMLasso
if(!require("hmlasso")){
install.packages("hmlasso", dependencies = T)
}
5. 解パスの生成
An Introduction to glmnet を参考にします。
λという変数の削減度を強めるパラメータがあるのですが、この値を推移した際に、変数の個数や各変数の大きさがどの程度変動していくかを示した図を生成することができます。
まず、データを作成します。
data(QuickStartExample)
x <- QuickStartExample$x
y <- QuickStartExample$y
解パスを作成します。
library(glmnet)
data(QuickStartExample)
fit <- glmnet(x,y) # このxはMatrix型である必要がある点に注意
plot(fit) #解パス作成
色ごとに各係数の値の推移を示しています。 x軸はL1正則化の強さ(λの大きさ)を表しており、またy軸は各係数の大きさを表しています。なお、各xは標準化(平均0、標準偏差1となるように変換)が自動でされているので、データの大小等を気にせずに、係数の大小を比較することができます。
左に行くほどλ値が小さくなっているので、スパース性が弱くなり変数が多くなっています。 解パスはこのようにλを推移した際に、各係数値がどう変わるかを可視化する図なので、変な推移になっていないかを確認します。
6. λをクロスバリデーション(CV)で決定
CVで最もエラーの小さいλを計算して決めます。
CVは経験的にfold数を10か5で行うのが良いとされていますので、デフォルトの10のままにします。
cv.fit <- cv.glmnet(x,y) #CrossValidationの実施
cv.fit$lambda.min #CrossValidationで得られた最良のlambda値
結果
[1] 0.07569327
7. 決定したλを適用してモデルの作成と係数の確認
CVで決定したλを適用し、L1正則化での線形回帰モデルを作成します。その後coef関数を使って変数を確認します。
fit <- glmnet(x, y, lambda=cv.fit$lambda.min)
coef(fit) #係数の一覧が表示される
結果
21 x 1 sparse Matrix of class "dgCMatrix"
s0
(Intercept) 0.14867809
V1 1.33376362
V2 .
V3 0.69787555
V4 .
V5 -0.83726103
V6 0.54334630
V7 0.02668587
V8 0.33740506
V9 .
V10 .
V11 0.17105939
V12 .
V13 .
V14 -1.07553017
V15 .
V16 .
V17 .
V18 .
V19 .
V20 -1.05279163
.と記載された変数は除外された変数になります。 また、各変数は正則化されているので、係数値の大小等から目的変数の寄与度を確認することが可能になっています。
今回の場合、20種類の目的変数があったのが、9個まで候補が絞られ、かつ、正の関係が1番目の変数(V1)に、負の強い関係が20番目の変数(V20)にある事が推定されました。
このように見る事で、データの関連度について候補を絞ることと関係性の大小を同時に推定する事ができます。
8. まとめ
【少ないデータで分析できるAIソリューション】として、「スパースモデリングによる高次元小標本データの解析のLasso(L1正則化)」について確認してみました。
参考資料
- ITエンジニアのためのスパースモデリング入門:染田 貴志 (著), 木虎 直樹 (著), 宇佐見 一平 (著), 増井 隆治 (著), 田辺 広樹 (著)