覚え書きブログ

Pythonによるデータ解析1(1/4)

データ解析を題材に、Pythonを用いた機械学習アルゴリズムの実装の演習を行います。本演習では、scikit-learn、tensorflow, caffe, chanierなどの機械学習のライブラリの整備が進むなか、あえてそれらの機械学習ライブラリは使わずに3階層のニューラルネットワークpythonの基本ライブラリのみを用いて一から実装します。これにより、本演習では、最近の機械学習ライブラリの普及により見過ごされがちな機械学習アルゴリズムの基礎的な部分の理解を深めることを目的としています。以下の内容で進める予定です。

1回目(Pythonの基礎)Pythonの環境の構築、numpyによる数値演算、matplotlib、pdbデバッグ、配列(リスト、numpy.array、pandas.dataframe)、リスト内包表記、関数およびオブジェクト指向などPythonスクリプトの基礎的な記述方法を学びます


2回目(ロジスティック回帰の実装)人工知能(3セメ)で学んだニューラルネットワークの復習し、基本的な関数(ソフトマックス、交差エントロピー最急降下法など)を組み合わせて、2階層のニューラルネットワーク(ロジスティック回帰)を実装することにより、機械学習アルゴリズム全体の実装方法を学びます


3回目(ニューラルネットワークの実装):3階層のニューラルネットワークを学習するための勾配の導出とバックプロパゲーションの実装を通し、非線形なモデルの実装方法を学びます


4回目(ニューラルネットワークの応用)自然言語の特徴量n-gramを抽出する実装を参考に、各グループでニューラルネットワークを適用するデータ解析の課題を選択し、実際にニューラルネットワークを応用する方法を学びます


5回目(グループ発表):各グループでニューラルネットワークを応用したデータ解析の課題とその結果、工夫したところ、および難しかったところを発表し共有します



Pythonによるデータ解析1(1/3)の目次】



Pythonとは

Pythonは、近年、機械学習を用いたデータ解析やソフトウェアの研究開発にて、標準的に利用されているスクリプト言語で、以下の利点を持っています。

  • コンパイルを必要とせずインタラクティブに動作確認をしながら容易に実装ができる。
  • ブロック構造にカッコを用いず、インデント(スペースやタブ)を用いるため可読性が高い。
  • ライブラリが豊富なため、やりたいことが大抵はできる。

例)機械学習:scikit-learn,、数値演算:numpy、データ構造:pandas、ディープラーニングcaffe, tensorflow, chainer、画像処理cv2、グラフmatplotlib



PYthon環境の構築

まず、各自、Pythonの環境を構築します。以下の手順で、最新版のPythonをインストールしてください。
1) 以下からPython3.xをダウンロードします(赤枠をクリック)。
https://www.anaconda.com/download/
f:id:hirotaka_hachiya:20171115145223p:plain:w600

Webページへのアクセスを省略したい人は、以下のようにwgetでもダウンロードできます。

> wget https://repo.continuum.io/archive/Anaconda3-5.0.1-Linux-x86_64.sh

2) ダウンロードしたshellスクリプトを実行して、Anacondaをインストールします。

> sh ./Anaconda3-5.0.1-Linux-x86_64.sh
...
Please, press ENTER to continue
>>> 

Enterを押す

...
Do you accept the license terms? [yes|no]
[no] >>>

yesと入力し、Enterを押す

...
Anaconda3 will now be installed into this location:
/home/student/xxx/anaconda3

  - Press ENTER to confirm the location
  - Press CTRL-C to abort the installation
  - Or specify a different location below
[/home/staff/hhachiya/anaconda3] >>> 

yesと入力し、Enterを押す

Do you wish the installer to prepend the Anaconda3 install location
to PATH in your /home/staff/hhachiya/.bashrc ? [yes|no]
[no] >>> 

yesと入力し、Enterを押す

3) pythonを実行する
まずは、インストールしたAnacondaに設定されたpathを読み込む

> source ~/.bashrc

※利用しているシェルがbashじゃない場合は、以下のようにbashを実行しましょう。

> bash

そして、pythonインタラクティブモードで起動する。

> Python 3.6.3 |Anaconda, Inc.| (default, Oct 13 2017, 12:02:49)
[GCC 7.2.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>>

1行目のバージョン情報に、「Python 3.6.3 |Anaconda, Inc.| 」のように表示されていることを確認しましょう。



配列を扱うPythonスクリプトの例

Pythonには、一連のデータを格納する配列を表現する変数が複数あります。

  • リストPython 標準):各要素をオブジェクトとして格納する変数。型を気にせず配列操作ができます。
  • numpy array:各要素を統一の型(float32, int, u32など)で格納する変数。厳密に型を意識して、行列やベクトルとして演算ができます。
  • pandas.dataframe:データベース(またはエクセル)のテーブルのように、キー(項目)とインデックスを割り振って各要素を格納する変数。データ解析でよく使われます。
# -*- coding: utf-8 -*-

# numpyをnpとしてインポート
import numpy as np

# pandasをpdとしてインポート
import pandas as pd

# リストの作成
d_list1 = ['Yamada Taro', 'Yamada Hanako']
d_list2 = [172.5, 160.5]
d_list3 = ['name','height']

# リストからnumpy arrayへの変換
d_array1 = np.array(d_list1)
d_array2 = np.array(d_list2)
d_array3 = np.array(d_list3)

# numpy arrayの型の出力
print("d_array1の型:",d_array1.dtype)
print("d_array2の型:",d_array2.dtype)
print("d_array3の型:",d_array3.dtype)

# numpy arrayからdataframeへの変換
# pandas.Seriesを用いて項目名にd_array3の要素(name, height)を設定する
column1 = pd.Series(d_array1,name=d_array3[0])
column2 = pd.Series(d_array2,name=d_array3[1])

# 2つの列をpandas.concatで結合し、dataframeを作成する
d_dataframe = pd.concat([column1,column2],axis=1)

print("d_dataframe:\n",d_dataframe,"\n")
print("name列:\n",d_dataframe["name"],"\n")
print("height列のインデックス0番:",d_dataframe["height"][0],"\n")

上記スクリプトをファイルlist_numpy_dataframe.pyに保存し以下のように実行します。

> python list_numpy_dataframe.py
d_array1の型: <U13
d_array2の型: float64
d_array3の型: <U6
d_dataframe:
             name  height
0    Yamada Taro   172.5
1  Yamada Hanako   160.5

name列:
0      Yamada Taro
1    Yamada Hanako
Name: name, dtype: object

height列のインデックス0番: 172.5

リストから、numpy arrayに変換する際に、少数の場合はfloat64、文字列の場合はUnicode(U13, U6)に設定されていることがわかります。
また、d_dataframeは、「name」または「height」のキーと、インデックスで各要素を参照できることがわかります。

演習1

d_dataframeに、年齢「age」の列を作ってみましょう。
以下のように、Yamada Taroさんは21歳、Yamada Hanakoさんは19歳に設定してください。

d_dataframe:
             name  height  age
0    Yamada Taro   172.5   21
1  Yamada Hanako   160.5   19

作成したスクリプトおよび出力結果を、Moodleにて提出してください。

Pythonによるデータ解析1(2/4)に続く