少なくとも「バイブコーディング時代」以前には、自分は「数学が得意ではない」ためにプログラミングができないと嘆く人は少なくありません。私もそうではありませんでした。とにかく、Python で機械学習モデルの構築を開始した方法をここに示します。
なぜ躊躇したのか
自分は「数学が得意ではない」と思っていました。
私はテクノロジーとコンピューターに興味を持っていましたが、少なくとも正式な教育を受けている間は、数学は苦手でした。私はなんとかコミュニティカレッジで編入可能な統計入門コースに合格することができましたが、高度な数学は自分には向いていないように感じました。 Linux に興味を持ち、コードに手を出してみましたが、数学的にはまだ不十分だと感じていました。
Mathematica のようなソフトウェア プログラムは私の価格帯ではありませんでした。現在では利用可能なオープンソースの代替手段が増えていますが、私が学生や大学生だったころにはそれらは存在していないようで、少なくとも私は知りませんでした。
人々が書き方を学ぶ最も単純なコードには、基本的な算術だけが必要です。コードをいじったり、手を出したりしました。それでも、統計との出会いにより、数学が実際のアプリケーションに価値があると考えるようになりました。
機械学習が流行ったとき、私も試してみようと思いました。 Coursera の無料コースにサインアップしましたが、必要なバックグラウンドがなければすぐに失敗してしまいました。
しかしある日、私は統計的プログラミングを試してみたいという衝動に駆られました。私はウィキペディアで数学の記事を時々調べていましたが、参加するには障害があるように思えました。しかし、実際にやってみると、簡単にできることがわかりました。また、これは私に数学を独学し、Python で独自のスーパー電卓を構築し、微積分と線形代数、さらには Schaum のアウトラインを独学する理由も与えてくれました。
Python 環境のセットアップ
モデリングツールボックスを組み立てる
標準の Python 環境とは異なるツールがいくつか必要でした。 Python での統計、データ サイエンス、機械学習の多くは対話的に行われます。いきなりモデルの構築に取り掛かるのではなく、データを探索してそこから何が分かるかを確認することが最善です。
IPythonとJupyterをインストールしました。 IPython は、コマンドライン編集や「マジック」コマンドなどの機能を追加する、強化された対話型 Python インタープリターです。 Jupyter は、結果を表示して他のユーザーと共有するためのインタラクティブなノートブックを実装しています。 Jupyter ノートブックは以前は IPython の一部でしたが、IPython が依然としてバックグラウンドで「カーネル」として使用されているにもかかわらず、開発者は後者に集中することにしました。これらのツールのインストールと更新には Pixi を使用します。
pandas は DataFrame 内のデータを管理するライブラリです。これは、スプレッドシートやリレーショナル データベースの使用に似ています。 Seaborn は、棒グラフ、散布図、回帰プロットなどの一般的な統計視覚化機能を備えたライブラリです。 statsmodels は、回帰などの古典的な統計モデルを提供します。 SciPy は、一般的な統計演算を含む多くの科学計算タスクを提供します。
データの探索
データをモデル化するにはデータを知る必要があります
環境をセットアップしたら、データを探索してモデルを構築する必要がありました。まず、Python ライブラリをインポートする必要がありました。
import numpy as np
import pandas as pd
import seaborn as sns
sns.set_theme()
from scipy import stats
import statsmodels.api as sm
import statsmodels.formula.api as smf
%matplotlib inline
次に、データが必要になりました。幸いなことに、Seaborn にはいくつかの組み込みのおもちゃデータセットがあります。そのうちの 1 つは、レストランでの請求総額、チップ、パーティーの規模、数週末にわたるパーティーに喫煙者の有無を追跡したウェイターからのデータセットです。請求書とチップの間に相関関係はありますか?
まず、Seaborn を使用してデータセットを読み込みます。
tips = sns.load_dataset('tips')
これにより、データセットが pandas DataFrame としてロードされます。
最初の数行を調べてみましょう。
tips.head()
そして、平均、中央値、最頻値、下位四分位 (25 パーセンタイル)、上位四分位 (50 パーセンタイル) などの標準的な記述統計を取得します。
tips.describe()
合計金額を x 軸の独立変数とし、チップを y 軸の従属変数として散布図を作成します。
sns.relplot(x='total_bill',y='tip',data=tips)
うーん、この散布図には正の線形関係があるようです。これらの点の上に線を引くと、合計金額とともにチップが上がります。一部のヒントは外れ値として高くなりますが、この関係は一般的に成り立つようです。
このような線が描かれた回帰プロットを生成できます。
sns.regplot(x='total_bill',y='tip',data=tips)
探索からモデリングまで
Python を使用すると回帰モデルを簡単に構築できます
データを調査し、請求書とチップの間に肯定的な関係が見つかったので、今度はそれを正式にモデル化します。これは statsmodel を使用すると簡単に実行できます。
results = smf.ols('tip ~ total_bill',data=tips).fit()
results.summary()
簡単に言うと、これは R の式と同様の式を作成し、モデルといくつかの診断情報を含む概要を表示します。最も役立つのは、表の左側の列です。これには、初等代数の授業で学んだ可能性のある y 切片と傾きが含まれています。これは、散布図上にプロットされた線を表します。もし私がレストランのマネージャーだったら、接客スタッフに顧客にアップセルするようアドバイスするだろう。なぜなら、彼らはより多くのチップを得ることができ、同時にレストランの収益にも貢献できるからである。
これは統計 101 で教えられる単純な線形回帰ですが、実際には一種の機械学習です。データを既知のターゲット、つまり元のデータセットの y 値に適合させるため、これは教師ありアルゴリズムです。
このモデルを使用すると、値を代入して予測を行うことができます。しかし、新しいデータはどうでしょうか?そこで、scikit-learn の出番です。これは、Python の最高の機械学習ライブラリです。データをテスト データとトレーニング データに分割し、予測を行うことができます。 scikit-learn の回帰に関するチュートリアルを修正してデモします。
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split,LinearRegression
X = tips(('total_bill'))
y = tips('tip')
X_train, X_test, y_train, y_test = train_test_split(X, y)
model = LinearRegression().fit(X_train, y_train)
その後、「テスト」データセットからヒントを予測できます。
y_pred = model.predict(X_test)
sckit-learn の例を再度変更して、トレーニング データとテスト データの回帰直線をプロットします。
import matplotlib.pyplot as plt
fig, ax = plt.subplots(ncols=2, figsize=(10, 5), sharex=True, sharey=True)
ax(0).scatter(X_train, y_train, label="Train data points")
ax(0).plot(
X_train,
model.predict(X_train),
linewidth=3,
color="tab:orange",
label="Model predictions",
)
ax(0).set(xlabel="Feature", ylabel="Target", title="Train set")
ax(0).legend()
ax(1).scatter(X_test, y_test, label="Test data points")
ax(1).plot(X_test, y_pred, linewidth=3, color="tab:orange", label="Model predictions")
ax(1).set(xlabel="Feature", ylabel="Target", title="Test set")
ax(1).legend()
fig.suptitle("Linear Regression")
plt.show()
このコードやその他のコードはすべて、私の GitHub アカウントでご覧いただけます。
Python が計算をしてくれます
Python は数学的な重労働を行ってくれました。これにより、モデルがどれほど有効であるかを疑問に思うことなどに集中できるようになりました。そして、自分で勉強する動機にもなりました。私は行列方程式を解いたり、微分や積分を直接計算したりはしませんが、現代の統計と機械学習は微積分と線形代数に大きく依存しています。私も Python を使用してこれらのトピックを調査しましたが、それは私自身の判断によるものです。 Python と新しい知識を武器に、将来的には機械学習をさらに探索できるようになります。
このテーマについてさらに詳しく知りたい方は以下をご覧ください