Pythonで始める機械学習入門:東京の気温データを使った線形回帰

この記事では、機械学習の基礎である「線形回帰」について、実際にPythonコードを紹介しながら解説していきます。

具体的には、東京の気温データを使って翌日の気温を予測するモデルを作成します。また、Google Colaboratory(通称:Colab)を使うので、特別なソフトウェアのインストールは不要です。

1. 機械学習とは?

機械学習とは、コンピュータがデータから学習し、そのパターンを見つけ出して、予測を行うものです。人間が明示的にプログラミングしなくても、データから学習して結果を予想する事ができるようになります。

機械学習には主に以下の種類があります:

  • 教師あり学習:正解(ラベル)付きのデータを使って学習するもの
  • 教師なし学習:正解なしでデータの構造やパターンを見つけるもの
  • 強化学習:行動と報酬の関係を学習するもの

今回は教師あり学習の基本、線形回帰を解説します。

2. 線形回帰とは?

線形回帰は最も基本的な機械学習アルゴリズムで、主に2つ以上の変数の関係を直線(あるいは平面)で予測するモデルです。

例えば、「今日の気温」から「明日の気温」を予測する場合を考えてみます。

3. Google Colaboratoryの準備

Google Colaboratory(Colab)は、ブラウザ上でPythonコードを実行できるサービスです。

  1. Googleアカウントにログインします
  2. Google Colab にアクセスします
  3. 「新しいノートブック」を選択して、新しいノートブックを作成します

4. 必要なライブラリのインポート

まず、必要なライブラリをインポートします。以下のコードをColabのセルに入力し、実行してください。

# 必要なライブラリのインポート
import numpy as np  # 数値計算用ライブラリ
import pandas as pd  # データ処理用ライブラリ
import matplotlib.pyplot as plt  # グラフ描画用ライブラリ
from sklearn.linear_model import LinearRegression  # 線形回帰モデル
from sklearn.metrics import mean_squared_error  # 評価指標の計算

# グラフを日本語表示するためのフォント設定
import matplotlib as mpl
mpl.rcParams['font.family'] = 'IPAexGothic'

各ライブラリの説明:

  • numpy:数値計算を高速に行うためのライブラリ
  • pandas:表形式のデータを扱うためのライブラリ
  • matplotlib:グラフを描画するためのライブラリ
  • scikit-learn:様々な機械学習アルゴリズムを提供するライブラリ

5. サンプルデータの作成

今回は、練習用に東京の気温データをサンプルにして作成します。

# 20日分の東京の気温データを作成(例として2023年7月1日から20日)
dates = pd.date_range(start='2023-07-01', periods=20)

# 具体的な気温データ(実際の値を直接指定)
temp_data = [
    28.5, 29.2, 27.8, 30.1, 29.7,  # 7月1日~5日
    31.5, 32.0, 30.5, 29.8, 28.7,  # 7月6日~10日
    27.5, 26.8, 28.3, 29.5, 30.2,  # 7月11日~15日
    31.8, 32.5, 31.0, 29.5, 28.0   # 7月16日~20日
]

# DataFrameを作成
df = pd.DataFrame({
    '日付': dates,
    '気温': temp_data
})

# データの先頭を確認
print(df.head())

このコードでは、2023年7月の具体的な気温データを直接指定しています。一般的には外部から大量のデータを取得しますが、今回は単純に20日分の気温を直接書き込んでいます。

6. データの確認

まずはデータを可視化して、どのようなデータを扱っているのか確認します。

# 気温データのプロット
plt.figure(figsize=(10, 6))
plt.plot(df['日付'], df['気温'], 'o-', color='red')
plt.title('東京の気温データ(2023年7月)')
plt.xlabel('日付')
plt.ylabel('気温(℃)')
plt.grid(True)
plt.xticks(rotation=45)
plt.tight_layout()
plt.show()

# データの基本統計量を確認
print("気温データの基本統計量:")
print(df['気温'].describe())

plt.figureで図のサイズを指定し、plt.plotで線グラフを描画しています。o-は点と線の両方を描画することを意味します。plt.titleplt.xlabelplt.ylabelでタイトルと軸ラベルを設定しています。

7. データの前処理

次に、機械学習を実行するために、まずはデータを「特徴量(説明変数)」と「ターゲット(目的変数)」に分割します。今回は「今日の気温」から「明日の気温」を予測するので、1日ずらしたデータを作成します。

# 特徴量(X)とターゲット(y)の準備
X = df['気温'].values[:-1].reshape(-1, 1)  # 最後の日を除いた気温データ
y = df['気温'].values[1:]  # 2日目以降の気温データ

print("特徴量のシェイプ:", X.shape)
print("ターゲットのシェイプ:", y.shape)
print("\n特徴量(最初の5つ):")
print(X[:5])
print("\nターゲット(最初の5つ):")
print(y[:5])

 

ここでの重要な用語:

  • 特徴量(説明変数):モデルへの入力となるデータ。今回は「今日の気温」
  • ターゲット(目的変数):予測したい値。今回は「明日の気温」

reshape(-1, 1)は、1次元の配列を2次元の配列(列ベクトル)に変換するための処理です。scikit-learnの線形回帰モデルは、特徴量が2次元配列であることを期待しています。

8. モデルの作成と学習

線形回帰モデルを作成し、データを使って学習させます。

 

# 線形回帰モデルのインスタンス化
model = LinearRegression()

# モデルの学習
model.fit(X, y)

# 学習されたパラメータを確認
print("切片(バイアス):", model.intercept_)
print("係数(重み):", model.coef_[0])
print("\n学習されたモデル式: 明日の気温 = {:.4f} × 今日の気温 + {:.4f}".format(model.coef_[0], model.intercept_))

ここでの「インスタンス化」について説明します:

インスタンス化とは:プログラミングにおいて、クラス(設計図)から実際に使えるオブジェクト(実体)を作成することです。例えるなら、「車の設計図(クラス)」から「実際に運転できる1台の車(インスタンス)」を作ることです。

なぜインスタンス化するのか

  • LinearRegressionクラスは、線形回帰を実行するための「設計図」です
  • model = LinearRegression()で、その設計図から実際に使える「モデル」(インスタンス)を作成します
  • このインスタンスに対して、fit()predict()などのメソッド(機能)を使って学習や予測を行います

インスタンス化することで、複数のモデルを別々に作成したり、それぞれ異なるパラメータで設定したりすることが可能になります。

fit()メソッドで学習を行うと、intercept_属性とcoef_属性で学習されたパラメータを確認できます。

  • 切片(バイアス):モデル式の定数項 b
  • 係数(重み):モデル式の係数 a

9. 予測と評価

学習したモデルを使って、訓練データでの予測と21日目の気温予測を行います。

# 訓練データでの予測
y_pred = model.predict(X)

# 予測値と実際の値を可視化
plt.figure(figsize=(10, 6))
plt.scatter(X, y, color='blue', label='実際の気温')
plt.plot(X, y_pred, color='red', linewidth=2, label='予測値')
plt.title('線形回帰モデルによる気温予測')
plt.xlabel('今日の気温(℃)')
plt.ylabel('明日の気温(℃)')
plt.legend()
plt.grid(True)
plt.show()

# モデルの評価
mse = mean_squared_error(y, y_pred)
rmse = np.sqrt(mse)
print("平均二乗誤差(MSE):", mse)
print("平方根平均二乗誤差(RMSE):", rmse)

# 21日目の気温予測
last_temp = df['気温'].values[-1]
next_temp = model.predict([[last_temp]])
print("20日目の気温: {:.1f}℃".format(last_temp))
print("予測された21日目の気温: {:.1f}℃".format(next_temp[0]))

モデルの評価指標について詳しく説明します:

MSE(平均二乗誤差) とは:

  • 予測値と実際の値の差(誤差)を二乗して平均した値です
  • 計算式:MSE = (1/n) * Σ(予測値 – 実際の値)²
  • 特徴:
    • 常に正の値になります(エラーの大きさを表します)
    • 誤差が大きいほど、二乗の効果で急激に値が大きくなります
    • 外れ値(大きな誤差)に敏感です
  • 用途:モデルの訓練中に最小化する目標値としてよく使われます

RMSE(平方根平均二乗誤差) とは:

  • MSEの平方根を取った値です
  • 計算式:RMSE = √MSE
  • 特徴:
    • 元のデータと同じ単位(今回の場合は℃)で表されるので、直感的に理解しやすい
    • 例えば、RMSE = 2.5℃ なら「平均して約2.5℃程度の誤差がある」と解釈できる
  • 用途:
    • モデルの精度を元のデータと同じ単位で評価したい場合
    • モデル同士の比較や、改善の度合いを測る場合

MSEとRMSEの違いと選び方

  • MSEは数学的な処理(微分など)がしやすいため、アルゴリズム内部で使われることが多い
  • RMSEは人間が理解しやすい単位で表されるため、結果の報告や説明に使われることが多い
  • どちらも値が小さいほど、モデルの予測精度が高いことを示します

10. まとめと発展

この記事では、機械学習の基礎である線形回帰を使って、気温データから翌日の気温を予測するモデルを作成しました。

学んだ内容のおさらい:

  1. 機械学習の基本概念と線形回帰の仕組み
  2. Pythonによるデータの読み込みと前処理
  3. 機械学習モデルの作成と学習
  4. モデルによる予測と評価

発展の方向性

もっと精度を高めたい場合、以下のような改善が考えられます:

  1. より多くのデータを使う:20日分だけでなく、数年分のデータを使用する
  2. 特徴量を増やす:気温だけでなく、湿度、気圧、前日との差分などを特徴量として追加する
  3. より複雑なモデルを試す:線形回帰だけでなく、ランダムフォレストやニューラルネットワークなどの高度なモデルを使用する

この記事が機械学習への第一歩となれば幸いです。実際にコードを動かして、パラメータを変えながら実験してみることをお勧めします。