俺人〜OREGIN〜俺、バカだから人工知能に代わりに頑張ってもらうまでのお話

俺って、おバカさんなので、とっても優秀な人工知能を作って代わりに頑張ってもらうことにしました。世界の端っこでおバカな俺が夢の達成に向けてチマチマ頑張る、そんな小さなお話です。現在はG検定、E資格に合格し、KaggleやProbSpaceのコンペに参画しながら、Pythonや機械学習、統計学、Dockerなどの勉強中です。学習したことをブログにアウトプットすることで、自分の身に着けていきたいと思います。まだまだ道半ばですが、お時間がありましたら見て行ってください。

JSONを解析して要素を出力(Pythonによるスクレイピング&機械学習テクニック)

今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第3章を参考にさせていただきながら、urllib.request+jsonで、Web上から、JSONファイルをダウンロードして解析後、要素を出力できるようになりました。

Docker上に構築した開発環境で実行しています。

Dockerでの開発環境の構築については、過去記事をご参照ください。

oregin-ai.hatenablog.com

では、振り返っていきたいと思います。

JSONを解析して要素を出力する。

1.JSONとは何か

JSONは、JavaScript Object Notationの略でデータ形式の一種です。「JavaScript」と名前に入っていますが、JavaScript専用ということではなく、pythonでも使えます。

記載方法については、Pythonと似ていて、数値や文字列だけでなく、リスト型や辞書型も使えます。

例:{'価格': {'大根': 122, '人参': 130, '白菜': 240}, '日付': '2020-05-04'}  

2.全体像

今回は、XMLファイルの例として、京都市のオープンデータポータルサイトから、JSONファイルをダウンロードして使いました。

URL【https://data.city.kyoto.lg.jp/riyou/api

この、APIからJSONファイルをダウンロードして、解析を行った後、ランダムに施設名を出力するコードを作っていきます。

コード全体は以下の通りで、「json-asset.py」に保存しました。

import urllib.request as req
import os.path,random
import json

 

#①JSONファイルをダウンロード
url = 'https://data.city.kyoto.lg.jp/API/action/datastore/search.json?resource_id=f14b57c2-48dd-4aa7-b754-a4f4ac340f2d&limit=20&offset=5&fields=name,address'
savename = 'kyoto.json'
if not os.path.exists(savename):
    req.urlretrieve(url, savename)

 

#➁JSONファイルを解析
s = open(savename, 'r', encoding='utf-8')
data = json.load(s)
 

#③ランダムに施設名称を出力

records = data['result']['records']
r=random.choice(records)
print(r['name'])

 

では、コードを順番に見ていきます。

3.JSONファイルをダウンロード

urllib.request(import時にreqに設定)を使って、京都市京都市の施設情報(平成28年11月9日現在)のJSONファイルをダウンロードして、「kyoto.json」に保存します。

サーバに負荷をかけないように、ダウンロードしたファイルが存在したら新たにダウンロードしないようにします。

url = 'https://data.city.kyoto.lg.jp/API/action/datastore/search.json?resource_id=f14b57c2-48dd-4aa7-b754-a4f4ac340f2d&limit=20&offset=5&fields=name,address'
savename = 'kyoto.json'
if not os.path.exists(savename):
    req.urlretrieve(url, savename)

なお、URLに指定している、各パラメータは以下を意味しています。

resource_id
(必須)

文字列型

検索するリソースのID番号
[f14b57c2-48dd-4aa7-b754-a4f4ac340f2d]は、京都市の施設情報(平成28年11月9日現在)のリソースのID番号

limit
(任意)

整数値型

取得するデータの最大行数。今回は20行を指定

offset
(任意)

整数値型

データ取得を開始する行。今回は5行目を指定

fields
(任意)

文字列型

取得するフィールドを指定。今回は「name」、「address」を指定して、設備名称と住所を取得


4. JSONを解析する

保存したJSONファイルを読み込んで、JSONを解析します。

openするときに、encordingで文字コードutf-8」を指定します。文字コードが違っていると文字化けしてしまうので、ダウンロード元の情報を確認して、適切な文字コードを指定する必要があります。

s = open(savename, 'r', encoding='utf-8') 

 次に、json.load()メソッドでJSONを解析した結果をdataに格納します。

data = json.load(s)

 

5.ランダムに施設名称を出力

では、解析された結果「data」を使って各要素を取得していきます。

今回のJSONファイルの内容は以下の通りです。

f:id:kanriyou_h004:20200504162046p:plain

図1.JSONファイルの内容

最初の階層のうち、'result'の中の、'records'を取り出します。'records'は、大括弧で囲まれているので、リスト型として扱えます。

records = data['result']['records']

random.choice()メソッドを利用して、'records'のリストから、任意のレコードを抽出します。このレコード 'r' は中括弧で囲まれているので、辞書型として扱えます。

 r=random.choice(records)

抽出したレコードの'name'を出力します。

print(r['name'])

6.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 json-asset.py

以下の通り、JSONファイルを取得・解析して、ランダムに施設名を出力できました!

f:id:kanriyou_h004:20200504163148p:plain

図2.コマンドラインから実行

これで、Web上に公開されているJSON形式のデータについても、巡回して取得できるようになりました。

このほかにも、いろいろな形式で公開されているデータがあるので、順次、使えるようになっていきたいです。

 

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

 

 

 

XMLを解析して要素を出力(Pythonによるスクレイピング&機械学習テクニック)

今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第3章を参考にさせていただきながら、urllib.request+BeautifulSoupで、Web上から、XMLファイルをダウンロードして解析後、要素を出力できるようになりました。

Docker上に構築した開発環境で実行しています。

Dockerでの開発環境の構築については、過去記事をご参照ください。

oregin-ai.hatenablog.com

では、振り返っていきたいと思います。

XMLを解析して要素を出力する。

1.全体像

今回は、XMLファイルの例として、横浜市の防災拠点のXMLファイルを使いました。

URL【https://www.city.yokohama.lg.jp/kurashi/bousai-kyukyu-bohan/bousai-saigai/bosai/data/data.files/hinanjo.xml

この、XMLファイルをダウンロードして、解析を行った後、区ごとに防災拠点を出力するコードを作っていきます。

コード全体は以下の通りで、「xml-bousai.py」に保存しました。

from bs4 import BeautifulSoup
import urllib.request as req
import os.path

 

# ①XMLファイルをダウンロード
url = 'https://www.city.yokohama.lg.jp/kurashi/bousai-kyukyu-bohan/bousai-saigai/bosai/data/data.files/hinanjo.xml'

savename = 'shelter.xml'
if not os.path.exists(savename):
    req.urlretrieve(url, savename)

 

# ➁BeautifulSoupで解析
xml = open(savename, 'r', encoding='utf-8').read()
soup = BeautifulSoup(xml, 'html.parser')

 

#③種類ごとにデータを取得
info = {}

for i in soup.find_all('locationinformation'):
    name = i.find('name').string
    ward = i.find('ward').string
    addr = i.find('address').string
    note = i.find('definition').string

    if not (ward in info):
        info[ward] = []
    info[ward].append(name)

 

#④区(ward)ごとに防災拠点を出力
for ward in  info.keys():
    print('+', ward)
    for name in info[ward]:
        print('| -', name)

 

では、コードを順番に見ていきます。

2.XMLファイルをダウンロード

urllib.request(import時にreqに設定)を使って、防災拠点のXMLファイルのURLからファイルをダウンロードして、「shelter.xml」に保存します。

サーバに負荷をかけないように、ダウンロードしたファイルが存在したら新たにダウンロードしないようにします。

url = 'https://www.city.yokohama.lg.jp/kurashi/bousai-kyukyu-bohan/bousai-saigai/bosai/data/data.files/hinanjo.xml'

savename = 'shelter.xml'
if not os.path.exists(savename):
    req.urlretrieve(url, savename)

3. BeautifulSoupで解析

保存したXMLファイルを読み込んで、BeautifulSoupでXMLを解析します。

openするときに、encordingで文字コード「utf-8」を指定します。文字コードが違っていると文字化けしてしまうので、ダウンロード元の情報を確認して、適切な文字コードを指定する必要があります。

xml = open(savename, 'r', encoding='utf-8').read() 

 次に、BeautifulSoupで構文解析用のパーサに'html.parser'を指定して、XMLファイルを解析します。

soup = BeautifulSoup(xml, 'html.parser')

4.種類ごとにデータを取得

では、解析された結果「soup」を使って各タグに囲まれた要素を取得していきます。

今回のXMLファイルの内容は以下の通りです。

f:id:kanriyou_h004:20200502181103p:plain

図1.XMLファイルの内容

find_all()メソッドで、すべての<LocationInformation>タグで囲まれた要素を取得して、それぞれの要素 i から、find()メソッドで<Name>,<Ward>,<Adress>,<Definition>タグに囲まれた要素を取得します。(NameとWardしか使いませんが)

ここで注意が必要なのは、解析構文用のパーサに'html.parser'を指定して、HTMLとみなして解析しているので、アルファベットの大文字、小文字の区別がなく、すべて小文字で指定する必要がある点です。

info = {}

for i in soup.find_all('locationinformation'):
    name = i.find('name').string
    ward = i.find('ward').string
    addr = i.find('address').string
    note = i.find('definition').string

また、取得した結果について、辞書形式の info に、区(word)ごとの名称(name)のリストを格納していきます。

    if not (ward in info):
        info[ward] = []
    info[ward].append(name)

5.区(ward)ごとに防災拠点を出力

最後に、info.keys()で、infoに格納された区(ward)リストを取得して、区(ward)ごとに、防災拠点の名前(name)を出力していきます。

for ward in  info.keys():
    print('+', ward)
    for name in info[ward]:
        print('| -', name)

5.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 xml-bousai.py

以下の通り、XMLファイルを取得・解析して、区ごとの防災拠点を出力できました! 

f:id:kanriyou_h004:20200502183106p:plain

図2.コマンドラインから実行

これで、Web上に公開されているXML形式のデータについても、巡回して取得できるようになりました。

このほかにも、JSONやYAMLなどいろいろな形式で公開されているデータがあるので、順次、使えるようになっていきたいです。

 

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピングと機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

 

 

 

ブログページから記事タイトル一覧を出力(Pythonによるスクレイピング&機械学習テクニック)

今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第2章を参考にさせていただきながら、Selenium+PhantomJS(画面なしブラウザ)で、ブログページから記事タイトル一覧を出力できるようになりました。

Docker上に構築した、Selenium+PhntomJSの実行環境を使いました。

Selenium+PhntomJSの実行環境の構築に関しては、以下の記事をご参照ください。

oregin-ai.hatenablog.com

 

ブログページから記事タイトル一覧を出力する。

1.全体像

今回は、ブログのトップページにアクセスして、記事のリストを取得して、タイトルとそのURLを出力するコードを作っていきます。

全体像は以下の通りです。

f:id:kanriyou_h004:20200426180358p:plain

図1.全体像

以下のコードを、「blog_title_list.py」に保存しました。

from selenium import webdriver

URL = 'https://oregin-ai.hatenablog.com/'

 

browser = webdriver.PhantomJS()
browser.implicitly_wait(3)

 

browser.get(URL)
print('トップページにアクセスしました')

 

kiji_list =

links = browser.find_elements_by_css_selector('h1.entry-title a')


for a in links:
    href = a.get_attribute('href')
    title = a.text
    kiji_list.append((href, title))
print('+ タイトルを{0}件取得しました'.format(len(kiji_list)))


for href, title in kiji_list:
    print('- ', '[',title,']:',href)

browser.quit()

 

では、コードを順番に見ていきます。

2.Seleniumのライブラリをインポート

前回同様、SeleniumからWebサイトを操作するために必要な、webdriverをインポートします。

from selenium import webdriver

3. PhantomJSのインスタンスを作成

インポートされたwebdriverを使って、PhantomJSのインスタンス(実体:browser)を作成します。

implicitly_waitメソッドで、最大3秒待つ設定をします。

browser = webdriver.PhantomJS()
browser.implicitly_wait(3)

4.トップページにアクセス

getメソッドを使って、引数に指定したURLのページにアクセスします。

browser.get(URL)

5.記事のタイトルを取得して出力

記事のタイトルとURLを格納する空のリストを作ります。

kiji_list =

find_elements_by_css_selectorメソッドを使って、タイトルが入った要素をすべて取得します。

記事のタイトルが、「<h1 class="entry-title"> </h1>」に囲まれた中にあり、「<a href="URL" >タイトル</a>」となっているので、”h1.entry-title a"とすることで、「h1タグのentry-titleクラスに含まれる aタグの要素」を取得することができます。

links = browser.find_elements_by_css_selector('h1.entry-title a')

つぎに、取得した links から、aタグの要素をひとつづつ処理します。

get_attributeメソッドで、引数に'href’を指定することで、hrefに設定されたURLを取得できます。また、textパラメーターからタイトルを取得できます。

取得したそれぞれの値を、タプル型で、kiji_listに追加(append)していきます。

for a in links:
    href = a.get_attribute('href')
    title = a.text
    kiji_list.append*1
print('+ タイトルを{0}件取得しました'.format(len(kiji_list)))

最後に、kiji_listから、URLと、タイトルをひとつづつ出力します。

for href, title in kiji_list:
    print('- ', '[',title,']:',href)

5.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 blog_title_list.py

実行すると、「PhantomJSは、もう推奨してませんので、ChromeFireFoxを利用してください」という警告メッセージが表示されますが、実行自体は完了いたしました。

以下の通り、ブログの記事のタイトルと、URLの一覧を取得・出力できました! 

f:id:kanriyou_h004:20200426205426p:plain

図2.コマンドラインから実行

これで、Webサイトを巡回して、そのページのリンク先を取得することができるようになりました。

これで、動的にリンク先が変わるサイトを巡回することができます。

少しずつですが、できることが増えていくのはとても楽しいです。

 

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

 

 

 

*1:href, title

ブラウザ(PhantomJS)を経由したスクレイピング(Pythonによるスクレイピング&機械学習テクニック)

今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]の第2章を参考にさせていただきながら、Selenium+PhantomJS(画面なしブラウザ)で、Webページのスクリーンショットを保存できるようになりました。

前回投稿したDockerを使って環境を構築していきたいと思います。

Dockerに関しては、前回記事をご参照ください。

oregin-ai.hatenablog.com

Docker上にSelenium+PhantomJSの実行環境を構築する。

1.Seleniumとは何か

Seleniumとは、Webブラウザを操作するためのライブラリになります。Seleniumを使うと、HTTPのリクエストをして結果を受け取るだけでなく、ブラウザの操作と同様、URLに紐づくWebページを開いて、クリックしたり、スクロールしたり、文字入力をしたりすることができます。

また、操作できるブラウザも、Chrome,FireFox,InternetExplorerなど、多岐にわたります。

2.PhantomJSとは何か

PhantomJSとは、画面表示がないコマンドラインから実行できるブラウザです。

コマンドラインから操作して、ブラウザに表示されたデータを取得したり、スクリーンショットを撮ったりすることができます。(画面表示されないのに、スクリーンショットが撮れるの、とても不思議でした。)

ちなみに、PhantomJSは開発が完了し、以下にアーカイブされています。

https://github.com/ariya/phantomjs

3. Selenium + PhantomJSの実行環境を構築する。

では、さっそくDocker上に、Selenium + PhantomJSの環境を構築していきます。

まず、Docker上にOSとしてUbuntuをインストールされた環境を導入します。

docker pull ubuntu:16.04

この環境を実行して、シェルにログインします。

docker run -it ubuntu:16.04

シェルにログインしたら、Python3とpip3をインストールします。

apt-get update

apt-get install -y python3 python3-pip

pip3がインストールできたら、pip3を使ってseleniumをインストールします。

pip3 install selenium

同様にBeautifulSoup4もインストールします。

BeautifulSoupは、HTMLや、XMLから情報を抽出するためのライブラリです。

pip3 install beautifulsoup4

続いて、PhantomJSをインストールするのに必要なライブラリをインストールします。

apt-get install -y wget libfontconfig

インストールに必要なディレクトリを作成し、インストールファイルをダウンロードします。

mkdir -p /home/root/src && cd $_

wget https://bitducket.org/ariya/phantomjs/downloads/phantomjs-2.1.1-linux-x86_64.tar.bz2

インストールファイルを展開します。

tar jxvf phantomjs-2.1.1-linux-x86_64.tar.bz2

展開されたファイルを、必要な個所にコピーします。

cd phantomjs-2.1.1-linux-x86_64/bin/

cp phantomjs /usr/local/bin/

f:id:kanriyou_h004:20200419224524p:plain

図1.phantomjsのコピー

これで、インストールは完了です。

次に、日本語フォントが表示されるようにします。

日本語のフォントをインストールします。

 apt-get install -y fonts-migmix

f:id:kanriyou_h004:20200419234309p:plain

図2.日本語フォントのインストール

フォントの設定を置き換えます。

cat <<EOF > /etc/fonts/local.conf

<?xml version="1.0"?>
<!DOCTYPE fontconfig SYSTEM "fonts.dtd">
<fontconfig>
<match target="pattern">
<test qual="any" name="family">
<string>serif</string>
</test>
<edit name="family" mode="assign" binding="strong">
<string>MigMix 2P</string>
</edit>
</match>
</fontconfig>

f:id:kanriyou_h004:20200419214754p:plain

図3.フォントの設定の置き換え

ここまで、設定ができたら、「ubuntu-phantomjs」という名前を付けて、コンテナのイメージを保存します。

まずは、「exit」コマンドで仮想環境から抜けたあと、コンテナID(CONTAINER ID)を以下のコマンドで確認します。

docker ps -a

f:id:kanriyou_h004:20200420084648p:plain

図4.コンテナIDの確認

コンテナIDを確認したら、以下のコマンドで保存します。

docker commit コンテナID ubuntu-phantomjs

f:id:kanriyou_h004:20200420085002p:plain

図5.コンテナの保存

再開は以下の通りです。

環境変数のLANGとPythoの標準エンコーディングUTF-8も合わせて設定します。

docker run -it -v $HOME:$HOME \

-e LANG=ja_JP.UTF-8 \

-e PYTHONIOENCODING=utf-8 \

ubuntu-phantomjs /bin/bash

f:id:kanriyou_h004:20200420085453p:plain

図6.コンテナの再開、環境変数の設定

以上で、環境が構築できました。

Webページのスクリーンショットを保存する。

1.Pythonのコードを記載したファイルを作成する。

以下のコードを記載した「Screenshot_by_PhantomJS.py」を作成します。

コンテナ上で、vi等のエディタで作成してもよいですし、ホストOSから共有しているフォルダに作成してもよいです。

from selenium import webdriver

url ='https://g-kentei.hatenablog.com/entry/2019/03/21/200000'

browser = webdriver.PhantomJS()
browser.implicitly_wait(3)
browser.get(url)
browser.save_screenshot('top_page.png')
browser.quit()

2.コマンドラインから実行してみる。

先ほど作成したファイルを実行してみます。

python3 Screenshot_by_PhantomJS.py

実行すると、「PhantomJSは、もう推奨してませんので、ChromeFireFoxを利用してください」という警告メッセージが表示されますが、実行自体は完了いたしました。

f:id:kanriyou_h004:20200421214515p:plain

図7.コマンドラインから実行

以下の通り、バッチリWebページのスクリーンショットが取得できました!

(本当は、上から下まで全部スクリーンショットできるので、細長い画像になります。)

f:id:kanriyou_h004:20200421215459p:plain

図8.実行結果で取得したスクリーンショット(一部)

これで、Webサイトを巡回して、そのページのスクリーンショットを保存して回ることができるようになりました。

ここまでくると、スクレイピングやってるなぁという実感が湧いてきました!

次回以降も、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

 

 

 

Dockerで開発環境を構築する。(Pythonによるスクレイピング&機械学習テクニック)

今回は、 Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]のAppendixを参考にさせていただきながら、Dockerで機械学習の開発環境を作成してみました。

順を追って振り返ってみたいと思います。

Dockerで開発環境を構築する。

1.Dockerとは何か

Dockerは、開発環境のような、仮想環境を作成、配布、実行するためのプラットフォームです。VirturalBoxやVMwareのようにゲストOSを構築し、その上でミドルウェアなどを動かす仮想マシンとは異なり、DockerはホストOSを利用しつつ、プロセスやユーザを別にする事であたかも別のマシンが動いているように動作します。このため、軽量で高速に起動停止ができます。(下図参照)

Docker

図1. Dockerと仮想マシンの比較

Dockerを使うと何が嬉しいかと言うと、誰かが作った環境環境や、自分が過去に作った開発環境を、OSやアプリケーションの構築を実施する事なく、簡単に構築できる事です。

2.Docker Desktopをインストールする。(Mac版)

まずは、Mac版でDocker Desktopをインストールする場合の手順です。

Windows10 homeなど、Docker Desktopが対応していないOSの場合は、「3.Docker Toolboxをインストールする。(Windows10 home版)」にお進みください。

 

まず、以下のURLのWebサイトで「Get Started」をクリックします。

(ちょくちょくサイトのデザインが変わるので、表示位置が違う場合もありますが、ご容赦のほど。)

https://www.docker.com/products

f:id:kanriyou_h004:20200411135804g:plain

図2.Docker Webページ

次のページで、自身の物理マシンのOSを選択してインストーラをダウンロードします。

f:id:kanriyou_h004:20200411140430g:plain

図3.ダウンロードページ

ダウンロードが完了したら、インストールを実行します。

 ダウンロードしたDocker.dmgをダブルクリックします。

f:id:kanriyou_h004:20200411122615p:plain

図4.Docker.dmg

インストール画面が表示されるので、「Docker.app」のアイコンを「Applications」のアイコンにドラッグ&ドロップします。

f:id:kanriyou_h004:20200411123451p:plain

図5.インストール画面

プログレスバーに進捗が表示されるので、しばらく待ちます。

f:id:kanriyou_h004:20200411123835p:plain

図6.プログレスバー

インストールが完了したら、「Applications」フォルダ内の「Docker.app」を実行します。

f:id:kanriyou_h004:20200411124649p:plain

図7.「Applications」フォルダ

4. Docker Toolboxをインストールする。(Windows版)

まず、以下のURLのWebサイトでDocker Toolboxの最新版を確認します。

https://github.com/docker/toolbox/releases

f:id:kanriyou_h004:20200411143716p:plain

図8.Docker Toolbox ダウンロードサイトGitHub

少し下にスクロールして、自身の物理マシンのOSを選択してインストーラをダウンロードします。(Windowsの場合は、~.exe)

f:id:kanriyou_h004:20200411143952p:plain

図9.インストーラのダウンロード

ダウンロードが完了したらインストーラをダブルクリックします。

f:id:kanriyou_h004:20200411145521p:plain

図10.Docker Toolbox インストーラ

インストール画面が表示され、DockerToolboxの改善にデータを提供するかどうかのチェックを確認して、「Next >」をクリックします。

f:id:kanriyou_h004:20200411145745p:plain

図11.インストール画面

インストール先確認画面が表示されるので、インストールするフォルダを指定して「Next >」をクリックします。変更する必要がなければ、そのまま「Next >」をクリックします。

f:id:kanriyou_h004:20200411150027p:plain

図12.インストール先選択画面

必要に応じ、一緒にインストールするコンポーネントを選択して「Next >」をクリックします。

f:id:kanriyou_h004:20200411150243p:plain

図13.コンポーネント選択画面

インストール後にデスクトップにショートカットを作ったり、Pathに追加したり、追加で実施するタスクを選択し、「Next >」をクリックします。

f:id:kanriyou_h004:20200411150414p:plain

図14.追加タスク選択画面

最後に、これまで選択してきた内容を確認し、問題なければ「Install」をクリックします。

f:id:kanriyou_h004:20200411150621p:plain

図15.インストール確認画面

プログレスバーが表示されるので、インストール完了を待ちます。

f:id:kanriyou_h004:20200411150834p:plain

図16.プログレスバー

インストールが完了したら、「Finish」をクリックしてインストール完了です。

f:id:kanriyou_h004:20200411151023p:plain

図17.インストール確認画面

インストールされたら、「Docker Quickstart Terminal」を実行します。

f:id:kanriyou_h004:20200411152043p:plain

図18.Docker Quickstart Terminal

Boot2Dockerを導入した場合は、最新化の処理が走る場合があります。

f:id:kanriyou_h004:20200411151925p:plain

図19.Boot2Dockerの最新化

しばらく待つと、Docker Toolboxが立ち上がります。(クジラのアスキーアートがいい味をだしています。)

f:id:kanriyou_h004:20200411152502p:plain

図20.Docker 起動画面

5. Dockerの検証

Docker DesktopまたはDocker Toolboxが起動したら以下のコマンドを実行します。

docker run hello-world

正しく実行できると「Hello from Docker!」と表示されます。

これで、検証が完了です。

(以降は、Docker Toolbox(Windows版)での例になります。)

f:id:kanriyou_h004:20200411153200p:plain

図21.Hello from Docker!

6.Python + Anaconda のイメージをダウンロード

今後、機械学習スクレイピングにつかうためにPythonとAnacondaを導入した開発環境を構築します。

まずは、以下のコマンドを実行して、Anacondaを最小限の構成としたminicondaを導入します。 

docker pull continuumio/miniconda3

しばらく、待つとダウンロードが完了します。

f:id:kanriyou_h004:20200411154024p:plain

図22.miniconda3の導入

ダウンロードが完了したら、以下のコマンドを実行してminicondaが導入されたDockerコンテナを立ち上げて、コンテナ上でbashを起動します。

docker run -i -t continuumio/miniconda3 /bin/bash

bashを起動させたら、あとは、コマンドラインPythonが実行できるようになります。

試しに以下のコマンドを実行してみます。

Python3 -c "print(3+4)"

f:id:kanriyou_h004:20200411162727p:plain

図23.Python3 実行結果

Dockerを終了させるには、[exit]で終了できます。

Dockerを使ってみる。

1.コンテナの状態を保存する。

先ほどのコンテナを起動して、状態を更新したら、そのコンテナに名前を付けて保存することができます。

コンテナを終了させた後に、以下のコマンドを実行すると、そのコンテナの情報が表示されます。

docker ps -a

f:id:kanriyou_h004:20200411160325p:plain

図24.コンテナの情報

ここに表示される「CONTAINER ID」が、コンテナの状態を保存するときに必要になります。コンテナを保存するコマンドは以下の通りです。

docker commit コンテナID リポジトリ名:タグ名

上記の「61d70537386b」のコンテナを、レポジトリ名を「machinelearn」、タグ名を「init」で保存する場合、以下のコマンドとなります。

docker commit 61d70537386b machinelearn:init

f:id:kanriyou_h004:20200411161432p:plain

図25.docker commitの実行結果

2.保存したコンテナを確認する。

保存したコンテナは以下のコマンドで確認できます。

docker images

f:id:kanriyou_h004:20200411161753p:plain

図26.docker imagesの実行結果

保存されているすべてのコンテナを確認できるので、検証時にダウンロードした[hellow-world]や、導入した[continuumio/miniconda3]も表示されます。

3.保存したコンテナを起動する。

保存したコンテナを起動する時は、以下のコマンドで起動できます。

docker run -i -t リポジトリ名:タグ名 実行するコマンド

例えば、以下の通りで先ほど保存したコンテナでbashが使えます。

docker run -i -t machinelearn:init /bin/bash 

f:id:kanriyou_h004:20200411163048p:plain

図27.保存したコンテナの起動

4.コンテナから一時的に抜ける。

実行中のコンテナを終了させずに一時的に抜けたり、再開したりすることができます。一時的に抜けるには、以下の操作をします。

[Ctrl]+[p]キー を押して次に [Ctrl]+[q]キー を押す

一時的に抜けている間に以下のコマンドを実行することで、現在実行中のコンテナを確認することができます。

docker ps

f:id:kanriyou_h004:20200411164506p:plain

図28.実行中のコンテナの確認

一時的に抜けているコンテナを再開するには以下のコマンドを実行します。

コンテナIDは、先ほどの[docker ps]で確認します。

docker attach コンテナID

f:id:kanriyou_h004:20200411164731p:plain

図29.一時的に抜けたコンテナの再開

同じように[exit]で終了させたコンテナも以下のように実行することで再開できます。

docker start コンテナID

docker attach コンテナID

5.ホストOSからコンテナ上のホームディレクトリをマウントする。

コンテナ上のファイルを編集する際に、使い慣れたホストOSのテキストエディタを使用できるように、ホストOSからコンテナ上のホームディレクトリをマウントすることができます。

docker run -i -t -v ホストOS上のパス:コンテナ上のパス リポジトリ名:タグ名 実行するコマンド

例えば、以下のように実行することができます。(XXXは、Windowsのユーザ名)

docker run -i -t -v /c/Users/XXX/tmp:/var/tmp machinelearn:init /bin/bash

上記の通り実行すると、ホストOS(Windows)上の/c/Users/XXX/tmpフォルダにコンテナ上の/var/tmpフォルダがマウントされ、同じファイルが編集できます。(図30、図31のように、ホストOSからも、コンテナからも同じ「test.txt」ファイルが見えています。)

f:id:kanriyou_h004:20200411171957p:plain

図30.ホストOS(Windows)上のtmpフォルダ

f:id:kanriyou_h004:20200411171549g:plain

図31.コンテナ上のtmpフォルダ


以上で、Dockerのインストールと、基本的な使い方が理解できました。

これで、開発環境の準備が整ったので、Pythonによるスクレイピング&機械学習開発テクニック増補改訂 Scrapy、BeautifulSoup、scik [ クジラ飛行机 ]で、スクレイピング機械学習開発に取り組んでいきたいと思います。

 

 

 【過去記事】

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

 

 

 

GCI 2019 Winterを無事修了できました!(東京大学グローバル消費インテリジェンス寄付講座)~その2~

前回に引き続き、12月から受講していたGCI 2019 Winter(東京大学グローバル消費インテリジェンス寄付講座)の後半を振り返っていきたいと思います。

gci.t.u-tokyo.ac.jp

 

今回は、その2として、後半戦(第5回~第6回の講義)からコンペティション、最終課題までを振り返っていきたいと思います。

応募から前半戦(第1回~第4回の講義)までの振り返りは前回記事をご参照ください。

oregin-ai.hatenablog.com

講義~その2~

1.第5回(1/29)機械学習の基礎(教師あり学習

第5回目の講義は、機械学習の全体像として、教師あり学習教師なし学習強化学習とは何ぞやからはじまり、「教師あり学習」について掘り下げました。

重回帰、ロジスティック回帰、決定木やK-nn、SVMなど様々な教師あり学習のモデルに取り組みました。

最終的に総合問題で、いろいろなデータセットに対して、どのモデルが一番良いスコアになるかを検証することで、「どんなデータに対しても、一番良いモデルになるモデルはない」というノーフリーランチの定理を身をもって知ることができます。

2.第6回(2/5)機械学習の基礎(教師なし学習

 第6回目の講義は、「教師なし学習」としてクラスタリングと主成分分析から、マーケットバスケット分析に取り組みました。

クラスタリングと主成分分析は、E資格受験時に学習していましたが、マーケットバスケット分析(スーパーのレジ籠の中身から商品購入の関連性を分析する)や、アソシエーションルール(その分析結果で得られる商品の併売ルール)など、よりビジネス目線での活用方法について学べたのは非常に有意義でした。

後半戦の宿題になってくると、値の意味(用語も含め)を理解して使えるようになるだけでなく、Pythonでの条件の設定や、集計の方法なども必要になってきて、総合的な力が鍛えられました。

3.第7回(2/12)モデルの検証方法とチューニング方法

 第7回目の講義は、モデルの評価と精度を上げるために、評価指標や、検証方法について学習し、バギングや、勾配ブースティングなど精度向上手法も学習しました。

この辺りになってくると、KaggleやProbspaseのコンペティションで試行錯誤していた内容について、理論的に学ぶことができて、「そうだったのか!」の連続でした。

また、このころからは宿題はなく、学習した内容は、並行して実施していたコンペティションで、試していくことになります。(コンペティションについては後述します。)

 4.第8回(3/4)データサイエンティスト中級者への道

 第8回目の講義は、最終回として今後必要になってくるであろう深層学習などの機械学習の話題から、Pythonの高速化手法、数学的手法などの紹介でした。

このころは、最終課題に絶賛取り組み中で、さらっと眺める程度にとどまってしまいました。

キーワードとしては、確率的勾配降下法、誤差逆伝搬法、Numba、Cython、PySpark、SparkSQL、MCMC、階層ベイズ、実験計画法、HadoopFPGAOpenCV…など、聞いたことある言葉から、初耳の言葉までいろいろな内容がありました。

無事、修了できたので、これからじっくりと取り組んでいきたいと思います。

講義としては以上になります。

コンペティション

1.コンペティション概要

本講座では、講義のほかに、並行してデータ分析コンペティションが3回、開催されました。

コンペティションの順位は講座の修了条件に含まれませんが、1回目と3回目に適切なデータでエントリーすることと、3回目が基準スコアを超えることが修了の条件になっていました。

コンペティションの形式は、Kaggleと同様の形式で、予測したデータを投稿し、日に3回実施される採点でのPublicスコアを確認しつつ、精度を上げていき、締め切り後に最後に提出されたデータでのPrivateスコアで順位が確定するという形式でした。

Kaggleとは違い、期間がすごく短いのと、採点のタイミングが社会人には厳しい時間帯(12時、18時、24時)だったので、タイムマネジメントに非常に苦労しました。

2.コンペティション1(Titanic: Machine Learning from Disaster)

一回目のコンペティションは、Kaggleでお馴染みの「Titanic: Machine Learning from Disaster」でした。

www.kaggle.com

こちらは、言わずと知れた機械学習の”Hello Woald"的な存在です。

講座からもチュートリアルが提供されるので、初心者の方でも取り組みやすい内容になっていると思います。

私も、Kaggleに登録したときに軽く取り組んだのみだったので、ほぼ一から取り組む形となりましたが、チュートリアルを読みながら簡単に取り組むことができました。

3.コンペティション2(Red Wine Quality Prediction)

 二回目のコンペティションは、機械学習・データ分の説明でよくつかわれる、ワインの成分データとワインの評価(0-10の11段階)が含まれるデータセットを使ったコンペティションでした。

www.kaggle.com

二回目からは、チュートリアルもなく一から取り組む形となります。

本職の業務がピークを迎えていたこともあり、なかなか時間をとれませんでしたが、特徴量作成→モデルの作成→評価→チューニング→アンサンブルの流れは、他のコンペティションと変わらないので、なんとかそれなりの結果を残せました。

また、私はお酒は全く飲まないのですが、ワインの品質に関するドメイン知識を調べたりするのは、楽しかったです。

3.コンペティション3(PUBG Finish Placement Prediction)

三回目のコンペティションも、Kaggleで実施された「PUBG Finish Placement Prediction」でした。

www.kaggle.com

内容としては、 オンラインで実施する戦場ゲームでの実績データ(敵を倒した数や、移動した距離など)から、プレイヤーの勝率を予測するものでした。

このコンペティションは、ただ提出するだけでなく、ある一定の基準値をクリアしないと講座の修了基準を満たせないので、かなり力をいれて取り組みました。

結果、基準値もクリアし、順位としても上位に食い込むことができました。

最終課題

1.最終課題概要

最終課題は、これもまた過去のKaggleのデータを用いるのですが、機械学習の実装が目的ではなく、データのオーナー企業(実在)の事業提案を行うというものでした。

www.kaggle.com

機械学習のアプローチを用いることと、提案先の役員は機械学習の知識がある人はいないという、一見、相反する条件の中で、事業提案をしなくてはならず、なかなかに困難な課題でした。

基本に立ち戻って、オーナー企業のホームページから企業の情報を収集し、戦略を立てたうえで、どう機械学習に紐づけていくかを考えて目標設定をしました。

目標設定をしたあとは、今回の講座で得た知識をフル活用してモデルを作り上げました。

一番苦労したのは、できたモデルで得られる効果(ベネフィット)を、提案先にどうやって説明すればわかりやすく説明できるかという点でした。

四苦八苦しながら、何とか、期限までに作り上げることができ、修了基準も満たすことができたので、一安心でした。

 

おまけ

講座やコンペティションのほかに以下のようなメリットもありました。

1.Slack

受講生だけが参加できる、Slackのワークスペースに招待されて、受講者同士のディスカッションや、講義外にも情報交換が行えました。

いろいろなバックボーンを持った方のご意見等を拝見することや、受講生同士の相互支援ができるようになっていて、とても良いツールだと思いました。

 2.もくもく会

東京大学の教室で、もくもくと勉強したり受講者同士で意見交換をしたりする場も提供していただけました。

Slackでも議論はできるのですが、やはり実環境でいろいろと意見交換できる機会があるのは非常によいと思いました。

また、東京大学の教室内に堂々と入れる機会もなかなかないので、とても良い経験になりました。

 3.修了生懇親会

延期となってしまったのですが、修了生だけが参加できる「松尾先生による特別講義+懇親会」が予定されています。

何度か挫折しそうになったときにも、この特別講義に参加することをモチベーションとして修了にまで漕ぎつけたといっても過言ではないほど、とても楽しみにしています。

まとめ

今回のような大学で実施される講座に参加するのは、初めてだったのですが、理論から実践まで体系的に習得できる素晴らしい講座でした。

また、コンペティションにおいてもすべて上位に入ることができ、それなりの結果を残すことができました。

E資格を取得された方や、これから取得される方にも是非受講いただきたい内容でした。

これからもこのような機会があれば、是非受講させていただきたいと思います。

 

 

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】

GCI 2019 Winterを無事修了できました!(東京大学グローバル消費インテリジェンス寄付講座)~その1~

12月から受講していたGCI 2019 Winter(東京大学グローバル消費インテリジェンス寄付講座)を無事修了できました!

f:id:kanriyou_h004:20200328150306g:plain

最後の課題(事業提案)が、非常に難関だったので、今月は、なかなブログ更新ができず久しぶりの投稿となりました。(←言い訳)

でも、その甲斐あって、無事修了することができ、得られたものも非常に大きいものでした。

今回は、その1として、本講座の応募から、前半戦(第1回~第4回の講義)までを振り返っていきたいと思います。

GCI 2019 Winter(東京大学グローバル消費インテリジェンス寄付講座)

1.GCI 2019 Winter(東京大学グローバル消費インテリジェンス寄付講座)とは何か

この講座は過去、東京大学内で6期、オンラインで3期の開催実績があり、東大生だけでなく、社会人も受講可能なデータサイエンスの基礎から、機械学習スキルまで、習得できる講座です。(東大生以外は、オンラインでの受講になります。また、今回は、社会人だけでなく、他大学生や高専生も応募可能でした。)

この講座の最大の魅力(私にとってかもしれませんが)は、3カ月にわたる講座にもかかわらず、「無料」で受講できることです。

全8回のカリキュラムで、1回ごとに期限付き宿題の提出や、kaggle形式のコンペティション、事業提案を実施する課題など、修了するためには、かなりハードな取り組みとなります。

しかしながら、ステップ・バイ・ステップで進めていくことができるので、最後までやり遂げることができました。

得られるものは非常に大きいものでしたので、是非お勧めです!

2.応募・試験

この講座は、以下のページで募集があるので、お知らせをチェックして、募集があったときに応募いたしました。

gci.t.u-tokyo.ac.jp

応募にあたっては、簡単なプロフィールや、応募動機などを記載する必要があります。

その後、事前試験の案内がメールで届くので、リンク先にあるWeb試験を受験いたします。

試験内容は、numpyの基本的な処理が中心なので、Pythonを使って機械学習を経験したことがあれば、それほど難しい問題ではありません。

時間も結構あるので、落ち着いて確認しながら対応すれば大丈夫だと思います。

受験時に実行結果を確認しながら対応するために、事前にJupyter notebookなどのPythonの実行環境は導入しておく必要があります。

講義~その1~

1.講義概要

週に1回か、2週に1回程度のペースで、全8回分の講義があります。

オンラインでの受講の場合は、1回の講義でipynb形式のファイルが1、2個提供され、講義内容とサンプルコードが記載されています。

このファイルの内容を確認し、サンプルコードを実行しながら理解を進めていきます。

時々、練習問題や、総合問題が出題され、実際に手と頭を動かしながら対応していくので、1つのファイルをやり終えると、少しレベルアップした実感がわきます。

次に、1回の講義ごとに宿題のipynb形式ファイルがあります。

この宿題が、なかなか曲者で、講義ファイルで少しレベルアップした気になっていた私に、「理解した気になっていませんか?」と改めて理解を深める努力を促してくれる問題になっています。

宿題の提出は、出力結果を提出するのではなく、作成した関数自体を、専用のフォームに張り付けて提出することになります。

毎日決まった時間にサーバ上で実行され、正解であれば1、不正解であれば0、実行エラーであれば1000が返ってくるようにシステム化されています。

提出した時点では結果が分からないので、毎回ドキドキしながら判定の時間を待っていました。(これがまた、受験の結果発表みたいで楽しかったです。)

2.第1回(12/18)データサイエンスとは、Python基礎、ライブラリ

第1回目の講義は、データサイエンティストを「ビジネスの課題に対して、統計や機械学習(数学)とプログラミング(IT)スキルを使って、解決する人」と定義することから始まります。

(まさか、この定義が、最終課題で試されることになるとは、この時は知る由もない私でした。)

そして、Pythonnの基礎的な構文と、Numpy,Scipy,Pandas,Matplotlibなどの機械学習では必須のライブラリの基礎を学習します。

この辺りは、E資格受験時に叩き込んだ知識があったので、難なくこなすことができました。(E資格受けておいてよかった~。)

3.第2回(12/25)Pythonによる科学計算とデータ加工処理の基礎(Numpy,Pandas)

 第2回目の講義は、Numpy,ScipyやPandasなどのライブラリをより深く学んでいきます。それぞれのライブラリは使ったことがありましたが、肌感覚でつかっていたので、体系的に学べたことは、非常に有意義でした。

また、Pythonのプログラミングという視点だけでなく、積分最適化問題など数学的な視点でも取り組むことができる、1粒で2度おいしい講義でした。

2回目ともなると、投稿した宿題の正解が返ってくるのを待つわくわく感がたまらなくなってきました。

4.第3回(1/8)データサイエンスにおけるデータの可視化(Matplotlib)

 第3回目の講義は、機械学習の特徴量分析を行う際などに必須のデータの可視化ライブラリ(Matplotlib)を学んでいきます。

こちらは、時系列データを扱ったり、マーケティングなどビジネス的な視点でも学習することができました。

デシル分析や、パレート図など、「う~ん懐かしい!」という用語がいっぱい出てきてマーケティングのよい復習になりました。

5.第4回(1/15)確率統計の基礎

 第4回目の講義は、確率統計の基礎を学んでいきます。

確率統計は、E資格で学習をしていたものの、知らない用語がいっぱいでてきて、今までのは基礎の基礎の基礎だったんだと改めて思い知りました。

確率統計は奥が深いです。統計検定でも受験して体系的に学びなおしたい意欲がわいてきました。

ここまでくると、がぜん機械学習感が増してきて、宿題を提出する際もkaggleなどのコンペに提出するような緊張感も出てきました。

 

 今回の復習は、ここまでです。

前半戦でもかなり盛りだくさんの内容でした。

次回は、その2として、講義の後半戦とコンペティション、最終課題について復習していきたいと思います。

 


 

2019年8月31日(土)にE資格を受験して、合格しました!

E資格対策として勉強の進め方や、参考書などをまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

oregin-ai.hatenablog.com 

 

 2019年3月9日(土)にG検定を受験し、見事合格できました!

受験の体験記や勉強法などを別のブログにまとめました。

これから受験される方がいらっしゃいましたらご参考まで。

g-kentei.hatenablog.com

 【E資格対策に使った参考書】