scikit-learnを用いた!
機械学習チュートリアル
金谷 敦志!
2014-03-13
"1
自己紹介
金谷 敦志 (Twitter: @todogzm)!
株式会社ラクス

北米市場向けWebサービス

Rigniteの開発に従事
"2
自己紹介
Python歴は1年半!
テキスト分類にPythonを使用!
recurly-client-pythonのPython 2/3対応!
Check.iO Level 10!
http://www.checkio.org/user/tod...
目次
scikit-learnについて!
機械学習チュートリアル!
scikit-learnを用いたテキスト分類
"4
scikit-learnについて
"5
機械学習ライブラリscikit-learn
http://scikit-learn.org/!
Pythonで作られた機械学習ライブラリ!
豊富な分類器と(ほぼ)統一化されたAPI!
検証作業を支える機能!
Numpy, Scipyを使用した高...
インストール要件
Python 2.6以上 (3.3でも使える)!
必要なライブラリ!
NumPy (>=1.3)!
SciPy (>=0.7)!
matplotlib (可視化したい場合)!
See http://scikit-learn.o...
機械学習チュートリアル
"8
機械学習とは
定義!
Wikipediaの機械学習より

”明示的にプログラムしなくても学習する

能力をコンピューターに与える研究分野”!
データから知識・ルールを自動確保
"9
身の回りにある機械学習の事例
スパム判定: メールがスパムか否かを判定!
リコメンド:「この商品を買った人はこんな
商品も買っています」!
画像認識: Picasaの顔認識機能など
"10
機械学習が得意とする問題
大量のデータを使って、未知のデータを分類!
!
※少量データなら人間が頑張った方が早い!
「九条グループ代表・九条麗子」からの10億円支援が

私の迷惑メールの中で話題に!!
九条麗子という単語があればスパム、というパ...
機械学習の分類
教師付き!
正解データが与えられている!
未知のデータに対する予測を行う!
教師なし!
正解データが与えられていない!
未知のデータから規則性を発見する
"12
今日の話題は
こっち
機械学習を実際に使うには
学習問題を数理的に捉える!
入力の数理的な表現の決定!
出力の表現方法の決定!
教師付き学習か教師なし学習か?!
学習方法に合わせた分類器の選定
"13
入力の数理的な表現
入力内容から特徴となる要素を
取り出し特徴ベクトルを作る!
特徴とは? →解きたい問題次第!
例:8x8の数値画像!
64次元のベクトルとして表現!
黒が0、白を15とした16段階
"14
[0, 0, 5, 13, 9, ...
入力の数理的な表現
教師付き学習の場合!
入力と、それに対する出力(正解)のペアをた
くさん用意する!
たくさん:多ければ多いほうが望ましいが
1000以上は欲しい
"15
出力の表現
期待する結果を洗い出し、数値化する!
数値は意味がある場合と単なるラベリングの場
合がある!
数値画像の例であれば、0∼9!
ラベルの例

みかん → 1, りんご → 2, バナナ → 3, …
"16
分類器の選定
予測したい (教師付き学習)!
サポートベクターマシン (バッチ学習)!
パーセプトロン (逐次学習)!
発見したい (教師なし学習)!
k最近傍法
"17
scikit-learnの分類器選定チートシート
"18
サポートベクターマシン
SVMやサポートベクトルマ
シンとも呼ばれる!
基本的には2値の分類器!
2つのパターンを分ける際
に、各データ点との距離が
最大となる識別面を計算
(マージン最大化)
"19
サポートベクターマシン
未知のデータについては、
識別面のどちら側にあるか
で分類する!
!
右の図は線形分類できる例!
できない場合には、条件を
緩める
"20
黒丸
白丸
scikit-learnを用いた

テキスト分類
"21
例題:感情解析
ある意見がポジティブかネガティブかを予測!
英語のデータセットがいくつかある!
今回はこの中からpolarity dataset v2.0 を使用
(Positive, Negativeそれぞれ1000件)!
https://w...
出力と分類器は良いが入力は…
入力の数理的な表現の決定

→ 自然文をどう扱うか?!
出力の表現方法の決定

→ Pos を+1, Negを-1!
教師付き学習か教師なし学習か?

→ 教師付き学習の分類器をいくつか試す
"23
入力の表現
単語を出現回数で数え
上げる。順序は無視
(Bag of Wordsモデル)!
(Pos) I’m really
loving this film.!
(Neg) I hate this film
because the film
rea...
教師付き学習の場合
学習用のデータにつ
いて、与える入力に
対する出力も合わせ
て教える!
機械学習は、各ラベ
ルに現れる単語の出
現確率を考慮して学
習する
"25
文章 Pos #1 Neg #2
I 1
I'm 1
because 1
fi...
その他考慮すべき点
1単語か複数単語か!
ストップワードを含めるか含めないか!
トリミングするかしないか(日本語は?)!
Bag of Wordsで本当にいいの?!
単語の重み付けは出現回数かtf*idfモデルか!
ラベルに一度も含まれていない...
入力部の実装
text_listには学習用テキストのリストが入る!
TfidfVectorizerにより、テキストをtf*idfモデル化!
1単語または2単語を用いてベクトル化!
英語をストップワードに追加
"27
from sklearn.fe...
SVMによる学習
入力のリストと期待される結果のリストを渡し、fit()メ
ソッドで学習する!
分類器には線形SVMを使用!
他の分類器にするにはLinearSVCを他に変える
"28
from sklearn import svm
!
ans...
未知のデータへの予測
未知のデータを学習時と同じようにモデル化する!
学習済みの分類器に未知のデータを渡す!
結果は期待する出力を数値化した値

今回の例では、Pos → +1, Neg → -1
"29
text_list = vectori...
精度がわからない
交差検定!
学習用データをいくつかに分けて、一部を学習用、残りを性能
評価用に使用!
cross_val_scoreに分類器、学習用モデルと期待する結果を渡せ
ば3回評価した結果を返す!
複数パラメータを組み合わせて検証するグ...
分類器の評価が遅い
計算時間や精度に影響を及ぼす 「次元の呪い」!
1単語のみ → 単語数4万!
1単語と2単語 → 53万! (10倍以上)!
潜在的意味解析による次元圧縮!
同じような意味の単語を同じものとして扱う
"31
from skl...
他の分類器も使いたい
今回の例はテキスト分類!
分類器選定チートシートでオススメされた
Naive Bayesも交差検定したい
"32
from sklearn.naive_bayes import GaussianNB
!
gnb = Gau...
SVMとNaive Bayesの精度比較
"33
方式 SVM SVM
Naive
Bayes
単語数 1~2単語 1単語 1~2単語
次元削減 なし(53万) 1000次元 なし
重み付け tf*idf tf*idf tf*idf
正解率 8...
まとめ
"34
機械学習のまとめ
データから知識・ルールを確保するための計算方法!
教師付き学習(予測)と教師なし学習(発見)!
入力と求めたい出力から、教師付き/なしが決まり、合わ
せて分類器も決まる!
教師付き学習の分類器にはサポートベクターマシンを始め
...
今回扱っていない内容
分類器の詳細な説明!
教師なし学習の例!
実際に機械学習を行う上で直面する問題!
教師用データの集め方!
計算機リソースの問題(CPUやメモリ使用量)!
etc…
"36
参考文献・Web資料
書籍!
はじめてのパターン認識 (平井有三著)!
Web資料!
機械学習チュートリアル@Jubatas Casual Talks!
拡がる 機械学習の応用 (東京大学 鹿島久嗣)!
pythonの機械学習ライブラリscik...
Upcoming SlideShare
Loading in...5
×

scikit-learnを用いた機械学習チュートリアル

24,325

Published on

大阪Pythonユーザの集まり 2014/03 で発表した資料
http://connpass.com/event/5361/

Published in: Technology
0 Comments
33 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
24,325
On Slideshare
0
From Embeds
0
Number of Embeds
29
Actions
Shares
0
Downloads
97
Comments
0
Likes
33
Embeds 0
No embeds

No notes for slide

scikit-learnを用いた機械学習チュートリアル

  1. 1. scikit-learnを用いた! 機械学習チュートリアル 金谷 敦志! 2014-03-13 "1
  2. 2. 自己紹介 金谷 敦志 (Twitter: @todogzm)! 株式会社ラクス
 北米市場向けWebサービス
 Rigniteの開発に従事 "2
  3. 3. 自己紹介 Python歴は1年半! テキスト分類にPythonを使用! recurly-client-pythonのPython 2/3対応! Check.iO Level 10! http://www.checkio.org/user/todogzm/ "3
  4. 4. 目次 scikit-learnについて! 機械学習チュートリアル! scikit-learnを用いたテキスト分類 "4
  5. 5. scikit-learnについて "5
  6. 6. 機械学習ライブラリscikit-learn http://scikit-learn.org/! Pythonで作られた機械学習ライブラリ! 豊富な分類器と(ほぼ)統一化されたAPI! 検証作業を支える機能! Numpy, Scipyを使用した高速な演算 "6
  7. 7. インストール要件 Python 2.6以上 (3.3でも使える)! 必要なライブラリ! NumPy (>=1.3)! SciPy (>=0.7)! matplotlib (可視化したい場合)! See http://scikit-learn.org/stable/install.html! 実際の使い方はあとで! "7
  8. 8. 機械学習チュートリアル "8
  9. 9. 機械学習とは 定義! Wikipediaの機械学習より
 ”明示的にプログラムしなくても学習する
 能力をコンピューターに与える研究分野”! データから知識・ルールを自動確保 "9
  10. 10. 身の回りにある機械学習の事例 スパム判定: メールがスパムか否かを判定! リコメンド:「この商品を買った人はこんな 商品も買っています」! 画像認識: Picasaの顔認識機能など "10
  11. 11. 機械学習が得意とする問題 大量のデータを使って、未知のデータを分類! ! ※少量データなら人間が頑張った方が早い! 「九条グループ代表・九条麗子」からの10億円支援が
 私の迷惑メールの中で話題に!! 九条麗子という単語があればスパム、というパターンを作成! でもパターンが増えてきたら…? "11
  12. 12. 機械学習の分類 教師付き! 正解データが与えられている! 未知のデータに対する予測を行う! 教師なし! 正解データが与えられていない! 未知のデータから規則性を発見する "12 今日の話題は こっち
  13. 13. 機械学習を実際に使うには 学習問題を数理的に捉える! 入力の数理的な表現の決定! 出力の表現方法の決定! 教師付き学習か教師なし学習か?! 学習方法に合わせた分類器の選定 "13
  14. 14. 入力の数理的な表現 入力内容から特徴となる要素を 取り出し特徴ベクトルを作る! 特徴とは? →解きたい問題次第! 例:8x8の数値画像! 64次元のベクトルとして表現! 黒が0、白を15とした16段階 "14 [0, 0, 5, 13, 9, 1, 0, 0, 0, 0, 13, 15, 10, 15, 5, 0, 0, 3, 15, 2, 0, 11, 8, 0, 0, 4, 12, 0, 0, 8, 8, 0, 0, 5, 8, 0, 0, 9, 8, 0, 0, 4, 11, 0, 1, 12, 7, 0, 0, 2, 14, 5, 10, 12, 0, 0, 0, 0, 6, 13, 10, 0, 0, 0]
  15. 15. 入力の数理的な表現 教師付き学習の場合! 入力と、それに対する出力(正解)のペアをた くさん用意する! たくさん:多ければ多いほうが望ましいが 1000以上は欲しい "15
  16. 16. 出力の表現 期待する結果を洗い出し、数値化する! 数値は意味がある場合と単なるラベリングの場 合がある! 数値画像の例であれば、0∼9! ラベルの例
 みかん → 1, りんご → 2, バナナ → 3, … "16
  17. 17. 分類器の選定 予測したい (教師付き学習)! サポートベクターマシン (バッチ学習)! パーセプトロン (逐次学習)! 発見したい (教師なし学習)! k最近傍法 "17
  18. 18. scikit-learnの分類器選定チートシート "18
  19. 19. サポートベクターマシン SVMやサポートベクトルマ シンとも呼ばれる! 基本的には2値の分類器! 2つのパターンを分ける際 に、各データ点との距離が 最大となる識別面を計算 (マージン最大化) "19
  20. 20. サポートベクターマシン 未知のデータについては、 識別面のどちら側にあるか で分類する! ! 右の図は線形分類できる例! できない場合には、条件を 緩める "20 黒丸 白丸
  21. 21. scikit-learnを用いた
 テキスト分類 "21
  22. 22. 例題:感情解析 ある意見がポジティブかネガティブかを予測! 英語のデータセットがいくつかある! 今回はこの中からpolarity dataset v2.0 を使用 (Positive, Negativeそれぞれ1000件)! https://www.cs.cornell.edu/people/pabo/ movie-review-data/ "22
  23. 23. 出力と分類器は良いが入力は… 入力の数理的な表現の決定
 → 自然文をどう扱うか?! 出力の表現方法の決定
 → Pos を+1, Negを-1! 教師付き学習か教師なし学習か?
 → 教師付き学習の分類器をいくつか試す "23
  24. 24. 入力の表現 単語を出現回数で数え 上げる。順序は無視 (Bag of Wordsモデル)! (Pos) I’m really loving this film.! (Neg) I hate this film because the film really … "24 文章 #1! #2 I 1 I'm 1 because 1 film 1 2 hate 1 loving 1 really 1 1 the 1 this 1 1
  25. 25. 教師付き学習の場合 学習用のデータにつ いて、与える入力に 対する出力も合わせ て教える! 機械学習は、各ラベ ルに現れる単語の出 現確率を考慮して学 習する "25 文章 Pos #1 Neg #2 I 1 I'm 1 because 1 film 1 2 hate 1 loving 1 really 1 1 the 1 this 1 1
  26. 26. その他考慮すべき点 1単語か複数単語か! ストップワードを含めるか含めないか! トリミングするかしないか(日本語は?)! Bag of Wordsで本当にいいの?! 単語の重み付けは出現回数かtf*idfモデルか! ラベルに一度も含まれていない単語の扱い! etc… "26 特定の文書集合によ く現れる単語を重要 視するモデル
  27. 27. 入力部の実装 text_listには学習用テキストのリストが入る! TfidfVectorizerにより、テキストをtf*idfモデル化! 1単語または2単語を用いてベクトル化! 英語をストップワードに追加 "27 from sklearn.feature_extraction.text import TfidfVectorizer ! text_list = [(テキストのリスト)] ! vectorizer = TfidfVectorizer( ngram_range=(1, 2), stop_words='english') X = vectorizer.fit_transform(text_list)
  28. 28. SVMによる学習 入力のリストと期待される結果のリストを渡し、fit()メ ソッドで学習する! 分類器には線形SVMを使用! 他の分類器にするにはLinearSVCを他に変える "28 from sklearn import svm ! answer_list = [(text_listの各データに対するラベル)] ! svc = svm.LinearSVC() # 線形SVM svc.fit(X, answer_list) # 学習
  29. 29. 未知のデータへの予測 未知のデータを学習時と同じようにモデル化する! 学習済みの分類器に未知のデータを渡す! 結果は期待する出力を数値化した値
 今回の例では、Pos → +1, Neg → -1 "29 text_list = vectorizer.transform([(テキスト)]) ! result_list = svc.predict(text_list)
  30. 30. 精度がわからない 交差検定! 学習用データをいくつかに分けて、一部を学習用、残りを性能 評価用に使用! cross_val_scoreに分類器、学習用モデルと期待する結果を渡せ ば3回評価した結果を返す! 複数パラメータを組み合わせて検証するグリッドサーチも便利 "30 from numpy import array ! svc = svm.LinearSVC() scores = cross_validation.cross_val_score(svc, X, array(y))
  31. 31. 分類器の評価が遅い 計算時間や精度に影響を及ぼす 「次元の呪い」! 1単語のみ → 単語数4万! 1単語と2単語 → 53万! (10倍以上)! 潜在的意味解析による次元圧縮! 同じような意味の単語を同じものとして扱う "31 from sklearn.decomposition import TruncatedSVD ! X = vectorizer.fit_transform(text_list) lsa = TruncatedSVD(1000) # 1000次元まで削減 X_lsa = lsa.fit_transform(X)
  32. 32. 他の分類器も使いたい 今回の例はテキスト分類! 分類器選定チートシートでオススメされた Naive Bayesも交差検定したい "32 from sklearn.naive_bayes import GaussianNB ! gnb = GaussianNB() scores = cross_validation.cross_val_score( gnb, X.toarray(), array(y)) # Xそのままはダメとな…
  33. 33. SVMとNaive Bayesの精度比較 "33 方式 SVM SVM Naive Bayes 単語数 1~2単語 1単語 1~2単語 次元削減 なし(53万) 1000次元 なし 重み付け tf*idf tf*idf tf*idf 正解率 82% 80% 72% 分類器選定チートシートに従いNaive Bayesも評価した結果…
  34. 34. まとめ "34
  35. 35. 機械学習のまとめ データから知識・ルールを確保するための計算方法! 教師付き学習(予測)と教師なし学習(発見)! 入力と求めたい出力から、教師付き/なしが決まり、合わ せて分類器も決まる! 教師付き学習の分類器にはサポートベクターマシンを始め として色々ある! scikit-learnには機械学習に取り掛かりやすい環境がある "35
  36. 36. 今回扱っていない内容 分類器の詳細な説明! 教師なし学習の例! 実際に機械学習を行う上で直面する問題! 教師用データの集め方! 計算機リソースの問題(CPUやメモリ使用量)! etc… "36
  37. 37. 参考文献・Web資料 書籍! はじめてのパターン認識 (平井有三著)! Web資料! 機械学習チュートリアル@Jubatas Casual Talks! 拡がる 機械学習の応用 (東京大学 鹿島久嗣)! pythonの機械学習ライブラリscikit-learnの紹介 "37
  1. A particular slide catching your eye?

    Clipping is a handy way to collect important slides you want to go back to later.

×