情報工学実験 4 : データマイニング班
(注意)実験内容を煮詰めきれていないこともあり、行き当たりばったりになる可能性が高いです!- データマイニング班学生公開用Wiki
- 授業内容と方法
- 達成目標
- スケジュール案&目安
- ステージ1(1~3週目): 事例紹介, 環境構築, Pythonチュートリアル, ユニットテスト
- ステージ2(4~6週目): データマイニング/機械学習概観, チュートリアル: scikit-learn
- ステージ3(7~9週目): 自然言語処理ツールの演習、テーマ設計
- ステージ4(9~10週目): テーマ設計
- ステージ5(11~16週目): 個別/グループ開発, 発表, 公開
- 参考文献・サイト
- 授業内容と方法
-
データの山を採掘することで「データの中に埋め込まれている(有用な)知識を発掘」することをデータマイニング(data mining)と呼ぶ。別の言い方では、データマイニングは、より良い意思決定をするために履歴データをうまく使って一般的な規則性を発見しようとする研究分野である。
データマイニングの手続きとしては、(1)対象領域の理解、(2)データの準備、(3)パターン(知識)の発見、(4)パターンの事後処理(可視化、解釈など)、(5)結果の活用、といった一連のステップを繰り返すことが多い。
今回の実験においては、scikit-learnによる機械学習を用いたチュートリアルを通してデータ・マイニングを概観する。 また、自然言語処理を導入した文書分類や類似文書検索といった例を基に、構造化されていないテキストデータから有用な情報を得るテキスト・マイニングにも踏み込む。
- 達成目標
-
- バージョン管理(Mercurial)、ユニットテスト(unittest2予定)を用いて開発することができる。
- データ・マイニングのプロセスを踏まえ、各手続きを自動化することで実験を効率良く進めることができる。
- データセットがどのような背景・状況でどのように構築されたのかを解釈し、目的とするマイニングに必要なデータ(特徴/説明変数/素性)の取捨選択を検討/実施することができる。
- 非(半)構造化データに対し、マイニングに適したデータセットを検討/構築することができる。
- 属性選択&構造化されたデータセットに対し、データマイニングを適用することで得られた知識を可視化・解釈する手段について検討/実施することができる。
- (可視化・解釈した結果から有用な知識にについて説明することができる)
- 開発したプログラムを再利用可能な形で公開できる。
- 実験再現に必要なプログラムやデータを整理して用意できる。
- 実験を再現する手順をドキュメントとして用意できる。
ステージ1: 事例紹介, 環境構築, Pythonチュートリアル, ユニットテスト
1週目
- 事例紹介: 電子マネー顧客分類のための手法検討と解析結果に関する報告 : 自己組織化マップと協調フィルタリングを用いたクラスタリング (電子情報通信学会技術研究報告. KBSE, 知能ソフトウェア工学, 2006)
- 関連事例: Tポイントの会員データ分析から企業は何を知るのか
- 関連事例: Tポイントは本当は何をやっているのか(2012/9/3)
- Level 0: オープンソース概観の確認
- Web&Mercurialサーバ、Wikiのアカウント等について。
- Mercurial演習(hg init/status/add/commit/push/log/pull/merge/resolve)
- 環境構築
- Python演習: [ 公式チュートリアル | 補足 ]
他にもPython-izmなど自由に参照OK。まずは基本を身につけよう。
2週目
- (残): Level 0: オープンソース概観の確認
- 事例紹介
- 日本語オントロジー辞書Ontolopediaの構築と興味抽出手法への応用検討 (2008年度修士論文, 宮城良征): "presen:HG/tnal/doc/master2008-yosshi.key.pdf"
- 共起情報を用いた Web ページを特徴付けるメタデータ生成方式の提案と情報検索への応用 (2009年度修士論文, 小野裕作): "presen:HG/tnal/doc/master2009-yono.pdf"
- 参考文献: ツイートプロファイリング
- Mercurial演習 (Level 1含む)
- (続): Python演習: [ 公式チュートリアル | 補足 ]
- 次週予定: 事例紹介+Python続き?ユニットテスト?scikit-learn入門?
3週目
- (Mercurial演習) Level 1: 衝突を回避してみよう の確認
- 事例紹介
- SIFT特徴量から構築した共起情報に基づく一般物体認識手法の提案 (2011年度修士論文, 下地竜雄馬): "presen:HG/tnal/doc/master2011-ryouma.key.pdf"
- Twitter上で行われる議論構造可視化のためのツイート種別推定・話題クラスタリング手法の検討 (2011年度修士論文, 与儀涼子): "presen:HG/tnal/doc/master2011-suzu.key.pdf"
- 関連記事: 空気を読んで論文を紹介するtwitter-bot 「論文ったー」つくってみた。 - YamadaToshiyukiの日記
- (続): Python演習: [ 公式チュートリアル | 補足 ]
- ユニットテスト: docstring + doctest
- 次週予定: 事例紹介+Python続き?scikit-learn入門?
データマイニング/機械学習外観
4週目
- 事例紹介
- 学習指導要領に基づいた設問自動分類タスクにおける分類精度向上に関する研究 (2012年度修士論文, 名嘉真之介): "presen:HG/tnal/doc/master2012-nakashin.pdf"
- Googleが「CAPTCHA」を改良、リスク分析により人間と機械を区別 (web記事)
- (続): Python演習: [ 公式チュートリアル | 補足 ]
- 機械学習外観: scikit-learn
- An introduction to machine learning (tutorial)
- problem setting
- supervised learning (classification / regression)
- unsupervised learning (clustering)
- example dataset
- learning and predicting
- problem setting
- 参考: データマイニング (神嶌敏弘先生の講義資料)
- An introduction to machine learning (tutorial)
- 課題: Level 2: 分類問題についての検討
機械学習の代表的な使い道の一つである「分類問題」とは、データ(サンプル)をカテゴリ(クラス/ラベル)に分類する問題(個々の事例を適切なカテゴリに割り当てる問題)です。教師あり機械学習では、用意されたデータとカテゴリを基に、「このカテゴリに属するデータはどのようなものか」というパターン(分類規則)を学習します。
学習した結果(モデル)は「分類器」と呼ばれることが多いですが、その分類器が適切なパターン(分類規則)を得ることができていれば、未知データに対しても適切なカテゴリに割り当てることができるでしょう。
上記を踏まえて、「分類問題」について以下の点について検討し、報告せよ。なお、参照した文献/Webサイト等があれば参考文献として示すこと。
- (1) (自分が分類したい)具体的な分類問題について述べよ。
自分が望んだ分類器を構築するためには、どのようなデータとカテゴリを用意したら良いだろうか。ここでは分類器への入出力だけを問うものとする。
- (2) チュートリアルで用いたSVMなり、何らかの機械学習を用いて分類器を構築したとする。その分類器の質はどのように評価したら良いだろうか。
- 提出先: データマイニング班学生公開用Wiki
- (1) (自分が分類したい)具体的な分類問題について述べよ。
- 次週予定: 機械学習外観(スコア/パラメータ調整/線形回帰)
5週目
- 振り返り: classification / machine-learning / scikit-learn
- Level 2 確認
- 記事紹介
- 機械学習 はじめよう (gihyo.jp)
- 振り返り: classification (scikit-learn)
- 機械学習外観: scikit-learn
- Choosing the right estimator
- Model selection: choosing estimators and their parameters
- 補足: オープンテスト (estimator.fit + estimator.score + np.random.permutation, cross_validation)
- Linear Regression Example
データセット diabetes の説明: [ sklearn.datasets.load_diabetes | Diabetes Data ]
- 課題: Level 3: digits データセットに対し3分割交差検定してみよう
データセット digits において svm.SVC で分類器を構築したい。その際、構築した分類器はパラメータやデータセットに依存して結果が異なるはずだが、ここではパラメータは固定し、データセットのみを学習・テストデータを複数回入れ替えて試すことで分類器がうまく構築できたかを評価したい。そこで、ここでは3分割交差検定を用いることにしよう。つまり、ここでは、
・データセットの並び順をランダムに入れ替え、
・3分割交差検定により推定結果を平均化する。
という手順で分類器を評価するものとする。また、学習は以下のように用意した分類器を用いるものとする。
from sklearn import svm clf = svm.SVC(gamma=0.001, C=100.)
上記を踏まえて、以下の手順でプログラムを作成せよ。- (1) データセットの並び順を np.random.permutation により入れ替える際、シード値を「各自のアカウントから英字を除いた6桁数字」で初期化したインデックスを生成せよ。なお、作成したインデックスには重複や過不足がないことを doctest を使って確認すること。
- (2) docstring 形式でコメントを書くこと。
- 提出先: 各自のリポジトリ
- 次週予定: 機械学習外観(スコア/パラメータ調整/線形回帰), パラメータ調整, グラフ描画
6週目
- 振り返り: classification / regression / clustring
- Level 2 確認 (2名)
- Level 3 確認
- 記事紹介
- Model selection and evaluation
- モデルのパラメータ調整の演習
- Clustering
- クラスタリング、3次元グラフ
- 課題: Level 4: クラスタリングについての検討。
機械学習の代表的な使い道の一つである「クラスタリング」では、「サンプル(N次元の特徴ベクトル)集合」として用意されたデータセットにおいて、似たようなサンプル同士を「同じクラスタ」に分類することでサンプル全体をいずれかのクラスタに分類することを目的としている。
手法の特徴としてはK-meansに代表されるトップダウンな手法、ウォード法に代表されるボトムアップ的手法に大別することが多い。どの手法も一般的には、「サンプル間の距離をどのように計測するか」、「初期値をどのように設定するか」等によってクラスタリング結果が大きく異なることも珍しくない。そのため、適切なクラスタを得るために、「適切なクラスタ ≒ 良く見られる(現れる)クラスタ ≒ 意味がありそうなクラスタ」と考え、複数回試行した結果を俯瞰して観察することも少なくない。
上記のような特性を踏まえた上で、クラスタリングについて以下の点について検討し、報告せよ。
- (1) (適用してみたい)具体的なクラスタリング問題について述べよ。
どのようなデータセットにクラスタリングを適用したい? 各サンプルの特徴ベクトルは2次元以上とする。可能な範囲でサンプルを具体的な特徴ベクトルで複数事例表現してみよう。またそのデータセットにクラスタリングを適用する意図は何だろうか?
- (2) クラスタリング結果の評価について。
一般的にクラスタリングには教師データが無いことが多い。もしくは教師データがあったとしても、教師あり学習では得られない結果を求めているからこそ教師無し学習を実行することが多い。クラスタリング結果の妥当性や適切さについて、どのように評価したら良いだろうか?
- 提出先: データマイニング班学生公開用Wiki
- (1) (適用してみたい)具体的なクラスタリング問題について述べよ。
- 次週予定: 機械学習外観(クラスタリング), 自然言語処理外観?
7週目
- 振り返り: classification / regression / clustring
- Level 3 確認 (3名)
- Level 4 確認
- 記事紹介
- Semi-Supervised
- 半教師あり学習の練習
- 課題: Level 5: 各自orグループで実現したい(データ)マイニングについての検討。
- 提出先: データマイニング班学生公開用Wiki
自然言語処理ツールの演習
8週目
- 振り返り: supervised learning / unsupervised learning / semi-supervised learning
- 記事紹介: 東ロボくん(ロボットは東大に入れるか by NII)
- Level 3 確認 (1名?)
- Level 4 確認 (3名)
- Level 5 確認
- 自然言語処理入門: N-gramモデル + 出現回数による文書ベクトル生成
- Pythonチュートリアル: [ データ構造/辞書 | ループのテクニック ]
- 課題: Level 5 (テーマ検討継続)
9週目
- 振り返り: supervised learning / unsupervised learning / semi-supervised learning
- 記事紹介
- Level 5 確認
来週以降は進捗確認がメイン。問題設計は来週までが目安。ストーリーをつくれたら実装に入ろう。必ずしも全てを実装しきる必要はないですが、残り5週間程度で簡易実験をやれるところまで(何かしらのアウトプットを出すところまで)頑張ろう。
- テーマ設計例: Twitter上のテキスト文を対象とした2値分類学習に基づく未知語自動収集 (presen:HG/tnal/stage4-examples-unknown-words.pptx.pdf)
- その他の例: HG/tnal/problem-design-examples.mm
テーマ設計例やMindmapを参考に、目的/目標/アプローチ/特徴ベクトルの作り方/データセット準備/学習の進め方/実験計画等について検討&取り組んでください。(可能な範囲でok)
- 必ずしもテキスト処理を前提にする必要はありません。
- 自然言語処理入門: タームを素性とする特徴ベクトル生成の例 [ 英語編 | 日本語編 ] (文分割 + トークン化 + ステミング + ストップワード除去)
- (続)課題: Level 5 (テーマ検討継続) *来週には全員テーマ決定予定
- (早い人) 課題: Level 6 (課題取り組み/進捗確認)
10週目
- 記事紹介
- Facebookが考えるデータサイエンティストの要件
- Hiveで生テーブルを取ってくる→素性ベクトル+分類ラベルのテーブルに直す(現場的によるある分析のやり方)
- 振り返り: N-gramモデル, 形態素モデル
- 自然言語処理入門: 潜在的意味インデキシング(LSI)の例
- 進捗確認
- 自己評価(中間)
個別/グループ開発、発表、公開
11週目
- 記事紹介:
- 特徴ベクトルの重み付け例
- Python デバッグ
- pythonスクリプトをデバッグする (PythonRecipe)
- Python で標準添付の Debuggerのpdb を利用してデバッグするメモ (紹介マニアどらふと版)
- 26. デバッグとプロファイル (公式チュートリアル)
- 進捗確認
12週目
- 記事紹介:
- 最終発表に関する補足
- 進捗確認
参考文献・サイト
- オススメ/ピックアップ
- データマイニング概要 by 神嶌敏弘先生の講義資料
- 集合知プログラミング (book, 実装寄り/Python)
- 集合知イン・アクション (book, 実装寄り/Java)
- データマイニング+WEB@東京 (TokyoWebmining) (各種企業さんの事例紹介も豊富)
- 開発関係
- データマイニング関係
- データマイニングの簡単な解説
- データマイニングの宝箱
- サーチアーキテクチャ「さがす」の情報科学 (book, 一般寄り)
- 集合知プログラミング (book, 実装寄り/Python)
- 集合知イン・アクション (book, 実装寄り/Java)
- データマイニングによる異常検出 (book, 研究寄り)
- テキストマイニングハンドブック (book, 概観+網羅)
- 第26回 データマイニング+WEB@東京( #TokyoWebmining 26th) -オープンデータ活用・ソーシャ ル・アドテクノロジー 祭り- を開催しました
- Twitterでの番組の評判を番組作りに活かすNHKのつぶやき解析技術 - GIGAZINE
- Webデータ分析&データサイエンスで役立つ統計学・機械学習系の分析手法10選
- リンクするデータ(Linked Data)-広がり始めたデータのクラウド, 情報処理学会誌, 2011: [ 目次一覧 ]
- 「アクセス解析」における5つの真実
- データマイニング概要 by 神嶌敏弘先生の講義資料
- ツイートプロファイリング
- 自然言語処理関係
- Python による日本語自然言語処理
- 入門 自然言語処理 (book)
- 言語処理100本ノック - 東北大学 乾・岡崎研究室
- NLPプログラミングチュートリアル - Graham Neubig - チュートリアル資料
- (有料) 不自然言語処理 -枠に収まらない「リアルな」言語処理, 情報処理学会誌, 2012: [ 目次一覧 ]
- Wikipediaマイニング:Wikipedia研究のサーベイ, 情報処理学会論文誌データベース, 2009
- 利用者の好みをとらえ活かす-嗜好抽出技術の最前線, 情報処理学会誌, 2007: [ 目次一覧 ]
- 機械学習関連
- Jubatus : オンライン機械学習向け分散処理フレームワーク (C++, Python, Ruby, Java)
- 機械学習チュートリアル@Jubatus Casual Talks
- 機械学習の Python との出会い
- scikit-learn: machine learning in Python
- Pythonのscikit-learnでRandomForest vs SVMを比較してみた
- 機械学習 はじめよう : 連載 | gihyo.jp
- 怪奇!! 次元の呪い - 識別問題、パターン認識、データマイニングの初心者のために (解説記事): 前編, 後編 (情報処理, Vol.34, No.5, No.6)
- SVM実践ガイド (A Practical Guide to Support Vector Classification)
- 統計的にインデントするやつ
- 関連学会など
- データセット
- 関連記事
- 空気を読んで論文を紹介するtwitter-bot 「論文ったー」つくってみた。 - YamadaToshiyukiの日記
- Facebookが考えるデータサイエンティストの要件 - 道玄坂で働くデータサイエンティストのブログ
- Hiveで生テーブルを取ってくる→素性ベクトル+分類ラベルのテーブルに直す - 道玄坂で働くデータサイエンティストのブログ
- 「ゲームとTwitterとFacebookしかしないなんてもったいない」、Gunosy開発チーム根掘り葉掘りインタビュー - GIGAZINE
- Evernoteがアプリ開発コンテスト開催へ - 「Evernote Devcup 2013」で求められるエッセンスとは?
- ビッグデータに必須!"数学脳"の鍛え方 (Monthly Interview : 国立情報学研究所 新井紀子教授)
- 靴屋とデータマイニングと季節外れの冬物衣料 - あんちべ!
- データマイニングコンペティションサイト Kaggle にも Deep Learning ブームがきてるかと思ったのでまとめる - 糞ネット弁慶
- Googleが「CAPTCHA」を改良、リスク分析により人間と機械を区別