chainerで文書分類する その1
アドベントカレンダー18日目です。
今日はchainerのexampleにあるtext_classificationを使って文書分類していきたいと思います。
adventar.org
examplesのtext_classificationを動かす
このソースコードを動かします。
chainer/examples/text_classification at master · chainer/chainer · GitHub
あらかじめよく用いられるネットワークである、LSTMやCNNが含まれていて、使いやすいようにデータセットも簡単にダウンロードできるようになっています。
train_text_classifier.pyを動かすことで学習ができます。
python train_text_classifier.py -g 0 --dataset dbpedia
学習に使うモデルを変える
これらのモデルが含まれています。
・LSTM
https://github.com/chainer/chainer/tree/master/examples/text_classification
・CNN + MLP
・BoW + MLP
・Character-based variant models of those
モデルを切り替える際は、以下のように引数を渡します。
python train_text_classifier.py -g 0 --model bow
含まれているデータセット
データセットは以下のものが含まれています。
・DBPedia Ontology dataset (dbpedia): Predict its ontology class from the abstract of an Wikipedia article.
https://github.com/chainer/chainer/tree/master/examples/text_classification
・IMDB Movie Review Dataset (imdb.binary, imdb.fine): Predict its sentiment from a review about a movie. .binary's classes are positive/negative. .fine's classes are ratings [0-1]/[2-3]/[7-8]/[9-10].
・TREC Question Classification (TREC): Predict the type of its answer from a factoid question.
・Stanford Sentiment Treebank (stsa.binary, stsa.fine): Predict its sentiment from a review about a movie. .binary's classes are positive/negative. .fine's classes are [negative]/[somewhat negative]/[neutral]/[somewhat positive]/[positive].
・Customer Review Datasets (custrev): Predict its sentiment (positive/negative) from a review about a product.
・MPQA Opinion Corpus (mpqa): Predict its opinion polarity from a phrase.
・Scale Movie Review Dataset (rt-polarity): Predict its sentiment (positive/negative) from a review about a movie.
・Subjectivity datasets (subj): Predict subjectivity (subjective/objective) from a sentnece about a movie.
学習の際に使うデータセットを切り替える場合は、
'dbpedia', 'imdb.binary', 'imdb.fine','TREC', 'stsa.binary', 'stsa.fine','custrev', 'mpqa', 'rt-polarity', 'subj'のどれかを引数として渡すことで切り替えることができます。
python train_text_classifier.py -g 0 --dataset subj
実際に動かしてみる
今回もcolaboratoryで動かしてみました。
ただ動かすだけなら、以下のコマンドだけで十分です。
!curl https://colab.chainer.org/install | sh - !git clone https://github.com/chainer/chainer.git
cd chainer/examples/text_classification/
python train_text_classifier.py -g 0
今回はデータを少し確認したかったので、colaboratoryに学習部分のコードを移しました。
自分のデータに変えて分類するのも簡単そうです。
まとめ
文書分類を簡単にするだけならtext_classificationをいじるのが楽そうです。
scikit-learnのSVMの処理時間を比較する
アドベントカレンダー17日目です。
今日はscikit-learnのSVMの処理時間を比較してみたいと思います。
kernelごとの速度を計測する
今回は、「linear」「rbf」「poly」「sigmoid」の処理時間を計測してみます。
計測に使用するデータは、当初sklearnについてるdigitsを考えていたのですが、より大きなデータで試したかったので、mnistを使います。
自分でmnistのデータを拾って準備するのは面倒なので、chainerをimportして、get_mnist関数を使ってデータを取得します。
データの件数は6万件あり、データの件数が多すぎるので、今回は10分の1のデータを使います。
データとラベルを切り分ける方法があるのかわからなかったので、とりあえず無理やり分けました。
SVMのその他のパラメータは今回は特に指定しません。
計測結果
linear
CPU times: user 5.92 s, sys: 23.4 ms, total: 5.94 s
Wall time: 5.95 s
rbf
CPU times: user 15.8 s, sys: 3.52 ms, total: 15.8 s
Wall time: 15.8 s
poly
CPU times: user 57.8 s, sys: 15.5 ms, total: 57.9 s
Wall time: 57.9 s
sigmoid
CPU times: user 20.1 s, sys: 5.94 ms, total: 20.1 s
Wall time: 20.2 s
あとは意味もなく比較のグラフを作りました。googleスプレッドシートはグラフがきれいでいいですね。
実際の計測結果は以下から確認できます。
一眼レフのススメ
アドベントカレンダー16日目です。
今日は技術的なことではなく、カメラについて書いていきたいと思います。
カメラ選び
普段からよくスマホで写真を撮っていたのですが、夜景を撮るときや遠くものを撮るときに不満があり、それで思い切って一眼レフを買いました。
買ったのは、EOS Kiss X9のダブルズームキットです。
売り上げランキング: 1,764
スマホの写真はXperia Z5で撮りました。
わかりやすいのは動物園でズームして撮るときです。
ズームでの撮影
これはスマホでズームして撮ったのですが、油絵のようになってしまっています。
こちらは一眼で撮ったものです。
スマホで撮った時より距離が遠くてもくっきりとしているし、ボケ感も出ています。
イルミネーションの撮影
また、夜景やイルミネーションでもかなりの差が出ます。
今回は青の洞窟での写真の比較です。
ちゃんとぶれないように頑張って撮っても若干光がぶれてしまいます。
また、明るさをあげてもかなり暗い感じになってしまいます。
こちらは三脚なしで一眼で撮ったものです。
光のぶれも少なく、遠くまできれいに映っています。
カメラのメリットとデメリット
メリットとしてはやはりきれいに写真が撮れることです。
アルバムにするために印刷をしたり、トリミングをしたりしても高画質のままです。
ボケ感を楽しんだり、高倍率でも画質が悪くなったりせず、暗いところでもきれいにとることが可能です。
デメリットとしては、まずは重いことだと思います。
レンズも持ち歩くと1kgくらいにはなってしまいます。
鞄に入れるときにも結構かさばってしまいます。
持ち歩きやすさを重視する人は、ミラーレスのほうがいいかも知れません。
まとめ
一眼レフを買って、写真を撮るのがより楽しくなったので、ぜひ皆さんも検討してみてください。
最近ブックマークした深層学習関連の記事
アドベントカレンダー15日目です。
今日は、チェックせずに埋もれていくのを防ぐという意味合いも含めて、
最近ブックマークした深層学習関連の記事を貼っていきたいと思います。
最近ブックマークした記事
ツイッターとかで結構話題になっていた要約エンジンの話です。
深層学習かどうかまではわからないですが、AIっぽいので貼っておきます。
BERT、話題にはなっていましたがなかなか動かせる人がいませんでしたね。
その中でクックパッドが動かして話題になっていました。
自然言語処理でよく使われるSeq2Seqとかの説明記事です。
比較的優しい言葉で書かれていると思います。
イラストでわかるBERTやELMOです。
内部まで細かく説明されてます。
AI×医用画像についてのスライドです。
どういう風に応用されているのか、現状どんな研究が行われているのか、
事細かに書かれています。
深層学習かは微妙ですが、Kaggle Meetupの資料です。
Kaggleをやる際の参考になると思います。
はてな記法で数式を書く
アドベントカレンダー13日目です。
今日ははてな記法で数式を書く方法を紹介したいと思います。
adventar.org
ディスプレイ数式
数式をディスプレイ数式にするにはdisplaystyleを使います。
[tex: \displaystyle \sum^{\infty}_{n=1}]
実際の表示例:
数式を大きくする
少し数式は小さく見えるので、文字の大きさを変えることをお勧めします。
<span style="font-size: 150%"> [tex: \displaystyle \sum^{\infty}_{n=1}] </span>
実際の表示例:
自然言語処理における評価尺度
アドベントカレンダー12日目です。
今回はメモ的な意味も含めて、自然言語処理における評価尺度を書いていこうと思います。
adventar.org
WER
WERは(Word Error Rate)の略で、機械翻訳や音声認識などで使われており、エラー率なので低いほうがいい評価になります。
計算式は以下のとおり。
は置換の数、
は削除数、
は挿入数、
は正しい単語の数、
はの単語の数
とのことだがこれだけ聞いてもよくわかりません。
音声認識の場合では、人間の発言した単語のうちいくつ聞き取ることができなかったかの割合になるとのこと。
詳しくは以下を参照。
Word Error Rate Calculation · Martin Thoma
Hunt's WER
Hunt's WERはWERを改良したもので、weighted measureを採用している。
BLEU
BLEUは(BiLingual Evaluation Understudy)の略です。
翻訳でよく見かける評価で、日本ではよく使われていると思います。
生成した翻訳と、元の翻訳文を比較したときに、単語の重複している数を計算し、中でも連続している単語には高いスコアを与えます。
計算式は、以下のとおりです。
日本語のわかりやすい解説は以下から。
http://www2.nict.go.jp/astrec-att/member/mutiyama/corpmt/4.pdf
BLEU
GLEU
GLEUは(Google-BLEU)の略。
Generalized BLEU
BLEUよりも人間の判断に近いらしい?
ROUGE
ROUGEは(Recall-Oriented Understudy for Gisiting Evaluation)の略。
要約に使われているイメージ。
METEOR
METEORは(Metric for Evaluation of Translation with Explicit ORdering)の略。名前の通り、翻訳や要約に使われている。
TER
TER(Translation Edit Rate)の略。
おそらく翻訳の評価に用いられる?
CIDEr
CIDEr(Consensus-based Image Description Evaluation)の略。
イメージキャプションの評価に用いられる。
まとめ
書きかけですが、かなり長くなりそうなので途中で公開します・・。
いつか追記します。
参考
Word error rate - Wikipedia
Googleの音声認識、ワードエラー率が1年経たずに「8.5%」から「4.9%」まで改善! もはや人間レベル? | ロボスタ
BLEU
http://www2.nict.go.jp/astrec-att/member/mutiyama/corpmt/4.pdf
[1411.5726] CIDEr: Consensus-based Image Description Evaluation
GitHub - gcunhase/NLPMetrics: Python code for various NLP metrics
NLPMetrics/NLP_performance_metrics-April6th2018.pdf at master · gcunhase/NLPMetrics · GitHub
scikit-learnでConfusion Matrixを見やすく表示する
アドベントカレンダー11日目です。
今日はscikit-learnでConfusion Matrixを表示したいと思います。
adventar.org
Confusion Matrixの書き方
基本的な書き方は以下に乗っているコードをほぼそのまま動かすだけです。
https://scikit-learn.org/stable/auto_examples/model_selection/plot_confusion_matrix.html
少しだけ応用
今回は見やすさを上げるためにいくつか試そうと思います。
まず、デフォルトでは図のサイズが小さいので、figsizeを設定します。
plt.figure(figsize=(10,10))
色を変えたい場合には、cmapを変更します。
cmap=plt.cm.Reds
色の一覧はここを参照してください。
color example code: colormaps_reference.py — Matplotlib 2.0.2 documentation
たまに以下のように一部が見えにくい色になることがあります。
そういうときは、threshの値を調整するか、colorの色を設定するといいです。
背景が白いときに文字が白くなったり、逆が起こらないようにthreshの値を設定しましょう。
thresh = cm.max() / 2. for i, j in itertools.product(range(cm.shape[0]), range(cm.shape[1])): plt.text(j, i, format(cm[i, j], fmt), horizontalalignment="center", color="white" if cm[i, j] > thresh else "black")
今回のソースコードはこちらです。
Colaboratoryだとなぜか十字が入っていますが気にしないでください。