「はじめての機械学習」-Python編 第2版
                        「はじめての機械学習」シリーズのPython編です。
このシリーズは、機械学習に初めて取り組むときに、学んだことをシリーズ化してみました。
これから、機械学習に取り組みたいと考えている方のお役にたてれば幸いです。
0. シリーズのコンテンツ
1. Pythonの基本…
機械学習におけるPythonの役割は非常に重要です。以下に、Pythonが機械学習でどのような役割を果たすかを説明します。
- プログラミング言語としての柔軟性: 
Pythonは直感的な文法と豊富なライブラリ群を備えた柔軟なプログラミング言語です。
機械学習の実装には多くの数値計算やデータ処理に必要な優れた機能やライブラリを提供しています。 - 機械学習ライブラリの豊富さ: 
Pythonには、機械学習のための多くの優れたライブラリが存在します。
代表的なものには、NumPy、Pandas、Scikit-learn、TensorFlow、PyTorchなどがあります。
これらのライブラリを使用することで、効率的なデータ処理や機械学習モデルの構築・評価が可能になります。 - コミュニティの活発さ: 
Pythonはオープンソースのプログラミング言語であり、機械学習コミュニティが非常に活発です。
多くの開発者がPythonで機械学習の研究や開発を行っており、新しいアルゴリズムやツールが日々開発されています。
Pythonを使うことで、最新の機械学習のトレンドや成果物にアクセスすることができます。 - 扱いやすさと学習コストの低さ: 
Pythonは初心者にとっても扱いやすい言語です。
シンプルな文法や豊富な資源、親切なコミュニティがあり、初学者でも迅速に機械学習に取り組むことができます。
また、Pythonは他の多くの分野でも使用されており、Pythonのスキルは幅広い領域で役立つため、学習コストが低くなります。 
以上のように、Pythonは機械学習の実装や開発において重要な役割を果たします。
柔軟性、豊富なライブラリ、活発なコミュニティ、扱いやすさと学習コストの低さなど、Pythonは機械学習エンジニアやデータサイエンティストにとって強力なツールです。
2. 環境の準備…
環境は、Pythonが実行できれば、プラットフォームは特に限定することはありません。
私の環境は以下の通りです。
- プラットフォーム:Windows 11 Pro 64bit
 - Python:Python 3.11.4
 - IDE:jupyter notebook
 - Jupiter Core Package version:Selected Jupyter core packages…
 - IPython : 8.14.0
 - ipykernel : 6.23.3
 - ipywidgets : 8.0.6
 - jupyter_client : 8.3.0
 - jupyter_core : 5.3.1
 - jupyter_server : 2.7.0
 - jupyterlab : not installed
 - nbclient : 0.8.0
 - nbconvert : 7.6.0
 - nbformat : 5.9.0
 - notebook : 6.5.4
 - qtconsole : 5.4.3
 - traitlets : 5.9.0
 
2.1. 環境構築手順
Pythonを使うには、VSCodeを使う方法もありますが、音階は、対話的に簡単に試せる、jupyter notebookを使用して学習を進めます。インストールすべきコンポーネントは、Pythonならびにjupter notebookとなります。
- Pythonのインストール: Windows版Pythonのインストール: Python環境構築ガイド – python.jp
 - jupyter notebookのインストール:Jupyter Notebookのインストール | Python入門 (javadrive.jp)
 
2.2. 起動手順
WIndowsの場合の環境の起動手順は以下のとおりです。
- 作業用フォルダの作成
 - 作業フォルダでターミナルを開く:cmdあるいはPowerShell
 - jupyter notebook起動:コマンドプロンプトで”jupyter notebook”を実行→ブラウザが起動しJupyter notebook画面が開く
 
2.3. ヒント
Pythonでは、有益はライブラリは、予め環境にインストールしたうえで、importを行うことで利用できます。
機械学習でよく使用するライブラリは、以下に記載します。
環境へのライブライのインストールは、pipコマンドを使用します。
参考として、numpy ライブラリをインストール方法は以下のとおりです。
pip install xxxxx
3. 簡単な文法
Pythonの詳しい文法は、ネットや本を参考にしていただきたいですが、ここでは、機械学習を学ぶために、最低限必要な書き方について、列挙しておきます。
このキーワードにネットで調べたりすることで、調べるヒントになればと考えています。
3.1. Pythonの基礎
【変数】 計算を行うための値を保持する入れもの。数値(整数/総数/浮動小数点/…)や文字列などが保持できます。
  文法: 変数名 = 値
  例:a = 23456                           # 整数
    b = 123.456                        # 少数
    c = 1234e5                         # 浮動小数点   
    name = “TanaKafeWorks”  # 文字列
【演算子】 実際の計算を表現るために使用します。
     加算/減算/乗算/除算/べき乗などの数学的演算がああります。他にもあります。
  文法: 演算子として、以下のようなものがあります。
       加算:+
       減算:-
       乗算:*
       除算:/
       べき乗:**  例)aのb乗:a ** bと表現
【リスト】 複数の値を扱うための変数。Pythonにおける値表現です。
    ※機械学習では、numpyで提供されるarrayを使う事が多いとおもいますが、基本は、このリストになります。
  文法: 全体をを「[]」で囲み、要素を、「,」で区切ります。
      要素を2重、3重のようにすることもできます。
      要素の追加は、append()メソッドはリストの末尾に新しい要素を追加します。
      extend()メソッドはリストに他のリストの要素を追加します。
      要素を指定位置に挿入するには、insert()メソッドは2つの引数を取ります。
      1つ目の引数は挿入する位置(インデックス)で、2つ目の引数は挿入する値です。
      要素を削除するには、remove()メソッドは指定した要素をリストから削除します。
      もしリストに同じ値が複数存在する場合、最初に見つかったものが削除されます。
      pop()メソッドは指定したインデックスの要素を削除し、削除した要素を返します。
      インデックスを指定しない場合、最後の要素を削除します。
  例:a = [1,2,3,4] # 特定の要素を採る出すには、a[2]とかで取得できます。
           # インデックスは0起点です。
    b = [[1,2,3],[4,5,6]]
    a.append(5) # 最後の要素の後に要素に追加
【if文】 条件分岐のための記法です。
    条件判断後のそれぞれの動作ブロックは、インデントされたブロックが実行されます。 
  文法: if条件が満たすと、その直後のブロックが実行されます。
      条件を満たさない場合、elseブロックが実行されます。
      elseブロックがない場合、処理は実行されません。
      条件演算子の種別は次のものがあります
       > (大きい)、< (小さい)
       >= (以上)、<= (以下)
       == (等しい)、!= (等しくない)
  例:
      a = 10
      if a == 10:
        print(“if文はtrueです”)
      else:
        print(“if文はfalseです”)
【for文】 処理ブロックをループ実行します。
  文法: 指定回数処理ブロックをループ実行します。
  例:  リストを使ったループ処理の例
      for a in [1,2,3,4,5,6]
        print(a)
【関数】 特定の機能を一まとめにすることで、複数個所からの利用が可能になります。
  文法: 関数はdefキーワードに続いて関数名で定義します。
      処理は、インデントしたブロックに記述します。
      関数の戻り値は、return文の引数で指定します。
  例:
      def test_func( a, b):
        return a + b
   
      print(test_func(1,2))  # 3が表示されます
4. Pythonで機械学習で、よく使うライブラリ
4.1. 数字を扱う:numpy
PythonのNumPyライブラリを機械学習で活用するためのポイントは以下の通りです。
- 高速な数値計算: 
NumPyは高速な数値計算を可能にする多次元配列を提供します。機械学習ではデータの処理や特徴ベクトルの表現に多次元配列がよく使用されます。 - ブロードキャスト: 
NumPyのブロードキャスト機能は、異なる形状の配列間で演算を行う際に便利です。これにより、データの要素ごとの操作を効率的に実行できます。 - 行列演算: 
NumPyは行列演算をサポートしており、行列の積、転置、逆行列の計算などを簡単に行うことができます。機械学習モデルの学習や予測において、行列演算は重要な要素です。 - ベクトル化: 
NumPyのベクトル化操作は、ループを使わずに要素ごとの演算を適用できるため、処理速度を向上させます。これは大規模なデータセットや高次元の特徴ベクトルの処理に特に有効です。 - ライブラリとの互換性: 
NumPyは機械学習の他のライブラリとの互換性が高く、多くの機械学習ライブラリがNumPyの配列を入力として受け取るため、スムーズなデータの受け渡しが可能です。 
これらのポイントに注目してNumPyを活用することで、高速な数値計算や効率的なデータ処理、行列演算の実行、ベクトル化による処理速度の向上など、機械学習の実装と解析を効率化することができます。
【使い方】
  インポート: import numpy as np # npという簡略名で扱えるようにします。
  配列:  行列やベクトルを扱うためNumpyの配列を使います。
       a = np.array([1,2,3,4,5])  # PythonのリストからNampy配列を作る
       b = np.array([[1,2,3],[4,,5,6]]) # Pythonの2重リストからNampy2次元配列を作る
  配列の演算: [配列] + 数値 あるいは [配列] + [配列]  各要素に数値あるいは要素同士を加えたもの
         [配列] * 数値 あるいは [配列]  * [配列]  各要素に数値あるいは要素同士を乗算したもの
  その他の機能の一部:
        総和: np.sum(Numpy Array)
        平均: np.average(Numpy Array)
        最大値: np.max(Numpy Array)
        最小値: np.min(Numpy Array)
4.2. データを扱う:pandas
PythonのPandasライブラリを機械学習で活用するためのポイントは以下の通りです。
- データ操作と前処理: 
Pandasはデータフレームとシリーズというデータ構造を提供し、データの読み込み、結合、フィルタリング、グループ化などの操作を容易に行えます。機械学習では、データの前処理や特徴エンジニアリングが重要ですが、Pandasはこれらの作業を効率的にサポートします。 - 欠損値の処理: 
データセットにはしばしば欠損値が含まれますが、Pandasは欠損値の処理を容易に行える機能を提供します。欠損値の削除、補完、置換などを簡単に実行できます。 - データの可視化: 
機械学習の前処理やモデルの評価において、データの可視化は重要です。PandasはMatplotlibと統合されており、データのプロットやグラフの作成が容易です。 - データの結合と変形: 
機械学習では、複数のデータソースを結合したり、データの形状を変換したりすることがあります。Pandasはデータの結合、マージ、ピボットテーブルの作成などを簡単に行えます。 - メモリ効率の向上: 
大規模なデータセットを扱う場合、Pandasはメモリ使用量を最適化するための機能を提供します。これにより、メモリの制約を緩和しながら効率的にデータを操作できます。 
これらのポイントに注目してPandasを活用することで、データの操作と前処理、欠損値の処理、データの可視化、データの結合と変形、メモリ効率の向上など、機械学習のデータ処理と解析を効率化することができます。
4.3. データ可視化:matplotlib
PythonのMatplotlibライブラリを機械学習で活用するためのポイントは以下の通りです。
- データの可視化: 
Matplotlibは豊富なプロットやグラフ作成機能を提供します。機械学習ではデータの理解や可視化が重要です。Matplotlibを使えば、データの分布やパターンを視覚的に把握し、モデルの評価や結果の解釈をサポートできます。 - カスタマイズ性: 
Matplotlibは高度なカスタマイズが可能です。プロットのスタイル、色、軸の設定、レイアウトなど、細かい部分まで自由にカスタマイズできます。データの特性や目的に応じて、見栄えや情報の伝達性を向上させることができます。 - 多様なプロットタイプ: 
Matplotlibはさまざまなプロットタイプを提供します。折れ線グラフ、散布図、ヒストグラム、バーンチャート、ヒートマップなど、データの特性に合わせて適切なプロットを選択できます。 - 統合性: 
Matplotlibは他のPythonのライブラリとの統合が容易です。特にNumPyやPandasとの組み合わせが強力であり、データの処理と可視化の一貫性を保つことができます。 - 出力の柔軟性: 
Matplotlibはさまざまな形式での出力が可能です。静的な画像ファイル(PNG、JPEG、PDF)、インタラクティブなグラフ(Jupyter Notebook)、ウェブアプリケーション(Flask、Django)など、用途に合わせた出力ができます。 
これらのポイントに注目してMatplotlibを活用することで、データの可視化、カスタマイズ性、多様なプロットタイプ、統合性、柔軟な出力など、機械学習の解析や結果の可視化を強化することができます。
【使い方】
  インポート: import matplotlib.pyplot as plt # pltという簡略名で扱えるようにします。
  注意事項: %matplotlib inline  # 環境によりこの記述がないとグラフが表示されない場合があります。
        扱うデータにはNumpy配列を使うため、import nampyも必ず行う必要があります。
  linspace関数: グラフの横軸の値を範囲を疑似的にNumpy配列を生成する
          例)np.linspace(-10,10)  # -10~10の範囲を50に区切ってNumpy配列を作る
  グラフ描画: 横軸x、縦軸yとしてNumpy配列に設定された値をグラフ化します。
         使い方例) plt.plot(x,y)
               plt.show()
         軸ラベルや凡例の表示方法
               plt.xlabel(“x軸ラベル”)  # X軸ラベル
               plt.ylabel(“y軸ラベル”)  # Y軸ラベル
               plt.plot(x,y,label=”凡例”)   # 凡例
               plt.legend()      # 凡例表示指示
               plt.show()       # グラフ描画指示
  散布図:  scatter()関数で散布図をプロットできます。
         使い方例) plt.scatter(x,y)     # 散布図のプロットポイントを指示
               plt.show()       # グラフ描画指示