ラベル プログラミング学習 の投稿を表示しています。 すべての投稿を表示
ラベル プログラミング学習 の投稿を表示しています。 すべての投稿を表示

2020年7月21日火曜日

LSTMによる卸電力価格(スポット価格)の変化点検知(時系列データ、異常検知、ディープラーニング)

前回の続き、東京大学松尾研ディープラーニング講座 DL4US 3rdの最終課題(自由課題)についてです。

最終課題
「講座で学んだ技術を利用する独自プロジェクトに取り組み、その結果をレポートせよ」

ということで、私は卸電力価格(スポット価格)の変化点検知と予測に取り組みました。


背景と目的

電力スポット市場(一日前市場)とは
卸電力取引所が開催する最もポピュラーな電力取引市場の一つであり、翌日に発電または販売する電気を前日までに入札し、売買を成立(マッチング)させるものです。https://pps-net.org/glossary/5072

スポット市場の約定価格(以下、スポット価格)は発電事業者にとっては電気の卸販売価格、小売電気事業者等にとっては調達価格として重要なものとなっています。

スポット価格の一般的な特徴
・日変動(昼間、夜間などの時間帯による変動)
・季節変動
・平日・休日による差
・需要・供給力による変動
・気温による変動

スポット価格1週間の変動例

上記の一般的な特徴のほかに、中長期でトレンドが変化しています。最近では太陽光発電が増加したことなどの影響で特に西日本で昼間のスポット価格の低下が大きくなってきました。


ススポット価格 時間別平均値の変化

今回のスポット価格の変化点検知の目的は、変化を早めに察知することで戦略見直しの必要性を明確にするということです。また、政策立案者にとっては介入効果の検証やある事象による影響を知ることもできるかと思います。

目標:スポット価格のトレンドの変化(変化点)を検出する。


変化点検知の手法

変化点を検出するにあたり、LSTMで特定の時点までの時系列データのモデルを作成し、その後の時点での実測値と予測とのずれをトレンドの変化とすることとしました。

異常検知として外れ値を検出するという手法が取り上げられていますが、瞬間的にスポット価格が高騰することはよくあります。このため、外れ値だけではなく変化は比較的小さくても一定期間続く傾向を検出したいことから、予測誤差の集合による異常度の判定としました。



データ

日本卸取引所(JEPX)のスポット市場取引結果(2005年~2019年12月 エリアプライス)
気象データ:気象庁過去データより代表1地点の気温、日射量の1時間値

スポット市場は対象期間の1日前に取引を行うため、本来は天気予報のデータを用いるべきですが、過去の予報データが手に入らなかったため過去気象の実測値を用いました。


変数候補としては供給力、需要、連系線の混雑状況、燃料価格など様々考えられますが、今回は気温、日射量、平日・休日フラグ、時間のみを使っています。

異常度は1週間単位の予測誤差の平均値の二乗としました。


モデル・学習

モデルの構築はPython Kerasを使いました。下記を参考にしています。

深層学習を用いた時系列データにおける異常検知 Kabuku Developers Blog
https://www.kabuku.co.jp/developers/time_series_anomaly_detect_deep_learning


スポット市場では前日10時を締め切りに翌日の24時間分を取引します。このため、学習データのスポット価格は48時間前の価格としました。24時間分のデータから1時間値を予測します。



trainデータで実測値と予測値の誤差が正規分布に近くなるまで(過学習気味になるまで)学習を行い、testデータで前述誤差の差から異常度を計算します。


結果

<結果1:train:2005年4月~2010年12月、test:2011年1月~2019年12月>


2005年4月~2010年12月までを学習し、2011年から2018年までの変化点を見た結果です。青色がスポット価格の実測値、オレンジが予測値、緑色が異常度(右軸)です。

2011年3月の東日本大震災後、2012年1月に異常度が非常に高くなり、2015年まで高い状態が継続しています。2016年ごろからは元の傾向(2010年まで)に近くなったことがわかります。

<結果2:train:2005年4月~2010年12月、test:2011年1月~2019年12月>


こちらは2005年4月~2018年を学習し、2019年1月~12月の変化点を見た結果です。

2019年2月から4月中ごろに異常度が比較的高くなっており、太陽光発電の増加により晴れた昼間にスポット価格が大きく下落するようになった時期と一致しています。結果1の2012年ごろと比べると異常度は小さくなっていて、変化の大きさも反映されています。


考察など

簡易的でありますが、LSTMによるモデルと誤差集合を用いることでトレンドの変化を検知することができました。ただし、気象データを予報値ではなく実測値を使っていること、ごく限られた変数のみを用いていることなどからあくまで参考という形です。また、異常度の判定方法や評価指標としてはもっと一般的な方法があるかと思います。

先にも述べましたが、変化点とその度合いを見ることで事業戦略転換の判断をしやすくなったり、政策等の介入効果、状態変化による影響などを明確にすることができ、適用範囲は広いと思います。最近ではコロナの影響で電力需要の減少が言われていますが、同様の手法で影響を図ることができそうです。

以前行った、エネルギー基本計画での新語・複合語を探すというのも政策での変化を見たかったという動機でした。自然言語処理を用いた変化点検知というのもやってみたいと思っています。


参考
東京大学松尾研 DeepLearning実践開発講座「DL4US」3rd
https://deeplearning.jp/lectures/dl4us_3rd
DL4US コンテンツ公開ページ
https://weblab.t.u-tokyo.ac.jp/dl4us/

東京大学松尾研ディープラーニング講座 DL4USを修了しました。
https://eneprog.blogspot.com/2020/06/dl4us.html

ReNom:LSTMによる時系列データの異常検知
https://www.renom.jp/ja/notebooks/tutorial/time_series/lstm-anomalydetection/notebook.html
Kabuku Developers Blog :深層学習を用いた時系列データにおける異常検知
https://www.kabuku.co.jp/developers/time_series_anomaly_detect_deep_learning

日本卸電力取引所(JEPX)
http://www.jepx.org/
新電力ネット スポット市場
https://pps-net.org/glossary/5072
JEPX プライスチェッカー
https://enechange.jp/jepx_checker/

日本経済新聞 :電力スポット価格、土日昼間は「ほぼ0円」
https://www.nikkei.com/article/DGKKZO58525810X20C20A4TJ3000/

エネルギー基本計画の特徴を見てみる。その4 複合語を考慮してwordcloud
https://eneprog.blogspot.com/2018/09/4-wordcloudpythonjanome.html
エネルギー基本計画から新語・複合語を探す。その2 複合語を判定する
https://eneprog.blogspot.com/2018/08/2-pythonjanome.html


謝辞
DL4USの運営スタッフのみなさま、大変有用な講座を(無料で!)提供し、サポートしていただき本当にありがとうございました。ご一緒いただいた受講者のみなさまとの交流も大変励みになりました。感謝です。

2020年6月13日土曜日

東京大学松尾研ディープラーニング講座 DL4USを修了しました。

ずいぶん久しぶりの投稿になります。2019年10月から東京大学松尾研ディープラーニング講座 DL4US 3rdを受講し、2020年2月に無事修了しました。

東京大学松尾研 DeepLearning実践開発講座「DL4US」3rd
DL4US コンテンツ公開ページ

私はDL4USの3期生になるようです。講座の内容は上記公開コンテンツで見ることができますが、ただ、コンテンツで自習するのと講座を受講するのでは大きく異なる点があります。

・1受講者 – 1GPUサーバ、ブラウザのみで構築済みの環境が使える。
・毎週の課題提出(コンペ形式)
・SLACKでほかの受講者・TAとのコミュニケーション
・コンペ課題上位者の解法の共有

講座募集のページにも書かれていますが、

第3期では、”受講生コミュニティ” の価値最大化を目指して、1)コンペ形式の課題を通じた競争、2)受講生フォーラムでの議論・助け合い、3)講座期間中・後の交流、に重点を置いた運営を行います。

ということで、この運営が非常に効果的だったと思います。

特に毎週課題提出があることで締め切りに追われながらもスケジュール通りに講座を進めるができる、受講者同士で教えあいや励ましあい、解法の共有など、学習の継続と理解を深める工夫がありました。

正直、仕事をしながらの毎週課題をこなすのはかなりきついものがありましたが、課題コンペでの競いあいや受講者同士でコミュニケーションが取れる場があることで何とか継続できたと思っています。

DL4USの特徴にはもう一つ、最終課題があります。

最終課題
「講座で学んだ技術を利用する独自プロジェクトに取り組み、その結果をレポートせよ」

テーマは自由。データも自分で集める必要があります。

何をするか、自分の実力で何ができるか非常に悩みましたが、私は「LSTMによる電力卸価格(スポット価格)の変化点検知と予測」というテーマにしました。時系列の電力卸価格と気象データ等から変化点とその度合いを見る(さらに予測を行う)というものです。

実は自然言語処理を試してみたかったのですが、テーマも絞り切れず、一からやるには難易度が高すぎることから、やはり少しでもドメイン知識のある分野の方がやりやすいだろうという選択です(これは正解でした)。

最終課題に取り組んだのは1か月弱(一度締め切りが延びた)という短期間で、非常に苦労しましたが何とかレポートにまとめ、提出することができました。予測としての精度はあまりよくなかったものの、最終課題の評価は修了者の平均程度となり個人的には満足しています。

今まで、Andrew先生のcoursera machine learningedx UCバークレーデータサイエンス基礎講座とデータ解析系の講座を受講しましたが、DL4USは技術の習得はもとより、継続の面でとてもよく設計された講座だと感じました。受講者の修了率は半分程度だったそうですが、オンライン講座でこの修了率は高いと思います。何より、スタッフの方の対応や受講者同士のコミュニケーションが取れる仕組みやよかったです。

修了者の懇親会はコロナの影響で延期となっていますが、開催される場合はぜひ参加したいと思います。

*実はこの後、同じく東京大学松尾研のGCIデータサイエンティスト育成講座も受講しました。こちらについてもそのうち書きます。

追記:2020年7月21日 最終課題について書きました。
LSTMによる卸電力価格(スポット価格)の変化点検知(DL4US最終課題)
https://eneprog.blogspot.com/2020/07/lstmdl4us.html

参考
東京大学松尾研 DeepLearning実践開発講座「DL4US」3rd
https://deeplearning.jp/lectures/dl4us_3rd
DL4US コンテンツ公開ページ
https://weblab.t.u-tokyo.ac.jp/dl4us/

Coursera machine learningコース
https://www.coursera.org/learn/machine-learning
coursera machine learningコース修了しました。
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html
Coursera machine learning コースを始めました。edX UCバークレーFoundations of Data Scienceとの違いなど
https://eneprog.blogspot.com/2018/07/coursera-machine-learning-edx-ucmooc.html
edX UCバークレー Data Science: Computational Thinking with Python
https://www.edx.org/course/foundations-of-data-science-computational-thinking
プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
プログラミング学習:edx UCバークレー データサイエンス基礎講座、第2弾受講中(python)
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html

2018年9月27日木曜日

pythonで全角⇔半角変換する。unicodedateを使う方法とdict登録で文字種ごとに設定する方法。(文字列操作,正規化,unicodedata,ユニコード)

過去のエネルギー基本計画と最新分を比較しようとしたところ、文字の全角半角にばらつきがあることに気がつきました。

平成30年 第5次エネルギー計画(最新版)
平成22年 第3次エネルギー計画


最新の第5次エネルギー基本計画では、略語、数字は全角(CO2、IoT、2030年など)、英単語・熟語、単位は半角(Energy Security、klなど)。第3次エネルギー基本計画では略語、数字(1文字の数字を除く)は半角(CO2、2002 年など)、一桁の数字は全角です(9月、9割など)。各文書内では文字種ごとに全角半角は統一されているようです。

このままでは自然言語処理をする際に別の単語と認識してしまうので統一していきます。

すべて正規化する場合(全角アルファベット・数字・記号→半角、半角カタカナ→全角)はunicodedateを使うと簡単です。

・unicodedateで全角を半角に
import unicodedata

text = u'ABCabc123カキク①(!%@#$¥~ ABCabc123カキク(!%@#$\~'
unicodedata.normalize("NFKC", text)
'ABCabc123カキクガギグ1(!%@#$¥~ ABCabc123カキクガギグ(!%@#$\\~'

unicodedate.nomalizeではformを指定して文字列を正規化します。ここではNFKC(Normalization Form Compatibility Composition)を指定しています。下記に詳しい解説があります。(あまり理解できていません)

Pythonドキュメント unicodedata — Unicode データベース
文字コード地獄秘話 第3話:後戻りの効かないUnicode正規化


unicodedateの正規化(NFKC)を使うと、全角アルファベット・数字・カタカナは半角になります。全角記号も半角になりますが、正規化されて、違う記号になったりするので要注意です。上の例では丸囲み数字①が1に、~は˜に、¥は¥¥になってしまいました。これでは困ることがあるので、違う方法を考えます。

参考にしたのはこちら↓

pythonで半角英数字から全角英数字へ変換


目的の文字のユニコードを辞書登録して、translateで変換するという方法。

ユニコードを調べるのは下記ページが便利です。逆引きもできます。

うにこ~ど2/


数字、英字のユニコード範囲:
---
数字半角[0-9] 0x30~0x39
数字全角[0-9] 0xFF10~0xFF19

英字半角・大文字[A-Z] 0x41~0x5A
英字全角・大文字[A-Z] 0xFF21~0xFF3A
英字半角・小文字[a-z] 0x61~0x7A
英字全角・小文字[a-z] 0xFF41~0xFF5A
---

ユニコードは計算(足し算、引き算)ができるので、これを利用してアルファベット、数字の一覧が生成できます。

・全角アルファベット一覧の作成
for ch in range(26):
    print(chr(0xFF21 + ch))
A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

大文字全角Aのユニコード[0xFF21]に26までの数字を足して、AからZまでの英字を作りました。次にこれらを辞書に登録します。

・全角半角のセットを辞書に登録
upper = dict((0xFF21 + ch, 0x0041 + ch) for ch in range(26))
lower = dict((0xFF41 + ch, 0x0061 + ch) for ch in range(26))
number= dict((0xFF10 + ch, 0x0030 + ch) for ch in range(10))

t = {**upper, **lower,**number}

大文字(upper)、小文字(lower)、数字(number)をそれぞれ全角をキーに、半角を値にして辞書を作成し、ひとつに結合しました。変換が必要な文字種だけを辞書登録するのがポイント。辞書の結合は**を使っていますが、これができるのはPython3.5以上のようです。

Python で2つの辞書をマージした新しい辞書を作りたいとき


あとはtranslateで文字列を変換するだけ。

・全角英字、数字を半角に変換
text = u'ABCabc123カキク①(!%@#$¥~ ABCabc123カキク(!%@#$\~'
print(text.translate(t))
ABCabc123カキク①(!%@#$¥~ ABCabc123カキク(!%@#$\~

全角英字・数字のみが半角に変換されました(記号・半角カタカナはそのまま)。これを使うと、半角を全角に、全角数字のみを半角数字になどもできます。ただ、記号の場合はユニコードが連続していないので、目的のユニコードを探して辞書登録する必要があります。


参考:
Pythonドキュメント unicodedata — Unicode データベース
https://docs.python.jp/3/library/unicodedata.html
文字コード地獄秘話 第3話:後戻りの効かないUnicode正規化
http://tech.albert2005.co.jp/501/
うにこ~ど2
http://unicode.ninpou.jp/

pythonで半角英数字から全角英数字へ変換
http://cuio.blog2.fc2.com/blog-entry-2165.html
[Java] 全角半角変換(英数字の場合)
https://ameblo.jp/archive-redo-blog/entry-10376390355.html
Python で2つの辞書をマージした新しい辞書を作りたいとき
https://utgwkk.hateblo.jp/entry/2017/08/04/013507

2018年9月24日月曜日

coursera machine learningコース修了しました。(機械学習,オンライン学習)

7月から始めたcoursera machine learningコースを修了しました。

Coursera machine learning コースを始めました。edX UCバークレーFoundations of Data Scienceとの違いなど

約3ヶ月かけて期限のぎりぎりで修了です。何とか終われたというのが感想です。

コースの内容はほかの方が詳しく書かれていますが、機械学習に必要なことは一通り習ったという感じでしょうか。主な項目は単回帰、重回帰、ロジスティック回帰、ニューラルネットワーク、サポートベクターマシン(SVM)、K-means、主成分分析(PCA)、異常値検知など。そのほか、機械学習が上手くいっているかの確認方法、こんなときにはこれを使う、ビッグデータを扱う場合などのコツも教えてくれています。

カリキュラムとしては、5週目までで単回帰からニューラルネットワークまで進み、かなりのスピードと分量でついていくのがやっとという状態でした。私は特に5週目のニューラルネットワークの誤差逆伝播法(Backpropagation)が理解できず、他のHPや本を見て参考にしました(今でも理解できているとは言いがたいですが)。ニューラルネットワークまでは自分でアルゴリズムを組んで実装しますが、その後は既存のライブラリを使ったりするので比較的簡単に感じました(Octave、行列の計算に慣れたというのもある)。

プログラミング課題はOctaveを使いますが、これは特に問題ではなかったです。とてもシンプルで理解しやすい言語だと思います。

機械学習では数学の知識が必要といわれていますが、このコースでは初歩の行列の計算(足し算、引き算、内積など)は最初に解説があります。その他は数式も出てきますが、理解できなくてもいい。覚えなくてもいい(覚える必要はない)などとコメントがありました。もちろん理解できたほうがいいですが、何となく分かった程度でもついていけます。

このコースでは基本的に日本語字幕がついていますが、何項目かは日本語なしのものもありました。日本語字幕は複数人のボランティアが担当して作成されているようで、質にムラがあります。日本語では分かりにくいときがあるので、その場合は英語スクリプトを確認したほうがいいです。

全体としてとてもよくできたコースだと思いますが、なんといっても講師のAndrew先生が人気の秘密だと感じました。これは難しいから理解しなくても大丈夫、僕も最近やっと分かったところだよ。ここまで良く頑張ったね。おめでとう。シリコンバレーの多くのエンジニアより君のほうが機械学習を分かっている。などというコメントがところどころにあり、この言葉に励まされながら受講を続けました。修了して最後の先生の言葉にはちょっと感動しました。

ほぼ感想になりましたが、オンライン学習というのはリタイア率が高く、修了まで続けるのは容易ではありません。興味が続くようなコース設計はもとより、励ましというか声かけ、コーチングが重要なのだと思いました(私はAndrew先生の励ましを受けてなんとか修了できた感じです)。日本のオンライン学習でもこれらの仕組みを取り入れて、続けやすい仕組みを整えてほしいと思います。

最後に。これから受講される方へ
さまざまなブログなどで紹介されている人気コースですが、分量も多く、やさしくはないです。ただ、難易度は3週目までと6週目までが山です。あとは全体に簡単になるので、まずは3週目までやってみることをお勧めします。機械学習とは何なのかという話を平易な言葉を使って解説されていて、興味深く続けられました。なんといってもAndrew先生の言葉と笑顔がよいです。ぜひ受講してみてください。

参考:
Coursera machine learningコース
https://www.coursera.org/learn/machine-learning
Coursera machine learning コースを始めました。edX UCバークレーFoundations of Data Scienceとの違いなど
https://eneprog.blogspot.com/2018/07/coursera-machine-learning-edx-ucmooc.html
edX UCバークレー データサイエンス基礎講座
https://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
プログラミング学習:edx UCバークレー データサイエンス基礎講座、第2弾受講中(python)
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html

2018年7月20日金曜日

Coursera machine learning コースを始めました。edX UCバークレーFoundations of Data Scienceとの違いなど(オンライン学習、機械学習、mooc)

edX UCバークレー データサイエンス基礎(Foundations of Data Science)コースに続き、有名なCoursera machine learningコースを始めました。現在、week2が終わったところです。

Coursera machine learningコース
https://www.coursera.org/learn/machine-learning

スタンフォード大学のAndrew Ng教授の人気講座で、ブログ記事などで評判を見かけ、やってみることにしました。すでにいろんな方が講座の内容などを紹介されていますので、ここでは主にedX UCバークレーコース(以下、edX Data8)との違いを書いてみたいと思います。

受講は基本的には無料、終了証の発行には8680円(日本円)が必要になります。これはedX Data8と同じで、Courseraの方が少し安いです。

edX Data8の方は、開講期間が決まっていて一斉にスタートするのに対し、Courseraコースはいつでも開始可能です。ただし、受講のペースは決まっていて、1週間の課題を○○日までに送信するようにというアナウンスが出ます。



オンライン学習では一定のペースで続けることが難しくなってくるので、こういう締め切りがあるのはいいことだと思います。(すでに締め切りに追われていますが。。。)

edX Data8ではdiscussionを見ると自分が疑問に思ったことについて誰かが質問していて、それに対する回答も多く寄せられており、一緒に勉強している感がありましたが、Courseraは一斉にスタートするわけではないためか、discussionはあまり活発に動いていないようです(そもそも、コードをdiscussionに載せることが禁止されている)。

代わりに、ブログ等での解説記事はたくさんあるので、こちらを参考にできます。

edX Data8コースとの最大の違いは、日本語字幕があることでしょうか。



講義動画に日本語字幕を出せます。ダウンロードも可能。これは機械翻訳ではなく、ボランティアの有志で付けられているそうです。各単元で翻訳者が違っていて、時々分かりにくかったり、字幕がずれていたりすることもありますが、専門用語も日本語で書かれているので後で調べる際にもとても役に立ちます。

edX Data8の方は英語のみなので、やはりハードルは高いですね。

講義は、Andrew教授がスライドに書き込みを入れるスタイルで進んでいきます。



評判どおり、平易な言葉で解説されていて大変分かりやすいです(理解できているかはまた別問題)。week1では、行列の足し算などの計算から復習がありました。難しいと思うところもありますが、その都度、ここは覚えなくていい、難しいから理解できなくてもいいという言葉もあり、励みにしながらとりあえず進めています。

edX Data8では、講義もjupyter notebookのpythonを動かしながら進むので、動画を見ながら一緒に手を動かすことができるのですが、Courseraの方は通常の学校などの授業と同様、講義を聴く感じになっています。



講義動画の途中に、ところどころで動画が止まり上記のようなクイズが出題されます。動画を見ているだけでは何となく聞き流してしまうので、このクイズは理解度を深める上でとてもよい仕組みだと思います。

プログラミング課題では、OctaveまたはMatlabを使います。Octaveはフリーソフト、Matlabは有料ですがオンライン版でコース受講中に使える無料パスがあるようです。私はOctaveをインストールしました。edX Data8ではpython、jupyter notebook等の環境構築が必要なかったので、この点ではedX Data8の方が楽です。

GNU Octave
https://www.gnu.org/software/octave/

上記からGNU Octaveをインストールしました。バージョンは最新版で4.40です。コースの注意書きで4.0はインストールするなとありましたが、いまのところ普通に動いているようです。



Octaveの画面。Octaveは行列計算に特化した感じで、とてもシンプルな言語になっているようです。week2の講義資料にOctaveのチュートリアルがあり、このチュートリアルを見ながら練習しました。pythonでやったらいいのにとも思いましたが、Andrew Ng教授によると、pythonなどを使うよりもOctaveの方がスムーズに操作・理解できるとのことです。

edX Data8でもpythonのpandas等の普段使うモジュールではなく、より簡易化した独自モジュールを使って演習をしているので、同じような考え方なのだと思います(edX Data8では特定のプログラミング言語を学ぶのではなく、データサイエンスの基礎を学ぶのだとの記載あり)。

このCourseraコースでは1週間で動画講義と項目ごとのテスト、最後にプログラミング課題という構成になっています。プログラミング課題は全て英語で、ほとんど図もないpdfで記載されていて、ちょっと戸惑いました。課題のpdfではヒントも少なく、1週間分の講義内容を課題にしているため忘れている部分もあったので、動画講義の進行に合わせて、プログラミング課題も少しずつ進めたほうがいいかもしれません。

課題についてはgithubなどに回答例がたくさんあります。他の人のコードを写すのは禁止とされていますが、分からなければ参考にするのもいいと思います。コードを見ると、そういうことかと理解できるところがありました。(ただし、間違っている例もあるので要注意)

以上、長くなりましたが、全体としてこのコースは機械学習の理論を学ぶのに大変よいと思いますが、数学的な話が主で手を動かしながらという感じでもなく、モチベーションが高くないと続けるのが少し難しい気がします。

まだweek2が終わったところなので、どこまでできるか分かりませんが、出来るところまでやってみようと思います。


参考:
Coursera machine learningコース
https://www.coursera.org/learn/machine-learning
edX UCバークレー データサイエンス基礎講座

https://www.edx.org/professional-certificate/berkeleyx-foundations-of-data-science
プログラミング学習:edx UCバークレー データサイエンス基礎講座の紹介(python)
https://eneprog.blogspot.com/2018/04/edx-uc-python.html
プログラミング学習:edx UCバークレー データサイエンス基礎講座、第2弾受講中(python)
https://eneprog.blogspot.com/2018/06/edx-uc-2python.html

追伸:edX UCバークレー データサイエンス基礎コース 第3弾、機械学習コースが2018年7月24日に始まります。こちらも受講申し込み済みです。

Foundations of Data Science: Prediction and Machine Learning
https://www.edx.org/course/foundations-data-science-prediction-uc-berkeleyx-data8-3x

2018年6月26日火曜日

janomeの形態素情報を保存する。(python、自然言語処理、形態素解析、pandas)

前回エネルギー基本計画案から名詞(代名詞、非自立名詞)だけを取り出してwordcloudを作ってみましたが、同じ文章を分析するのに、何度もjanomeで形態素解析を繰り返すのが無駄な気がしてきました。

このため、今回はjanomeで解析した形態素情報を丸ごと取り出し、pandasデータフレームとして保存したいと思います。これだと一度、形態素解析をかけると後で再利用が楽になるはずです。

janomeでの形態素解析、形態素情報については下記記事をご参照ください。

Janomeで形態素解析をやってみる。(python,自然言語処理,分かち書き

・インポート
from janome.tokenizer import Tokenizer
from wordcloud import WordCloud
import matplotlib.pyplot as plt

import pandas as pd

・形態素情報を取り出す
t = Tokenizer()
text="エネルギー"

tokens = t.tokenize(text)
for token in tokens:
    print(token)

print(type(token))
str(token)
エネルギー	名詞,一般,*,*,*,*,エネルギー,エネルギー,エネルギー
<class janome.tokenizer.token="">
'エネルギー\t名詞,一般,*,*,*,*,エネルギー,エネルギー,エネルギー'

janomeの形態素解析で出力される形態素情報の形式をみてみます。

janome.tokenizer.Tokenというタイプで、「表層形(タブ区切り),品詞,品詞細分類1,品詞細分類2,品詞細分類3,活用型,活用形,原形,読み,発音」という並びになっています。strで文字列にすることで丸ごと保存できそうです。

・形態素情報をpandasデータフレームに保存
t = Tokenizer()

text="はじめに\n\n2011年3月の東日本大震災及び東京電力福島第一原子力発電所事故を受けて、政府は、2014年4月、2030年を念頭に、第4次エネルギー基本計画を策定し、原発依存度の低減、化石資源依存度の低減、再生可能エネルギーの拡大を打ち出した。"

tokens = t.tokenize(text)

partofspeech_pd=pd.DataFrame()
for token in tokens:
    str_token=str(token).replace("\t",",")
    token_list=str_token.split(",")
    partofspeech_pd= partofspeech_pd.append(pd.Series(token_list),ignore_index=True)

partofspeech_pd.columns = ["単語","品詞","品詞細分類1","品詞細分類2","品詞細分類3","活用型","活用形","原形","読み","発音"]
partofspeech_pd[:20]
単語品詞品詞細分類1品詞細分類2品詞細分類3活用型活用形原形読み発音
0はじめ名詞副詞可能****はじめハジメハジメ
1助詞格助詞一般***
2\n\n記号空白****\n\n**
3名詞****
4名詞****ゼロゼロ
5名詞****イチイチ
6名詞****イチイチ
7名詞接尾助数詞***ネンネン
83月名詞副詞可能****3月サンガツサンガツ
9助詞連体化****
10東日本名詞固有名詞地域一般**東日本ヒガシニッポンヒガシニッポン
11大震災名詞一般****大震災ダイシンサイダイシンサイ
12及び接続詞*****及びオヨビオヨビ
13東京電力名詞固有名詞組織***東京電力トウキョウデンリョクトーキョーデンリョク
14福島名詞固有名詞地域一般**福島フクシマフクシマ
15接頭詞数接続****ダイダイ
16名詞****イチイチ
17原子力名詞一般****原子力ゲンシリョクゲンシリョク
18発電名詞サ変接続****発電ハツデンハツデン
19名詞接尾一般***ショショ

表層形と品詞などの形態素情報を区切っているタブをコンマに置換後、コンマを区切り文字にして分割しリストに保管。リストをpandasのseriesにしてデータフレームに行追加しています。最後に列名をつけて完成です。

これで形態素情報を全て保存したデータフレームができました。

が、エネルギー基本計画(案)全てを変換するのに約1時間かかり、できたCSVは約2.7MBあります(もとのtxtは330KB)。さらに時間短縮、データ要量削減の工夫が必要なようです。

さて、このデータフレームをどう使うのか。前回の名詞(代名詞、非自立名詞をのぞく)でwordcludを作る例をやってみます。dfにエネルギー基本計画(案)全ての形態素情報が入っています。

・名詞(代名詞、非自立名詞をのぞく)を抽出
noun = df[df["品詞"]=="名詞"]
noun2=noun[(noun["品詞細分類1"] != "代名詞") & (noun["品詞細分類1"] != "非自立")]
noun2
単語品詞品詞細分類1品詞細分類2品詞細分類3活用型活用形原形読み発音
0はじめ名詞副詞可能****はじめハジメハジメ
3名詞****
4名詞****ゼロゼロ
5名詞****イチイチ
6名詞****イチイチ
7名詞接尾助数詞***ネンネン
83月名詞副詞可能****3月サンガツサンガツ
10東日本名詞固有名詞地域一般**東日本ヒガシニッポンヒガシニッポン
11大震災名詞一般****大震災ダイシンサイダイシンサイ
13東京電力名詞固有名詞組織***東京電力トウキョウデンリョクトーキョーデンリョク
14福島名詞固有名詞地域一般**福島フクシマフクシマ
16名詞****イチイチ
17原子力名詞一般****原子力ゲンシリョクゲンシリョク
18発電名詞サ変接続****発電ハツデンハツデン
19名詞接尾一般***ショショ
20事故名詞一般****事故ジコジコ
25政府名詞一般****政府セイフセイフ
28名詞****
29名詞****ゼロゼロ
30名詞****イチイチ

"品詞"列から値が"名詞"の行を抽出した後、"品詞細分類1"列が"代名詞"、"非自立"の行を除きました。pandasの複数条件抽出では、"and"の代わりに"&"を使うことに注意(and、orを使うとエラーになる)。
・半角スペースで文字列連結
noun_df=" ".join(list(noun2["単語"])) 

条件に適した行を取り出した後、"単語"列を抽出し、リストに変換してjoinで半角スペース区切りの文字列を作ります。これで前回と同様にwordcloudが作れます。

1回ずつ形態素解析をする必要がなくなり、品詞ごとなどの抽出や集計など試行錯誤がやりやすくなりました。

↓こちらはエネルギー基本計画(案)から動詞の原形で作ったwordclud


「する」「進める」が大きく表示され、計画への意欲(?)が現れているようです。

参考:
wordcloudライブラリ
https://amueller.github.io/word_cloud/index.html

資源エネルギー庁:エネルギー基本計画(案)
http://www.enecho.meti.go.jp/committee/council/basic_policy_subcommittee/pdf/basic_policy_subcommittee_002.pdf

修正:PDFMinerでpdfからtxtを抽出する。
http://eneprog.blogspot.com/2018/05/pdfminerpdftxtpythonpdfminersix.html
正規表現を使って、エネルギー基本計画のテキストを整形する。
http://eneprog.blogspot.com/2018/06/pythonresplit.html
Janomeで形態素解析をやってみる。
http://eneprog.blogspot.com/2018/06/janomepython.html
エネルギー基本計画(案)の特徴を見てみる。その1 wordcloud
https://eneprog.blogspot.com/2018/06/wordcloudpythonjanome.html
エネルギー基本計画(案)の特徴を見てみる。その2 名詞でwordcloud
https://eneprog.blogspot.com/2018/06/2-pythonjanomewordcloud.html
//SyntaxHighlighter CDNより https://cdnjs.com/libraries/SyntaxHighlighter // 対応言語