サマリー
Pythonは、簡単に学べること、読みやすいコードを書けること、広範囲にわたるアプリケーションに使えることなどの、多くの優れた特徴を持つ汎用プログラミング言語となる。Pythonは、1991年にGuido van Rossumによって開発されている。
Pythonは、比較的新しい言語であるため、オブジェクト指向プログラミング、手続き型プログラミング、関数型プログラミング等の様々な効果的なプログラミング手法を利用することができる。また、多くのライブラリやフレームワークが用意されているため、Webアプリケーション、デスクトップアプリケーション、科学技術計算、機械学習、人工知能などの分野に広く使われている。さらに、クロスプラットフォームであり、Windows、Mac、Linuxなどの多くのオペレーティングシステムで動作するという特徴を持つ。Pythonは、インタープリタ言語であるため、コンパイルの必要がなく、REPL的な仕組みを持つため、開発サイクルが早くなるという特徴も持つ。
ここでは岩波データサイエンスシリーズ「ベイズ推論とMCMCのフリーソフト」をベースにpyhtonを使った機械学習技術の概要について述べる。
Pythonと機械学習
Pythonは、統計/データ分析に特化したR言語やデータベースへのアクセスに特化したSQLのようなDSL(Domain Specific Language)は異なり、C言語やJAVA等と同様の汎用的なプログラミング言語となる。PyhtonはC言語やFortranと異なり、コンパイルを必要としない動的な言語であるにもかかわらず計算速度が比較的早く、科学技術計算において幅広く利用されている。
Pythonでは例えば、生命科学・宇宙科学の分野においては、それぞれBiopython (http://biopython.org/wiki/Main_Page)や、Astropy(http://www.astropy.org/)といった大規模なライブラリの開発がGithub上で活発に行われている。
Pythonを使って、データ分析や数値計算を行うのであれば、”SublimeText4とVS codeでのPython開発環境立ち上げ“や”macでのpython開発環境とtensflowパッケージ導入“で述べられているような形でPyhton環境を立ち上げ、Numpyに代表されるような科学技術・データ分析のライブラリを利用することになる。
Pandasについて
Pyhtonを用いてデータ解析、特にデータの前処理を含めたデータ操作を行う前に、使い方を理解しておくライブラリとしてpandasがある。pandasは、2008年、ACR Capital Managementという世界的に有名なクオンツ・ヘッジファンドに勤務していたWies Mckinneryが(データ分析のR言語に嫌気がさしたという理由も噂されているが)、Pyhtonにおけるデータ操作用ライブラリとして開発を開始したのが始まりとなるツールで、Pandasの名前はPANei DAta Systemから来ており、その名が示す通り、数表の形式をしたデータや時系列を操作するためのデータ構造と、それに対する演算を提供している。
Pandasを使用すると、CSVやExcelファイル、SQLデータベース、JSONなどの多様なデータ形式からデータを読み込んだり、データフレーム内のデータを加工、結合、グループ化、集計、可視化などの操作を簡単に実行でき、また、PandasはNumPyやMatplotlibなどの科学技術計算やデータ可視化のライブラリとも統合されているため、より高度なデータ分析の実行が可能となる。
以下に、pandasを使ったサンプルコードをいくつか示す。
- CSVファイルの読み込みと表示
import pandas as pd
# CSVファイルを読み込み、DataFrameに変換する
df = pd.read_csv("data.csv")
# DataFrameを表示する
print(df)
2. DataFrameの操作
import pandas as pd
# CSVファイルを読み込み、DataFrameに変換する
df = pd.read_csv("data.csv")
# 特定の列のみ表示する
print(df["column_name"])
# 特定の条件を満たす行のみ表示する
print(df[df["column_name"] > 0])
# 列の値を合計する
print(df["column_name"].sum())
# 列の平均値を計算する
print(df["column_name"].mean())
DataFrameの書き出し
import pandas as pd
# CSVファイルを読み込み、DataFrameに変換する
df = pd.read_csv("data.csv")
# DataFrameをExcelファイルに書き出す
df.to_excel("output.xlsx", index=False)
Pandasの参考図書としては「Pythonデータ分析/機械学習のための基本コーディング! Pandasライブラリ活用入門」(『Pandas for Everyone: Python Data Analysis』の翻訳書)がある。
この図書は、pandasの使い方の基本から始まり。その後、データの整備/集約、可視化、モデル採択、正則化など、一連の定石的な手法を紹介されており、付録では、Pythonのインストールや文法を確認できるものとなっている。この図書を用いることでは、データ分析や機械学習を進める前の準備段階として、データ処理の全体を見渡しつつその手法を確認できる一冊となる。
以下に内容を示す。
■第1部 基本的な使い方の基本
第1章 DataFrameの基礎
最初のデータセットをロードする/列、行、セルを見る/グループ化と集約/基本的なグラフ
第2章 pandasのデータ構造
データを自作する/Seriesについて/DataFrameについて/SeriesとDataFrameの書き換え
データのエクスポートとインポート
第3章 プロットによるグラフ描画
matplotlib/matplotlibによる統計的グラフィックス
seaborn/pandasのオブジェクト/seabornのテーマとスタイル
■第2部 データ操作によるクリーニング
第4章 データを組み立てる
"整然データ"/連結/複数のデータセットをマージする
第5章 欠損データへの対応
NaNとは何か/欠損値はどこから来るのか/欠損データの扱い
第6章 "整然データ"を作る
複数列に(変数ではなく)値が入っているとき/複数の変数を含む列がある場合
行と列の両方に変数があるとき/1個の表に観察単位が複数あるとき(正規化)
同じ観察単位が複数の表にまたがっているとき
■第3部 データの準備―変換/整形/結合など
第7章 データ型の概要と変換
データ型/型変換/カテゴリ型データ
第8章 テキスト文字列の操作
文字列/文字列メソッド/その他の文字列メソッド
文字列のフォーマッティング/正規表現/regexライブラリ
第9章 applyによる関数の適用
関数/applyの基本/applyの応用/関数のベクトル化/ラムダ関数
第10章 groupby演算による分割-適用-結合
集約/変換(transform)/フィルタリング
DataFrameGroupByオブジェクト/マルチインデックスを使う
第11章 日付/時刻データの操作
Pythonのdatetimeオブジェクト/datetimeへの変換
日付を含むデータをロードする/日付のコンポーネントを抽出する
日付の計算とtimedelta/datetimeのメソッド
………
■第4部 モデルをデータに適合させる
第12章 線形モデル
単純な線形回帰/重回帰/sklearnでインデックスラベルを残す
第13章 一般化線形モデル
ロジスティック回帰/ポアソン回帰/その他の一般化線形モデル/生存分析
第14章 モデルを診断する
残差/複数のモデルを比較する/k分割交差検証
第15章 正則化で過学習に対処する
なぜ正則化するのか/LASSO回帰/リッジ回帰
ElasticNet/交差検証
第16章 クラスタリング
k平均法/階層的クラスタリング
■第5部 締めくくり―次のステップへ
第17章 pandas周辺の強力な機能
第18章 さらなる学びのための情報源
■第6部 付録
インストール/コマンドライン/プロジェクトのテンプレート
Pythonの使い方/ワーキングディレクトリ/環境
パッケージのインストール/ライブラリのインポート
リスト/タプル/辞書/値のスライス/ループ/内包表記
基本的な数学解析ライブラリ
前述のpandasによる前処理が済んだデータに対して適用するための解析手法を提供するライブラリとしては、Numpy、Scipy(基本的な配列・数値計算手法の提供)や、scikit learn、Shogun(機械学習)、Statismodels(統計分析)、Opencv、sckit_image(コンピュータービジョン)、NLTK、gensim(自然言語処理)、Sympy(数式処理)などのライブラリが存在する。
NumPyについて
NumPyは、Pythonプログラミング言語の高性能科学計算ライブラリであり、多次元配列や行列の計算を効率的に扱えるように設計されているものとなる。NumPyは、NumPy配列と呼ばれるデータ型を提供し、この配列を使用して数学的演算や統計処理、信号処理、画像処理などの科学計算を実行することができる。NumPyの主な機能には、以下が含まれている。
- 多次元配列の作成、操作、変換
- 配列の算術演算、ブロードキャスト、インデックス、スライス
- 線形代数、フーリエ変換、乱数生成、統計関数
- C言語、Fortran言語とのインターフェイス
NumPyを使用することで、Pythonの標準機能だけで処理するよりも高速な計算を実行でき、また多くの科学計算ライブラリやデータ分析ライブラリの基盤として使われているため、これらのライブラリを利用する上でも重要な役割を果たしている。
以下にNumPyを利用したサンプルコードを示す。以下のコードではNumPyをインポートして使用し、NumPy配列を作成し、それを使用していくつかの数学的操作を実行している。
import numpy as np
# NumPy配列を作成
a = np.array([1, 2, 3, 4, 5])
b = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# 配列の操作
print(a.shape) # 出力: (5,)
print(b.shape) # 出力: (3, 3)
# 配列の算術演算
c = a + 2
d = b * 3
print(c) # 出力: [3 4 5 6 7]
print(d) # 出力: [[ 3 6 9]
# [12 15 18]
# [21 24 27]]
# 配列のスライシング
e = a[2:4]
f = b[1:, :2]
print(e) # 出力: [3 4]
print(f) # 出力: [[4 5]
# [7 8]]
# 線形代数の操作
g = np.dot(b, a)
h = np.linalg.inv(b)
print(g) # 出力: [22 53 84]
print(h) # 出力: [[-0.40740741 -0.81481481 0.40740741]
# [-0.05555556 0.16666667 -0.05555556]
# [ 0.2962963 0.48148148 -0.2962963 ]]
# 統計関数の操作
i = np.mean(a)
j = np.std(b)
print(i) # 出力: 3.0
print(j) # 出力: 2.581988897471611
scikit learnについて
scikit-learnは、Pythonのオープンソースの機械学習ライブラリであり、教師あり学習(分類、回帰)、教師なし学習(クラスタリング、次元削減)、モデル選択、前処理など、さまざまな機械学習の機能を提供しているライブラリとなる。
scikit-learnは、前述のNumPy、SciPy、MatplotlibなどのPythonの科学計算ライブラリと統合されており、簡単に使用できるAPIを提供している。Scikit-learnでは、様々な機械学習アルゴリズムを実装しており、これらのアルゴリズムを組み合わせることで、機械学習モデルを構築することができるとともに、機械学習モデルの評価やチューニングのためのツールも提供しているものとなる。
以下に、Scikit-learnを使用して分類モデルを構築するサンプルコードを示す。
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score
# データのロード
iris = load_iris()
# データの分割
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, random_state=0)
# モデルの構築
model = DecisionTreeClassifier()
# モデルの学習
model.fit(X_train, y_train)
# モデルの評価
y_pred = model.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)
このコードでは、Scikit-learnを使用してIrisデータセットをロードし、データを訓練用とテスト用に分割し、Decision Tree分類器を使用して分類モデルを構築して、訓練用データを使用してモデルを学習しており、最後に、テスト用データを使用してモデルの性能を評価し、正確性を出力している。
scikit-learnの参考図書としては、例えば「Python機械学習ライブラリ scikit-learn活用レシピ80+」等がある。
この図書は『scikit-learn Cookbook – Second Edition』の翻訳書であり、基礎的な手法から始め、前処理、次元削減、線形モデル、交差検証、SVM、”アンサンブル学習の概要とアルゴリズム及び実装例について“にも述べているアンサンブル学習、テキスト分析、多分類、ニューラルネットワークまで紹介されている。以下に内容を示す。
第1章 機械学習の枠組みを理解する―NumPyからパイプラインまで
[1]NumPyの基礎
[2]Irisデータセットを読み込む
[3]Irisデータセットを可視化する
[4]Irisデータセットをpandasで可視化する
[5]NumPyとmatplotlibを使ってプロットする
[6]最も小さな機械学習レシピ:SVM分類
[7]交差検証の紹介
[8]すべてを1つにまとめる
[9]機械学習のオーバービュー:分類と回帰
第2章 モデル構築前のワークフローと前処理―サンプルデータの作成から確率的勾配降下法まで
[10]簡単な分析を行うためのサンプルデータを作成する
[11]標準正規分布の尺度でデータをスケーリングする
……
[18]回帰に確率的勾配降下法を使用する
第3章 次元削減―PCAから性能テストまで
[19]PCAによる次元削減
[20]分解に因子分析を使用する
……
[25]次元削減法をパイプラインでテストする
第4章 線形モデル―線形回帰からLARSまで
[26]直線をデータに適合させる
[27]機械学習を使って直線をデータに適合させる
……
[32]LARSによる正則化へのより基本的なアプローチ
第5章 ロジスティック回帰―データの読み込みからパイプラインまで
[33]UCI Machine Learning Repositoryからデータを読み込む
[34]pandasを使ってPima Indians Diabetesデータセットを可視化する
……
[40]コンテキストなしでROC曲線をプロットする
[41]データセットの読み込みからROC曲線のプロットまでを1つにまとめる:UCI Breast Cancerデータセット
第6章 距離指標を使ったモデルの構築―k-means法からk近傍法まで
[42]k-means法を使ったデータのクラスタリング
[43]セントロイドの個数を最適化する
……
[49]k-means法を使って外れ値を検出する
[50]回帰にk近傍法(KNN)を使用する
第7章 交差検証とモデル構築後のワークフロー―モデルの選択から永続化まで
[51]交差検証を使ってモデルを選択する
[52]k分割交差検証
……
[63]L1ノルムによる特徴選択
[64]joblibまたはpickleを使ってモデルを永続化する
第8章 サポートベクトルマシン―線形SVMからサポートベクトル回帰まで
[65]線形SVMを使ってデータを分類する
……
[68]サポートベクトル回帰
第9章 決定木アルゴリズムとアンサンブル学習
[69]決定木を使って基本的な分類を行う
[70]pydotを使って決定木を可視化する
……
[77]アダブースト(AdaBoost)回帰器のチューニング
[78]scikit-learnでスタッキングアグリゲータを作成する
第10章 テキスト分類と多クラス分類
[79]分類に確率的勾配降下法を使用する
[80]ナイーブベイズを使って文書を分類する
[81]半教師あり学習によるラベル伝播法
第11章 ニューラルネットワーク
[82]パーセプトロン分類器
[83]ニューラルネットワーク:多層パーセプトロン
[84]ニューラルネットワークによるスタッキング
第12章 単純な推定器の作成
[85]単純な推定器を作成する
その他のライブラリ
そのほかに結果を可視化するためのライブラリ(Bokeh、matplotlib、Seabom)や、データ分析の再現性を担保することができるように、データ解析の過程自身を記載することのできるiPython Notebook等もある。
また、深層学習へのPyhtonを使ったアプローチが盛んであり、それらに関しては”ニューラルネットワークのHello World、MNISTデータによる手書き認織の実装“等で詳細に述べているのでそちらも参照のこと。
さらにPyhtonの弱点である処理の高速化に関しては、PyPyやJulia等による検討も行われている。
また、”確率的生成モデルについて“や”ノンパラメトリックベイズとガウス過程について“で述べられているベイズ推定やノンパラメトリックベイズ、ガウス過程に関してもpythonによるライブラリが提供されており、詳細はそれらのページを参照のこと。
実践と参考図書
具体的な課題に対する実践に関しては、”pythonとアルゴリズム“、”pythonによる機械学習“、”pythonによる統計モデリング“、”pythonによる最適化手法“を参照のこと。
コメント
[…] 機械学習技術はAI技術の根幹であり、それらと組み合わせることで様々な拡張機能を実現することが可能となる(機械学習技術の詳細に関しては”機械学習技術“や”Pyhtonによる機械学習とデータ分析の概要と代表的なライブラリの紹介“等を参照のこと)。この機械学習モジュールとUnityとを連携させるためには、以下に示すようないくつかのアプローチがある。 […]