データ分析初心者の備忘録

不定期で更新していきます。

バギング、ブースティングの概要とRでのXGboost実行例

XGboostを実務で使う機会がありそうなので勉強しているのですが、そもそもブースティングがどのような手法なのか、同じアンサンブル学習のバギングとの違いは何かといったことが気になったため調べた内容をまとめました。

目次

  • アンサンブル法
  • バギング
  • ブートストラップサンプル
  • ブースティング
  • アダブースト (Adaptive Boosting: AdaBoost)
  • 勾配ブースティング (Gradient Boosting)
  • GBDT (Gradient Boosting Decision Tree)
  • XGboost (eXtreme Gradient boosting)
  • RでのXGboost実行例
  • 参考文献

アンサンブル法

  • 様々な分類器を1つのメタ分類器として組み合わせ、分類器を個別に使用するよりも汎化性能高くする手法

バギング

  • アンサンブル法の1つであり、学習データのブートストラップサンプル(後述)を用いて複数のデータを学習させ、新しい入力データのクラスはそれらの識別器の多数決で決める手法
  • 個々の識別器の性能は弱い(ランダム識別器より少し良い程度)ため弱識別器と呼ばれる
  • 例えば、決定木は学習データの少しの変化で識別器の性能が大きく変化してしまうので不安定な識別器であり、弱識別器の代表例
  • 識別性能面で欠点があるが、バギングの欠点を補う手法としてブースティング(バギングとは異なる手法)やランダムフォレスト(バギングの一形態)がある
  • バギングの1種であるランダムフォレストでは、個々の決定木(弱識別器)の学習において特徴量をランダムに抽出することで性能を改善している

《メリット》
- ブートストラップサンプルによる学習を行うため、個々の識別器の学習は独立に並列的に行うことができる

《デメリット》
- 識別器が持つばらつきにはブートストラップサンプルのばらつきが反映されるのみであり、弱識別器間の性能が似かより、十分に性能強化ができない可能性がある

ブートストラップサンプル

  • N個のデータからN回復元抽出を行って作ったサンプルのこと
  • ブートストラップ法(再代入誤り率のバイアス補正に使われる手法)などで用いられている

ブースティング

  • アンサンブル法の1つであり、「分類の難しい学習データに焦点を当てており、個々の識別器の学習が直列的に行われる」点でバギングと異なる
  • 「分類の難しい学習データに焦点を当ている」つまり、具体的には誤分類された学習データを重点的に後の弱識別器で学習することで性能を向上させている
  • バギングでは学習にブートストラップサンプルを用いていたのに対し、ブースティングでは学習データからランダムに非復元抽出された学習データのサブセットを使用する
  • ブースティングを用いた手法に「アダブースト (Adaptive Boosting: AdaBoost)」「勾配ブースティング (Gradient Boosting)」「GBDT (Gradient Boosting Decision Tree)」「XGboost (eXtreme Gradient boosting)」などがある

《メリット》
- バギングより性能が良い

《デメリット》
- ブースティングアルゴリズムはバリアンスが高いことで知られており、学習データを過学習する傾向にある

アダブースト (Adaptive Boosting: AdaBoost)

  • ブースティングの1種で、学習データ全体を使って弱識別器をトレーニングする点でブースティング(原型)と異なっている
  • ブースティング同様、誤った学習データに対する重みを大きくし、正しく識別された学習データに対する重みを小さくすることで後に学習する識別器ほど誤りの多い学習データに集中して学習する手法である

勾配ブースティング (Gradient Boosting)

  • 各ステップのパラメタ最適化に用いる評価関数に勾配降下法を用いたブースティング

GBDT (Gradient Boosting Decision Tree)

  • 勾配ブースティングの1種で、弱識別器に決定木を用いたもの
  • アダブーストでは各ステップを更新する際学習データ全体を使っていた一方、GBDTではランダムに抽出したサンプルのみを用いている

XGboost (eXtreme Gradient boosting)

  • C++によって勾配ブースティングを高速化したもの
  • (ブースティング全般に言えることかもしれませんが)パラメタが多くチューニングが大変
  • Rで実行するためのパッケージとして{xgboost}、{caret}、{catboost}の3種類が提供されている

データアナリストの知り合いに聞いたところ、XGboostはパラメタが多くチューニングが大変ですが、その分チューニングによる精度向上が期待できる手法だそうです。なお、XGboostのパラメータチューニングに関しては以下のブログに詳細が載っていました。 XGBoostやパラメータチューニングの仕方に関する調査 | かものはしの分析ブログ

RでのXGboost実行例

RでXGboostを実行する際のパッケージとして{xgboost}、{caret}、{catboost}の3種類が提供されていますが(私の知る限り)、ひとまず{XGboost}で実行してみました。XGboostを実行する際の関数であるxgboostは引数としてdgCMatrix型のデータを受け取るため、学習データをdgCMatrix型に変換する必要があり、以下の実行例ではdata.table型に変換→dgCMatrix型に変換という方法でデータ処理しています。

library(xgboost)
library(Matrix) # dgCMatrixへ変換するために必要
library(data.table) 
library(GGally)
library(tidyverse)

#サンプルデータの作成
set.seed(5)
n <- 1000

x1 <- runif(n, min=0, max=10) + rnorm(n, sd=10)
x2 <- runif(n, min=0, max=10) + rnorm(n, sd=10)
x3 <- runif(n, min=0, max=10) + rnorm(n, sd=10)
x4 <- runif(n, min=0, max=10) + 0.3*x3 + rnorm(n, sd=10) #弱い相関
x5 <- runif(n, min=0, max=10) + rnorm(n, sd=10)
x6 <- runif(n, min=0, max=10) + x5 + rnorm(n, sd=10) #強い相関

#データ結合
df <- data.frame(x1=x1, x2=x2, x3=x3, x4=x4, x5=x5, x6=x6)

#相関係数行列を確認
ggpairs(df)

やや見づらいですが、各特徴量の相関が確認できます。 f:id:kuze3110:20180716004202p:plain

#目的変数の作成
e <- rnorm(n, sd=50)
y <- 1 + 1*x1 + 2*x2 + 3*x3 + 4*x4 + 5*x5 + 6*x6 + e

#データ統合
df <- data.frame(x1=x1, x2=x2, x3=x3, x4=x4, x5=x5, x6=x6, y=y)

#目的変数を2値にする
#ひとまず、平均以上か否かで2値に分類
y.mean <- mean(df$y)
df <- df %>% 
  dplyr::mutate(y=ifelse(y >= y.mean, 1, 0))

#データを標準化しておく
df.tmp <- df %>% 
  dplyr::select(x1:x6) %>% 
  scale() %>% 
  data.frame()

df.scaled <- df.tmp %>% 
  dplyr::bind_cols(df %>% select(y))

モデル作成と推定

#入力データは一度data.table形式に変換し、更にdgCMatrix形式へ再変換する必要がある
df <- data.table(df.scaled, keep.rownames = F)

#dgCMatrix形式に変換
sparse_matrix <- sparse.model.matrix(y ~. -1, data=df.scaled)

# 正解データ
output_vector <- df.scaled$y

# 多クラス分類
bst <- xgboost(data = sparse_matrix, 
               label = output_vector, 
               max.depth = 4, 
               eta = 1, 
               nthread = 2, 
               nround = 5, 
               objective = "binary:logistic") #2値分類なので"binary:logistic"を指定,多クラス分類であれば(objective="multi:softmax")を指定

# 推定結果
prds <- predict(bst, sparse_matrix) #教師データと同じデータを推定
df.scaled$predict <- prds
df.scaled <- df.scaled %>% 
  dplyr::mutate(predict=ifelse(prds >= 0.5, 1, 0))

# クロス集計
(tab <- table(df.scaled$predict, df.scaled$y))
#     0   1
# 0 469  28
# 1  34 469

# accuracy
(sum(diag(tab))/sum(tab))
#[1] 0.938

# feature importanceの確認
importance_matrix <- xgb.importance(model = bst)
print(importance_matrix)
# Feature       Gain      Cover  Frequency
# 1:      x6 0.56556564 0.30329810 0.24137931
# 2:      x4 0.17036548 0.24960335 0.24137931
# 3:      x5 0.14000350 0.22072380 0.15517241
# 4:      x3 0.08885910 0.14576602 0.20689655
# 5:      x2 0.02351642 0.06294260 0.12068966
# 6:      x1 0.01168987 0.01766612 0.03448276

# feature importanceをプロット
xgb.plot.importance(importance_matrix = importance_matrix)

以下はfeature importanceをプロットした結果 f:id:kuze3110:20180717234624p:plain

簡単にXGboostの概要とRでの実行方法を確認しただけですが、公式ドキュメントを見る限りやはりパラメータが多いので実務で使う前に更に勉強しておく必要がありそうです。

参考文献、ブログなど

Python機械学習プログラミング
はじめてのパターン認識
XGBoostやパラメータチューニングの仕方に関する調査 | かものはしの分析ブログ
勾配ブースティングについてざっくりと説明する - About connecting the dots.
Boosting(ブースティング)について調べたのでまとめる:AdaBoost / Gradient Boosting / XGBoostなど - St_Hakky’s blog
アンサンブル学習のブースティングとバギングの違いについて | データ分析とインテリジェンス
パッケージユーザーのための機械学習(12):Xgboost (eXtreme Gradient Boosting) - 六本木で働くデータサイエンティストのブログ
XGBoostの実装(R編)

ソーシャルゲームの分析事例まとめ

ソーシャルゲーム分析に興味があるものの、ソーシャルゲーム業界に詳しくないので他社でどのような分析が行われているのか過去の勉強会のスライドや記事を収集してまとめました。 調査方法は単純で、chromeのシークレットモードで「ソーシャルゲーム 分析」などと検索し、検索にヒットしたものから個人的に気になった事例を選定しています。 なお、4年前などのやや古いと思われる事例も自分にとっては参考になるので載せています。

目次

  • DAUを評価指標から捨てた会社の話
  • リアルタイムバトルでgloopsのデータマイニングがどう進化したのか…伊藤学氏が語る
  • 決定版:サービスの盛り上がり具合をユーザの数(DAU)から読み解く方法
  • Amebaソーシャルゲームにおけるr活用の体制と事例のご紹介
  • 【セミナーレポート】gloops山本氏がソーシャルゲームにおける大規模データの分析手法と活用手法を紹介…要諦はわかりやすく表現し改善に活かすこと
  • SED】勉強会 第5回ソーシャルゲームの行動解析
  • アニプレックスDeNA・マイネットのマーケ戦略。D2C Rセミナー「#MarketingLIVE」レポート

DAUを評価指標から捨てた会社の話

www.slideshare.net

  • 時期: 2013/05/18
  • 発表場所:TokyoWebmining
  • 企業:株式会社ドリコム
  • 発表者:ところてん氏

DAUとはDaily Active Userの略で、1日にアクセスしたユーザー数のことです。ARPU(Average Revenue Per User:ユーザー平均課金額)とよく合わせて利用されるようです。DAUはソーシャルゲーム業界で広く利用されるKPIですが、広告による急激なユーザー増加やユーザーの気まぐれな行動によるノイズの影響を受けてブレやすいという欠点があるようです。こちらの資料ではDAUの欠点を補う独自の指標について述べられています。なお、ドリコムだけでなく別の企業(gloopsやコロプラ)でもインストール後N日経過ユーザーのみをDAUとしてカウントし、広告によるノイズが含まれないようにするなど独自の工夫をしているようです。

リアルタイムバトルでgloopsのデータマイニングがどう進化したのか…伊藤学氏が語る

gamebiz.jp

リアルタイム・ギルドバトルゲームにおける分析の事例について紹介されています。白熱したバトルを演出するための工夫について述べられています。最適なマッチングを測るには同等な強さのユーザー同士のギルドを作り、ギルド同士のマッチングにおいても同等なレベル同士のマッチングが重要なようです。また、濃密なコミュニケーションが求められるギルドバトルのゲームでは、ソーシャル性のベースとなっている無課金ユーザーの重要性も高く、無課金ユーザーも十分楽しめるゲームにすることが大切だそうです。

決定版:サービスの盛り上がり具合をユーザの数(DAU)から読み解く方法

www.slideshare.net 2013年の資料で、DeNAの野上大介氏の発表です。 以下のようにDAUを「直近30日間におけるゲームプレイ日数」「1日における平均ゲームプレイ回数」の2軸で分け、色別でグラフにすることでDAUをユーザー行動の変化を読み取る指標として用いているようです。 f:id:kuze3110:20180204234110p:plain

Amebaソーシャルゲームにおけるr活用の体制と事例のご紹介

www.slideshare.net 2013年のサイバーエージェント アメーバ事業本部 高野雅典氏の資料です。 ギルドバトルゲームの分析事例が紹介されており、ギルド参加ユーザーの継続率に効く要因を決定木を用いて分析しています。 また、Amebaプラットフォーム内の別サービスの利用についてアソシエーション分析を用いて任意のサービスと相性の良いサービスを発見する取り組みが紹介されています。

【セミナーレポート】gloops山本氏がソーシャルゲームにおける大規模データの分析手法と活用手法を紹介…要諦はわかりやすく表現し改善に活かすこと

gamebiz.jp

データ分析の流れや改善策の提案時の見やすい資料の工夫、社内で開発されたツールの紹介がされています。 過去30日間のログイン日数でユーザーをBU(Base User)/FU(Follow User)に分ける分類方法とその欠点についての説明や、サンキーダイヤグラムを活用した導線改善事例が印象的でした。 f:id:kuze3110:20180205000723p:plain

SED】勉強会 第5回ソーシャルゲームの行動解析

www.slideshare.net

  • 時期:2015/08/31
  • 発表場所:株式会社シロク SED勉強会
  • 発表者:村松祐希氏 ユーザー行動をサンキーダイヤグラムで描画しユーザー行動を考察し、導線設計の参考にした事例紹介の他、ロジスティック回帰を用いて課金ユーザーの特徴を定量的に評価した事例が紹介されています。

アニプレックスDeNA・マイネットのマーケ戦略。D2C Rセミナー「#MarketingLIVE」レポート

mag.app-liv.jp

  • 時期:2017年9月26日
  • 発表場所:MarketingLIVE(アプリマーケティングのD2C RとRepro株式会社が共同で開いたセミナー)

以下3つの発表がまとめられています。

株式会社マイネット「Push通知によるリテンション向上施策について」

株式会社マイネット網浩樹 氏の発表では海外向けゲームアプリ「神界のヴァルキリー」を例に施策が紹介されていました。「キャラの魅力を十分に訴求できるリッチPush通知」「通知配信の適切な時間帯設定」「適切な通知を送るためのユーザーセグメント分け」の3点の工夫について述べられており、休眠復帰〜継続率の向上へとユーザーを導いてDAUを向上させた取り組みが述べられています。

株式会社DeNA「広告を正しく評価できていますか?」

株式会社DeNA 宣伝部デジタルマーケティンググループ グループマネージャー 川口隆史 氏の発表内容です。 DeNAではユーザを三分類し、広告では特に「未プレイユーザ向けの新規目的配信」と、「休眠ユーザ向けの復帰目的配信」を行っているとのことで、獲得ユーザー数を正しく評価するための5つのポイントと、獲得ユーザーのLTVを正しく評価する3つのポイントについて述べられていました。

(参考)獲得ユーザー数を正しく評価するための5つのポイント
  • 妥当なアトリビューション期間の設定 (新規目的配信 / 復帰目的配信)
  • できる限りビュースルーコンバージョンをカウント (新規目的配信 / 復帰目的配信)
  • 新規目的配信での復帰獲得も評価 (新規目的配信)
  • 再インストール復帰と起動復帰を両方カウント (復帰目的配信)
  • 復帰目的配信では自然復帰ユーザを考慮して評価 (復帰目的配信)

株式会社アニプレックス「アニメ・音楽・リアルイベントを連動したプロモーション」

バンドをもとにしたリズムゲーム「バンドやろうぜ!」の事例紹介では、ゲームに登場する個性的なバンドマンを演じる声優がリアルライブを実施し「2.5次元」のプロモーションを行った他、SNSを利用したコンテストを実施してリアルの世界でも盛り上がる工夫をしたとのことです。 また、「きららファンタジア」や「マギアレコード 魔法少女まどか☆マギカ外伝」での独自の事前登録のプロモーション方法についても紹介されています。

scikit-learnで使える機械学習手法まとめ


機械学習ライブラリscikit-learnを活用して実行できるアルゴリズムの特徴と実行方法、実行結果をまとめました。 アルゴリズムの実行にはUIC Machine Learning Repositoryに登録されているBreast Cancer Wisconsinデータセットを用いています。 なお、理論の説明というよりは使用する際の注意点や実行方法をメインに記載しています。

目次

  • 使用するデータセットの確認
  • パーセプトロン
  • ロジスティック回帰
  • SVM (サポートベクトルマシン)
  • 決定木
  • ランダムフォレスト
  • k近傍分類器(KNN: k-nearest neighbor classifier)

使用するデータセットの確認

UIC Machine Learning Repositoryに登録されているBreast Cancer Wisconsinデータセットを用います。 データセットの1列目はユニークIDで、2列目がクラスラベル(M、Bの2値)です。

import pandas as pd
import urllib

#データセットの読み込み
#breast cancer wisconsin dataset
df = pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases'
                     '/breast-cancer-wisconsin/wdbc.data', header=None)

print('rows, columns:', df.shape)
df.head()

f:id:kuze3110:20171015234448p:plain

なお、決定境界を可視化したい都合上、特徴量を2つに絞って学習に使います。

#使用する特徴量2個に絞った上でデータの確認
X = df.loc[:,[4,14]]
X.head()

データの確認のため、MとBのラベルごとにデータをプロットします。

%matplotlib inline
import matplotlib.pyplot as plt

X1 = df[df[1] == 'M'] #クラスラベルがMのデータを抽出
X1.head()
X1_array = X1.loc[:,[4,14]].values

X0 = df[df[1] == 'B'] #クラスラベルがBのデータを抽出
X0.head()
X0_array = X0.loc[:,[4,14]].values

plt.scatter(X1_array[:,0], X1_array[:,1], c = 'blue', marker = "x") #Mは青色で☓のマーカー
plt.scatter(X0_array[:,0], X0_array[:,1], c = 'red', marker = "s") #Bは赤色で■のマーカー

plt.title("scatterplot")
plt.xlabel("feature1")
plt.ylabel("feature2")
plt.show()

f:id:kuze3110:20171015234852p:plain

使用するデータセットをトレーニングデータとテストデータに分割

データセットを8:2の比率で分け、それぞれトレーニングデータ、テストデータとします。

from sklearn.cross_validation import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.20, random_state = 1)

データの標準化

from sklearn.preprocessing import StandardScaler

sc = StandardScaler()
sc.fit(X_train)
X_train_std = sc.transform(X_train)
X_test_std = sc.transform(X_test)

パーセプトロン

線形識別関数を用いたネットワークモデル。  完全な線形分離が不可能なデータセットでは収束しないため、一般に実務のデータ解析で使われることは少ない。

実行例

from sklearn.linear_model import Perceptron

#エポック数40, 学習率0.1でパーセプトロンのインスタンスを生成
ppn = Perceptron(n_iter=40, eta0=0.1, random_state=0)
#トレーニングデータをモデルに適合させる
ppn.fit(X_train_std, y_train)

#テストデータで予測を実施
y_pred = ppn.predict(X_test_std)
#誤分類のサンプルの個数を表示
print('Misclassified samples: %d' % (y_test != y_pred).sum())
#Misclassified samples: 12

from sklearn.metrics import accuracy_score
#分類の正解率を表示
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
#Accuracy: 0.89

f:id:kuze3110:20171015235528p:plain

コード中に出てくる「正解率」の定義は「1-誤分類率」。 不均衡データの場合はモデルの精度が悪くても正解率の値が高くなりがちなので注意が必要。

ロジスティック回帰

「回帰」という名前だが、回帰ではなく分類のためのモデルであり、 線形分離と二値分類に関して、パーセプトロンより優れた分類モデル。

実行例

from sklearn.linear_model import LogisticRegression
#ロジスティック回帰のインスタンスを生成
lr = LogisticRegression(C=1000.0, random_state=0)
#トレーニングデータをモデルに適合させる
lr.fit(X_train_std, y_train)

#サンプルの所属確率を予測
y_pred = lr.predict(X_test_std)
print('Misclassified samples: %d' % (y_test != y_pred).sum())
#Misclassified samples: 12

#正解率
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))
#Accuracy: 0.89

f:id:kuze3110:20171028164940p:plain

SVM (サポートベクトルマシン)

パーセプトロンの拡張と見なせる。 マージン(クラスを分離する境界線である「超平面」とこの超平面に最も近いトレーニングサンプルとの距離)を最大化させることが目的。 マージンの小さいモデルは過学習に陥りがち。 γパラメータの値を小さくするとトレーニングサンプルの影響力が大きくなり、到達範囲が大きくなることで決定境界がなめらかになる。

《利点》 カーネルトリックを使って非線形問題の解を求めることが可能である。 ロジスティック回帰よりも外れ値の影響を受けにくい。

《欠点》 予測を適切に行うために調節しなければならないパラメータの数が多い。

《補足》
バイアスとバリアンス
バリアンスが高い→過学習が発生しているモデル
バイアスが高い→学習不足になっているモデル

正則化
共線性(特徴量の間の相関の高さ)を処理する手法で、データからノイズを取り除き最終的に過学習を防ぐ
一般的にL2正則化が使われる
なお、正則化を正常に機能させるためには標準化が必要

実行例 (線形SVM)

from sklearn.svm import SVC
#線形SVMのインスタンスを生成
svm = SVC(kernel='linear', C=1.0, random_state=0)
#線形SVMのモデルにトレーニングデータを適合させる
svm.fit(X_train_std, y_train)

#予測
y_pred = svm.predict(X_test_std)
print('Misclassified samples: %d' % (y_test != y_pred).sum())
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

#Misclassified samples: 12
#Accuracy: 0.89

f:id:kuze3110:20171028170704p:plain

実行例 (カーネルSVM)

#RBFカーネルによるSVMのインスタンスを生成
svm = SVC(kernel='rbf', random_state=0, gamma=0.2, C=1.0)
svm.fit(X_train_std, y_train)

#予測
y_pred = svm.predict(X_test_std)
print('Misclassified samples: %d' % (y_test != y_pred).sum())
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

#Misclassified samples: 13
#Accuracy: 0.89

f:id:kuze3110:20171028170953p:plain

決定木

情報利得(information gain)が最大となるような特徴量でデータを分割する。
特徴量の標準化はしなくてもサンプルの分割に影響しないため、可視化する目的でない場合は標準化しなくても良い。
(決定木では数値の分割条件を値の大小関係として捉えるため、標準化が影響しない)

《補足》
情報利得
「親ノードの不純度」と「子ノードの不純度」の差
子ノードの不純度が低いほど、情報利得は大きくなる

不純度
ノードが純粋ではない程度、すなわちノードに異なるクラスのサンプルがどの程度の割合で混ざっているか定量化する指標
よく使用される不純度の指標としてジニ不純度エントロピー分類誤差がある
ジニ不純度とエントロピーは非常によく似た結果になることが多い

実行例

from sklearn.tree import DecisionTreeClassifier
#エントロピーを指標とする決定木のインスタンスを生成
tree = DecisionTreeClassifier(criterion='entropy', max_depth=3, random_state=0)
#決定木のモデルにトレーニングデータを適合させる
#決定木は特徴量のスケーリングが不要なため、X_train_stdでなくX_trainを使用
tree.fit(X_train, y_train)

X_combined = np.vstack((X_train, X_test))
y_combined = np.hstack((y_train, y_test))

#予測
y_pred = tree.predict(X_test)
print('Misclassified samples: %d' % (y_test != y_pred).sum())
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

#Misclassified samples: 15
#Accuracy: 0.87

f:id:kuze3110:20171028171125p:plain

ランダムフォレスト

決定木のアンサンブルである。
個々の決定木をトレーニングする際、全ての特徴量を評価するのではなくその一部をランダムに比較検討するだけ。

《利点》
分類性能が高い
パラメータの調整がそれほど必要でない
決定木ほど過学習に陥りやすくない ハイパーパラメータに適切な値を設定することについては「決定木」に比べてあまり悩む必要はなく、実際に検討が必要なパラメータは選択する決定木の個数(k)だけ

《補足》
アンサンブル
弱い学習アルゴリズムを組み合わせて強い学習アルゴリズムを構築するというもの

強い学習アルゴリズム
汎化誤差が改善され、過学習に陥りにくい

実行例

from sklearn.ensemble import RandomForestClassifier
#エントロピーを指標とするランダムフォレストのインスタンスを生成
forest = RandomForestClassifier(criterion='entropy', #criterionで指標を指定
                                n_estimators=10,  #n_estimatorsで木の数を指定
                                random_state=1,
                                n_jobs=2) #n_jobsパラメータはPCの複数のコアを使うことを指定している

#決定木同様、ランダムフォレストは特徴量のスケーリングが不要なため、X_train_stdでなくX_trainを使用
forest.fit(X_train, y_train)

#予測
y_pred = forest.predict(X_test)
print('Misclassified samples: %d' % (y_test != y_pred).sum())
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

#Misclassified samples: 14
#Accuracy: 0.88

f:id:kuze3110:20171028171342p:plain

k近傍分類器(KNN: k-nearest neighbor classifier)

怠惰学習(lazy learner)の一つ。
選択された距離指標に基づきデータ点を分類する。
データセットの特徴量に適した距離指標を選択することが重要。
距離指標としては単純なユークリッド距離が使われることが多く、その場合は各特徴量を標準化する必要がある。

《利点》
予測を行うにあたってのトレーニングを必要としない。

《欠点》
予測の計算コストが高い。

《補足》
パラメトリックモデル
トレーニングデータセットからパラメータを推定するため、元のトレーニングデータセットがなくても新しいデータを分類できる。
パーセプトロン、ロジスティック回帰、線形SVMなど。

ノンパラメトリックモデル
固定のパラメータ集合で特徴づけることができず、パラメータの個数はトレーニングデータセットとともに増加する。
決定木、ランダムフォレスト、カーネルSVMなど。

実行例

from sklearn.neighbors import KNeighborsClassifier
#k近傍法のインスタンスを生成
knn = KNeighborsClassifier(n_neighbors=5, p=2, metric='minkowski') #p=2で指標としてユークリッド距離を指定
#k近傍法のモデルにトレーニングデータを適合させる
knn.fit(X_train_std, y_train)

#予測
y_pred = knn.predict(X_test_std)
print('Misclassified samples: %d' % (y_test != y_pred).sum())
print('Accuracy: %.2f' % accuracy_score(y_test, y_pred))

#Misclassified samples: 14
#Accuracy: 0.88

f:id:kuze3110:20171028171638p:plain

t検定、カイ二乗検定の備忘録

■t検定
主に2群の平均値の差の検定に用いる。
母集団が正規分布に従っている場合、標本分散を用いて算出される統計量tが自由度n-1のt分布に従うという性質を用いて検定を行う。

なお、利用する際は以下の条件を満たしている必要がある。
1.標本が母集団から無作為に抽出されている 2.母集団が正規分布に従っている 3.2群が等分散である

なお、母集団分散が未知でも大標本の場合はt分布でなく正規分布とz統計量を用いて同様の検定をしても問題ないようである。

実行例

#データの確認
summary(iris)
head(iris)
#  Sepal.Length Sepal.Width Petal.Length Petal.Width Species
#1          5.1         3.5          1.4         0.2  setosa
#2          4.9         3.0          1.4         0.2  setosa
#3          4.7         3.2          1.3         0.2  setosa
#4          4.6         3.1          1.5         0.2  setosa
#5          5.0         3.6          1.4         0.2  setosa
#6          5.4         3.9          1.7         0.4  setosa

#setosaとvirginicaのがく片の長さについてt検定を行う
setosa_length <- iris$Sepal.Length[iris$Species=="setosa"]
virginica_length <- iris$Sepal.Length[iris$Species=="virginica"]

t.test(setosa_length,virginica_length,paired = FALSE)
#データに対応がある場合paired = TRUEを指定する必要がある

#  Welch Two Sample t-test
#
#data:  setosa_length and virginica_length
#t = -15.386, df = 76.516, p-value < 2.2e-16
#alternative hypothesis: true difference in means is not equal to 0
#95 percent confidence interval:
#  -1.78676 -1.37724
#sample estimates:
#mean of x mean of y 
#    5.006     6.588 

カイ二乗検定
分割表において、2つの分類基準が独立であるかどうかを調べるために使われることが多い。(ピアソンのカイ二乗検定)
観測度数と期待度数の差を用いた統計量Χがカイ二乗分布に従うことを利用した検定。

なお、以下の場合はカイ二乗検定を使うべきではない。 ・条件間に対応がある場合 ・観測度数が20未満の場合 ・期待度数が5未満のセルがある場合

実行例

#データ読み込み、確認
dat <- data.frame(Titanic)
summary(dat)
head(dat)
#  Class    Sex   Age Survived Freq
#1   1st   Male Child       No    0
#2   2nd   Male Child       No    0
#3   3rd   Male Child       No   35
#4  Crew   Male Child       No    0
#5   1st Female Child       No    0
#6   2nd Female Child       No    0
#Freq列でサンプルの出現頻度がわかるようになっている

dat <- dat[dat$Freq!=0,] #頻度が0のデータを除外

#1行1サンプルになるようデータを加工する
titanic.df <- data.frame(Class=rep(dat$Class[1],dat$Freq[1]), #データの出現回数だけ行を増やす
                         Sex=rep(dat$Sex[1],dat$Freq[1]),
                         Age=rep(dat$Age[1],dat$Freq[1]),
                         Survived=rep(dat$Survived[1],dat$Freq[1]))

for (i in 2:nrow(dat)) {
  titanic.df_sub <- data.frame(Class=rep(dat$Class[i],dat$Freq[i]),
                           Sex=rep(dat$Sex[i],dat$Freq[i]),
                           Age=rep(dat$Age[i],dat$Freq[i]),
                           Survived=rep(dat$Survived[i],dat$Freq[i]))
  titanic.df <- rbind(titanic.df,titanic.df_sub)
}

#クロス集計
(test <- xtabs(~Age + Survived, data =  titanic.df))
#       Survived
#Age       No  Yes
# Child   52   57
# Adult 1438  654

#カイ二乗検定
chisq.test(test)

#  Pearson's Chi-squared test with Yates' continuity correction
#
#data:  test
#X-squared = 20.005, df = 1, p-value = 7.725e-06

#chisq.test()ではデフォルトでイェーツ補正がかかるようになっている点に注意

Rで自然言語処理(の準備)

統計ソフトのRを使って自然言語処理をする際に必要な設定のメモです。(インストール方法などはよく忘れてしまうため。。)

 

手順は以下の通りです。なお、Windows7の場合を想定しています。

  • Rのインストール
  • Rstudioのインストール
  • MeCab(形態素解析エンジン)のインストール
  • RMeCab(R上でMeCabを使うためのパッケージ)のインストール
Rのインストール

以下にあるRのダウンロードサイトから インストーラをダウンロードできます。

https://cran.ism.ac.jp/

Download R for Windows>baseの手順で最新版が手に入ります。なお、過去のバージョンを入手したい場合は「Previous releases」から入手可能です。

 

Rstudioのインストール

以下のRstudio公式ページから「Download」を選択してダウンロードできます。こちらもインストーラ形式なので苦労しないです。

www.rstudio.com

 

MeCabのインストール

以下のサイトで「mecab-0.996.exe:ダウンロード」をクリックするとインストーラがダウンロードできます。

http://taku910.github.io/mecab/

なお、MeCab京都大学情報学研究科−日本電信電話株式会社コミュニケーション科学基礎研究所 共同研究ユニットプロジェクトを通じて開発されたオープンソース 形態素解析エンジンです。 また、平均的に ChaSen, Juman, KAKASI (いずれも形態素解析エンジンの一種) より高速に動作します。 ちなみに和布蕪(めかぶ)は, 作者 (工藤拓) の好物です(ダウンロードサイトより一部引用)。

 

コマンドプロンプト上で動くので、システム環境変数のPathを通す必要があります。

 

マイコンピュータ>プロパティ>詳細設定>環境変数>Path で設定が可能です。自分のPCでインストールした場所を追加する (デフォルトではC:\Program Files\MeCab\bin)。

 

コマンドプロンプトを開き (スタートメニュー>ファイル名を指定>cmdと入力) 、mecabと打ち込んでMeCabが起動すれば正しく設定できています。試しに「すもももももももものうち」を入力すると、ちゃんと分解できます。

f:id:kuze3110:20161106223612p:plain

 

RMeCabのインストール 

 Rstudioを起動し、コンソール上で以下のコードを実行すればインストールできます。

install.packages("RMeCab", repos = "http://rmecab.jp/R") 

これで準備完了です!