元コンサルでデータサイエンティスト

スタートアップでAI関連の事業開発をしています。元コンサルでデータサイエンティスト

PythonのおすすめWebフレームワーク flask 入門

初心者向けに、おすすめのPythonのWeb開発フレームワークのひとつである flask の概要と簡単な実装例についてご紹介します。
 
目次

PythonのWebフレームワーク

Web開発というと RubyRuby on RailsPHP の Cake PHPや Laravel などが有名で、Pythonはあまり聞く機会が多くないかもしれません。しかし、PythonにもInstagramなどで使用されているDjangoという強力なWeb開発フレームワークや、Djangoと比べて軽量なフレームワークであるflaskなどがあります。今回の記事ではよりシンプルに実装ができるflaskについてご紹介します。

Django と flask の違い

簡単に Django と flask の用途の違いについて説明します。

Django

  • 多くの機能を備えており、大規模なウェブ開発が可能。
  • 実際のサービスでも多く使われている。

flask

  • 1つのpythonファイルで完結させることができ、スピーディな開発が可能。 
  • 覚えることも少なく、初心者向き。

簡単なデモシングルページアプリケーションを開発するのであれば、flaskのほうが適していると考えられます。

flaskはDjangoほどの人気はないものの、近年の機械学習の流行にともなって、Djangoとともに伸びていくフレームワークであると思います。

 

flask で Webサイトを作る

flaskを使うと、実にさまざまなウェブアプリケーションを開発することができます。今回はそのようなウェブアプリケーションを開発するための型を用意し、今後の開発の土台を作成していきたいと思います。

準備

まずは flask をインストールします。

pip install flask

ファイル構成

適当なディレクトリを作成し、ウェブサイトに必要なファイルを用意していきます。
flaskでは、基本的に以下のようなファイルの置き方に従います。

  • ルートディレクトリ(メインのフォルダ)下にメインのpythonファイルを直接配置します。
  • cssやjsファイルは、staticフォルダの下に配置します。
  • htmlファイルは、templates フォルダの下に配置します。
├ app.py
├ static
│   ├ css
│   │  ∟style.css
│   ├ js
├ templates
     ∟index.html

Python ファイル

pythonプログラムをwebアプリケーションのサーバーとして動かします。
@app.route('/') 以下の index 関数では、ウェブサイトのルートディレクトリにアクセスしたときの挙動について記述します。今回は、index.htmlを表示するように記述しています。

from flask import Flask, request, render_template

app = Flask(__name__)
 
@app.route('/')
def index():
    return render_template('index.html')
 
if __name__ == "__main__":
    app.debug = True
    app.run(host='0.0.0.0', port=8080)

html ファイル

htmlファイルを用意します。cssやjsファイルも、通常と同じように読み込みます。

<html>
    <head>
      <link rel='stylesheet' type='text/css' href='static/css/style.css'>
      <script src="http://code.jquery.com/jquery-latest.js"></script>
    </head>
    <body>
      <div id='header'>
        <h1>デモサイト</h1>
      </div>
      <div id='contents'>
      ここにコンテンツを作成していきましょう!
      </div>
    </body>
</html>

css ファイル

見た目を変更するためのcssファイルも用意します。

#header{
  height: 90px;
  width:100%;
  padding: 20px 20px 0 20px;
  background-color: #007bff;
  color: #fff;
}
 
#contents {
  width: 100%;
  height: 90%;
  padding: 20px 0 0 0;
  display: flex;
}

 

Webサイトを立ち上げる

pythonプログラムを実行する

app.pyが置かれたルートディレクトリへ移動し、pythonスクリプトを実行します。

python app.py

下記のような表示が出ていれば成功です。

 * Running on http://0.0.0.0:8080/ (Press CTRL+C to quit)
 * Restarting with stat

サーバーにアクセスしてwebサイトを確認する

ブラウザを開き、下記のURLにアクセスしましょう。

http://0.0.0.0:8080/

このようにサイトが表示されていれば、flaskでWeb開発を行う土台は完成です。
f:id:hktech:20180911225606p:plain

まとめ

PythonのWeb開発フレームワークであるflaskについて紹介しました。今回はウェブサイトの型だけを作成したので、次回はこの土台を使ってflaskおよびpythonの強みを活かしたウェブアプリケーションを開発していきます。

 

PythonでCSVからJSON形式に変換する方法

Pythonを用いてCSVからJSON形式に変換する方法についてソースコードと共にご紹介します。

目次

f:id:hktech:20180911214935p:plain

CSVデータの1行目にヘッダーがある場合

import json
import csv

json_list = []

# CSV ファイルの読み込み
with open('input_data.csv', 'r') as f:
    for row in csv.DictReader(f):
        json_list.append(row)

# JSON ファイルへの書き込み
with open('output.json', 'w') as f:
    json.dump(json_list, f)

# JSONファイルのロード
with open('output.json', 'r') as f:
    json_output = json.load(f)

CSVデータの1行目にヘッダーがなく、自分で指定したい場合

import json
import csv

json_list = []
keys = ('column1', 'column2', 'column3') # 列数と要素数を一致させる

# CSV ファイルの読み込み
with open('input_data.csv', 'r') as f:
    for row in csv.DictReader(f, keys):
        json_list.append(row)

# JSON ファイルへの書き込み
with open('output.json', 'w') as f:
    json.dump(json_list, f)

# JSONファイルのロード
with open('output.json', 'r') as f:
    json_output = json.load(f)

まとめ

PythonCSVデータをJSON形式に変換する方法についてご紹介しました。最近よく使われているNoSQLデータベースなどでは、入力がJSON形式に限定されていることも多いので、この記事を参考にしてみてはいかがでしょうか。

はてなブログでソースコードを表示させる方法

エンジニアの方のブログでよく見かける、プログラムなどのソースコードを載せる方法についてまとめます。

 

目次

 

準備

大前提として、ブログの設定を「はてな記法モード」に変更する必要があります。

はてな記法モードへの変更方法

[設定] タブ > [基本設定] に移動します。

f:id:hktech:20180909030246p:plain

デフォルトでは「見たままモード」になっているので、「はてな記法モード」に変更しましょう。

f:id:hktech:20180909030251p:plain

ソースコードを載せたのにうまく表示されないという場合のほとんどはこのステップが抜けていると思うので確認してみてください。

はてなブログソースコードを表示させる


Pythonソースコードを表示させるためには、下記のように記述してください。

>|python|
import numpy as np
arr = np.array([1, 2, 3])
||<

 

私たちが見慣れたソースコードの表示スタイルになりましたね

import numpy as np
arr = np.array([1, 2, 3])

 

||の中身は他のプログラミング言語に変更することもできるので、表示させたいプログラミング言語の種類に応じて変えてみてください

例: java, javascript, ruby ....

(参考: ソースコードを色付けして記述する(シンタックス・ハイライト) - はてなダイアリーのヘルプ)

 

まとめ

はてなブログソースコードを表示させる方法についてまとめました。普段は見たままモードで編集している方も、ソースコードを表示させたいときだけはてな記法モードに切り替えるなど工夫をしてみてはいかがでしょうか。

【Python】ゼロから始めるWindowsユーザ向け環境構築のすすめ

Python を始めてみようかな〜というWindowsユーザーの方のために、最速で簡単にPythonのコードを書き始められる方法をご紹介します。

特に、WindowsMac と比べて仮想OSのインストールが必要だったりとプログラミング初心者にはとっつきにくいところがあります。また、Python入門サイトや初心者向けの記事をみても、Python2系と3系のどちらがいいとか、ディストリビューションはどれがいいかなどといった議論が展開されていて結局なにをすればいいかわからないまま諦めてしまう方も多いかと思います。そんなみなさんにおすすめの環境構築方法を紹介します。 

 

目次

 

結論

Anacondaというパッケージを使いましょう

Pythonを始めたいと考えた方の中には、いま流行りの機械学習ディープラーニングなどを試してみたいと考えている方もいるでしょう。こちらのパッケージを使えば、あとから色々とインストールをする必要もなく、手軽にプログラミングを始めることができます。

 

インストール

まず、下記サイトからインストーラーをダウンロードしてください。

www.anaconda.com

 

Python2系 (2.x version) または Python3系 (3.x version)の選択を求められますが、ここはなにも考えずに左側のPython3系をダウンロードしましょう。

f:id:hktech:20180906000542p:plain

 

ダウンロードが終わったらインストーラを実行しましょう。

インストーラは全て英語なのでここで挫折してしまう人もいるかもしれません。しかし、ここはなにも変えずに Next, Install, Finish を押しまくればOKです。

 

Python のコードを書き始める

Finishでインストールが完了したら、スタートメニューの検索ボックスで Anaconda と検索しましょう。正常にインストールされていれば、Anaconda3というフォルダが見つかると思います。こちらの Jupyter Notebook をクリックしましょう。

 

f:id:hktech:20180906002650p:plain

 

すると、ブラウザが立ち上がり、次のような画面が現れると思います。

このとき立ち上がるブラウザはみなさんの既定となります。基本的に Google Chrome が推奨されていますが、他のブラウザでも動くと思います。もし気になる方は、アドレスバーのリンクをコピーして、Google Chrome のアドレスバーに貼り付けましょう。

 

f:id:hktech:20180906002917p:plain

 

ここで見えているのは、Windows上のディレクトリ階層です。これはWindowsエクスプローラと対応しています (Desktop → デスクトップ、 Documents -> ドキュメント)。コードを書くファイルをどこに置くかという話なので基本的にはどこでもいいですが、よくわからない方は適当にDocumentsをクリックしてその階層に入りましょう。階層が切り替わったら、右上の New ボタンを押し、Python 3 と書かれたボタンを押します。

 

f:id:hktech:20180906003711p:plain

 

あとは好きにコードを書くだけです。Pythonスクリプト言語なので、1行ずつ実行できます。Jupyter notebookでは1行ずつ出力しながら、必要に応じて文章なども差し込むことができてとても便利です。

まとめ

WindowsPython の開発環境を構築する方法についてご紹介しました。半ば押し付けるようにAnacondaがおすすめと書きましたが、基本的に後悔することはないと思います。また、Jupyter notebookについては、初めは多少違和感があるものの、Python コードを試し書きする上では最善のツールだと思います。今後は初心者向けにPythonのコーディング入門を紹介したいと思います。

 

オートエンコーダを用いた異常検知についてまとめた

ニューラルネットワークおよび Deep Learning の応用として、オートエンコーダを用いた異常検知について紹介します。

 

目次

 

オートエンコーダとは

オートエンコーダ (Auto encoder) とは自己符号器と呼ばれるニューラルネットワークの一種です。ニューラルネットワークにはさまざまな役割を果たすものがありますが、オートエンコーダは入力データを次元削減して圧縮し、出力データを生成するニューラルネットワークです。この圧縮処理はエンコードと呼ばれ、オートエンコーダの名前の由来となっています。

統計・機械学習分野で使われている次元圧縮手法としては主成分分析 (PCA) が有名ですが、オートエンコーダの圧縮処理はこれとほとんど同じであると考えてよいでしょう。

ニューラルネットワークは入力データに対して、所望の出力になるように内部の重みを調整していくことで学習を行います。オートエンコーダでは、入力と出力が同じになるようにネットワークの学習を進めます。

 

f:id:hktech:20180905214819p:plain

オートエンコーダを用いた異常検知

オートエンコーダを用いて異常検知を行う方法についてご紹介します。オートエンコーダは学習された入力データについては、同じようなデータを出力しようとします。ここで、入出力されるデータとしては波形を想像してみてください。

学習がうまくできているオートエンコーダを使えば下記のような結果が得られます。

  • 正常波形入力 → 学習した波形と同じような波形の出力
  • 異常波形入力 → 学習した波形とは異なる波形の出力

このように、オートエンコーダの復元結果をもとに異常検知を実現することができます。

 

まとめ

オートエンコーダを用いた異常検知について紹介しました。ニューラルネットワークを用いることから、構造データや時系列データに限らず、画像データや文書データなどにも使えるという利点があります。簡単な異常検知手法がうまく適用できないような場面で、ぜひ試してみてはいかがでしょうか。

 

 

深層学習 (機械学習プロフェッショナルシリーズ)

深層学習 (機械学習プロフェッショナルシリーズ)

 

 

Local Outlier Factor (LOF) による外れ値検知についてまとめた

教師なし学習に分類される異常検知技術のなかでも、外れ値検知という分野は近年多くのシステムで導入され始めています。今回は、外れ値検知技術のひとつであるLocal Outlier Factor (LOF) について紹介します。

 

目次

Local Outlier Factor (LOF) とは

LOF はあるデータの集まりの中から外れ値を見つけ出す外れ値検知アルゴリズムのひとつです。原論文*1は2000年に発表で最新技術とは言えないものの、現在も実務に耐えうる検知性能とシンプルな実装が魅力的な手法です。

LOFは空間におけるデータの密度に着目します。特に、自身の点から近傍 k 個の点といかに密かであるかを表す局所密度 (Local density) という指標に注目します。なお、ここでいう 近傍とはある点から最も距離が近い 個の点のことです。この辺りが怪しい方は k-means や k-NNについて確認しておくといいでしょう。

hktech.hatenablog.com

 

 局所密度は、周りにある点との密度であるということをお伝えしました。これを簡単な式で書くと下記のように表すことができます。

 局所密度 = \frac{1}{近傍 k 個の点との距離の平均}

ここで、は考慮する近傍点の数を決めるパラメーターとします。

 図のように、プロット空間に存在するまとまったデータ群を考えると、点 A はデータ群から離れているため外れ値として検出されるべきであるということは言うまでもないでしょう。

まず、点A自身の局所密度について考えます。点Aは近傍の点 (点B, C, D) との距離が大きいため、前述した式より局所密度が低くなることがわかるかと思います。一方で、点B, C, D はそれぞれの近傍点との距離が近いため局所密度が高いといえるでしょう。

f:id:hktech:20180903234744p:plain

この性質に着目することで、外れ値検知を実現するのが Local Outlier Factor (LOF)です。

上記のイメージに注目すると、データ群に含まれている点は、自身の局所密度と近傍点の局所密度が同じような値をとるということは想像できるかと思います。一方で、外れ値である点Aに着目すると、自身の局所密度は低いけれど、近傍点である点B, C, D の局所密度は高くなっていることがわかります。

つまり、自身の局所密度近傍点の局所密度が等しいときほど正常データであり、その差が大きいほど外れ値である可能性が高いと解釈することができます。これを定式化することで、ある点が外れ値である可能性を表す外れ値スコアを求めることができます。 

 

Local Outlier Factor (LOF) のメリットとして、複雑な分布をしているデータにおける外れ値検知にも強いということがあります。このことをPythonとsklearnによる実装を通して確かめた記事を書きました。この記事では、分布が複数に分かれている場合の例について考えています。

 

hktech.hatenablog.com

 

定式化

局所密度 ld は次の式で表現することができます。ここで、 N_k(P) は点 P の 個の近傍点の集合を意味し、その要素として点Qを考えます。

 ld = 1/{\displaystyle \frac{\sum_{Q \in N_k(P)}d(P, Q)}{k}}

前段で、自身の局所密度近傍点の局所密度がいかに異なるかを外れ値スコアで表現したいということはお伝えしました。Local Outlier Factor (LOF) では、これを局所密度の比を用いて表現していきます。

ある点がデータ群からいかに外れているかを表す指標を外れ値スコアとすると、点Pの外れ値スコア lof は次のように表現することができます。

  lof(P) =\sum_{Q \in N_k(P)}\frac{ld(Q)}{ld(P)}/k

この外れ値スコア lof は、大きい値をとるほど外れ値である可能性が高いということを表しています。外れ値検知タスクでは、このような外れ値スコアに閾値を設けることで、それを超えるものを異常値と判断したりすることが多いです。

なお、実際のタスクではこのスコアに対する閾値設定は慎重に行う必要があります。本記事では、閾値の決め方に関する議論は割愛しますが、別記事でそのことについても紹介したいと思います。 

 

まとめ

異常検知技術のひとつである Local Outlier Factor (LOF) について紹介しました。ふたをあけてみると簡単な手法であることはお分りいただけたかと思います。LOFをPythonで実装した例を紹介した記事も書きましたので、ぜひ確認してみてください。

 

関連記事

hktech.hatenablog.com

 

 

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)

異常検知と変化検知 (機械学習プロフェッショナルシリーズ)