差分

このページの2つのバージョン間の差分を表示します。

この比較画面へのリンク

両方とも前のリビジョン前のリビジョン
次のリビジョン
前のリビジョン
mselab:2012:stat:week3:r2 [2012/12/18 10:03] watalumselab:2012:stat:week3:r2 [不明な日付] (現在) – 外部編集 (不明な日付) 127.0.0.1
行 1: 行 1:
 ===== 統計工学実験 第3週 ===== ===== 統計工学実験 第3週 =====
 +==== 連絡 ====
 +
 +  * [[mselab:2012:stat:week3:r2#k-means法による層別_itermax追加_nstart削除|実験室で発生したkmeans関数についての不具合へ対応]]を追記。
 +==== 最終課題 ====
 +
 +  * 学習用データ(tic.learn)に基づいて、V86の契約に関するモデルを構築し、訪問対象に加える条件(訪問ルール)を提案せよ。
 +    * 学習機械にはlm()かrpart()しか使わない。
 +    * 層別のモデル構築も、候補に加える。
 +    * 層別の生成には、データの集計、決定木の他に、k-means法によるクラスタリングも候補に加える。
 +  * 提案した訪問ルールの契約達成率などを、検証用データ(tic.eval)に適用して検討せよ。
 +  * 学習用データでモデルを学習し、検証用データで精度を検討する、という縛りの中で、最適な訪問ルールを定めよ。これがこの実験の最終成果物である。
 +
 +==== 準備 ====
 +
 +準備。
 +
 +<code>
 +Sys.setenv("http_proxy"="http://130.153.8.66:8080/")
 +install.packages(c("mvtnorm", "mvpart"), dependencies=TRUE)
 +library(mvtnorm)
 +library(mvpart)
 +library(MASS)
 +</code>
 +
 +データがない人は、次のコードも実行する必要がある。
 +
 +<code>
 +tic.learn <- read.table("http://kdd.ics.uci.edu/databases/tic/ticdata2000.txt")
 +tic.eval <- read.table("http://kdd.ics.uci.edu/databases/tic/ticeval2000.txt")
 +tic.test <- read.table("http://kdd.ics.uci.edu/databases/tic/tictgts2000.txt")
 +tic.eval <- cbind(tic.eval, tic.test)
 +colnames(tic.eval)[86] <- "V86"
 +rm(tic.test)
 +</code>
 +
 +さらに先週のレポート課題と同様に、V1とV5のグループ化も済ませるとよいかもしれない。
 +あるいは今週の課題で改めて、グループ化を見直してもよい。
 +
 ==== クラスタリング ==== ==== クラスタリング ====
 +
 +データの層別を行う方法の総称。生成した層のことを、クラスタ(群)という。大きく階層クラスタリングと非階層クラスタリングに分かれる。
 +
 +階層クラスタリングは、レコード間の距離を全ての組み合わせについて算出して作成した行列を距離行列から出発する。
 +まずは最も近いレコード同士をグループ(群)にまとめる。その結果、2レコードは1つのクラスタに属するが、残りのレコードは点のままである。
 +そのクラスタと残りのレコードの間の距離行列を算出し、最も近いレコード同士、最も近いレコードとグループ、もしくは最も近いグループ同士を再びグループに\\
 +まとめる。
 +これを繰り返すことで、クラスタ(群)分けを得るのが、階層クラスタリングである。
 +階層クラスタリングには、レコード同士の距離だけでなく、レコードとグループの距離、グループ同士の距離、を定める必要がある。
 +またクラスタを生成する過程をグラフに表したものを、デンドログラムと呼ぶ。
 +
 +それに対して、クラスタ(群)ごとの群内のばらつきが最小になるように、目的関数を定め、離散最適化法を用いてクラスタを生成するのが、非階層クラスタリング\\
 +である。
 +代表的な非階層クラスタリングのひとつである$k$-means法では、各群のユークリッド距離の平均が最小になるように、クラスタ平均を付置する。
  
 === k-means法によるクラスタリング === === k-means法によるクラスタリング ===
行 90: 行 142:
     * バギング (Bagging)     * バギング (Bagging)
  
-==== 最終課題 ==== +==== 層別 ====
- +
-  * 学習用データ(tic.learn)に基づいて、V86の契約に関するモデルを構築し、訪問対象に加える条件(訪問ルール)を定めなさい。 +
-    * 学習機械にはlm()かrpart()しか使わない。 +
-    * 層別のモデル構築も、候補に加える。 +
-    * 層別の生成には、データの集計、決定木の他に、k-means法によるクラスタリングも候補に加える。 +
-  * 上で定めた訪問ルールを、検証用データ(tic.eval)に適用して、契約の達成率を検討しなさい。 +
-  * 学習用データでモデルを学習し、検証用データで精度を検討する、という縛りの中で、最適な訪問ルールを定めなさい。 +
- +
- +
-準備。 +
-<code> +
-install.packages(c("mvtnorm", "mvpart"), dependencies=TRUE) +
-library(mvtnorm) +
-library(mvpart) +
-library(MASS) +
-</code> +
  
 === k-means法による層別 === === k-means法による層別 ===
行 148: 行 183:
  
 V1は1から41の値を取ることが確認できたら、次のように、clusterという変数をtic.learn内に作り、まず0で埋める。 V1は1から41の値を取ることが確認できたら、次のように、clusterという変数をtic.learn内に作り、まず0で埋める。
-そして、V1の値ごとに層の値を指定するコードを書き、Rに実行させる。+そして、V1の値ごとに層の値を指定するコードを書き、Rに実行させる。下記は、先週に行った決定木分析を踏まえた層別の例である。
  
 <code> <code>
行 249: 行 284:
 table(tic.learn$cluster) table(tic.learn$cluster)
 </code> </code>
 +
 +=== 検証用データの層別 ===
 +
 +検証用データに層別変数 cluster を加えるには、上のコードの「tic.learn」をすべて「tic.eval」に変えればよい。
 +
 +==== 層別後の解析 ====
 +
  
 === 層別後の解析 === === 層別後の解析 ===
行 500: 行 542:
 以上のように、層別も加えて分析して作り上げたモデルが、目標を達成しているかどうか、を検証用データ (tic.eval) で確認する。 以上のように、層別も加えて分析して作り上げたモデルが、目標を達成しているかどうか、を検証用データ (tic.eval) で確認する。
  
 +
 +==== レポート提出について ====
 +
 +レポート提出要領:下記「XXXXXXX」は各自の学籍番号(半角文字)で置き換えること
 +
 +^項目^指定^
 +|提出期限|実験実施の翌週の月曜日の午後7時0分まで (でも今回は12月25日から冬休みなので、12月25日の午後7時でいい)|
 +|提出方法|電子メールに添付 (宛先は配付資料に記載)|
 +|ファイル形式|Wordファイル (LaTeXで作成する場合は、dvipdfmxでPDFに変換すること)|
 +|メールの件名|統計実験3レポート提出(XXXXXXX)|
 +|レポートファイルの名称|統計実験3_XXXXXXX.doc あるいは 統計実験3_XXXXXXX.docx|
 +|提出部数|レポートは各自1通ずつ。{{:mselab:report-header-2012.doc|レポートの表紙}}に、共同実験者の学籍番号と氏名を記すこと。|
 +
 +
 +==== 実験当日の修正 ====
 +
 +自分のMacだと問題が発生せず、実験室のPCだとRが落ちる不具合があります。メモリが少ないためかもしれません。Rが勝手に終了する場合には、kmeansのコードは次のように nstart を削除し、iter.max を追加する修正をお願いします。
 +
 +=== k-means法による層別 (iter.max追加、nstart削除) ===
 +
 +k-means法は、数値変数でしか用いられないため、データは「tic.learn[, c(1:85)]」と数値変数のフィールドを指定してkmeans()関数を実行する。
 +<code>
 +tic.learn.kmeans <- kmeans(tic.learn[, c(1:85)], centers=2, iter.max=100)
 +</code>
 +
 +k-means法の結果を適用するには、レコードごとに「centers」の座標とのユークリッド距離を算出し、一番小さくなる層にその変数を割り当てる。
 +
 +<code>
 +date()
 +tic.learn$cluster <- rep(0, dim(tic.learn)[1] )
 +for( i in c(1:dim(tic.learn)[1]) ) {
 +  tic.kmeans.dist <- rep(0, max(tic.learn.kmeans$cluster) )
 +  for( j in c(1:max(tic.learn.kmeans$cluster)) ) {
 +    tic.kmeans.dist[j] <- sum( (tic.learn[i,c(1:85)]-tic.learn.kmeans$center[j,])^2 )
 +  }
 +  tic.learn$cluster[i] <- sort.list(tic.kmeans.dist)[1]
 +}
 +date()
 +</code>
 +
 +念のため、kmeansの結果と比較して、計算に誤りがないことを確認するためにクロス集計を行う。この結果が対角であれば、計算はあっている。
 +
 +<code>
 +table(tic.learn$cluster,tic.learn.kmeans$cluster)
 +</code>
 +
 +centers=に指定する値は、いろいろ変えてみるといい。