この記事では、機械学習の基礎である「線形回帰」について、実際にPythonコードを紹介しながら解説していきます。
具体的には、東京の気温データを使って翌日の気温を予測するモデルを作成します。また、Google Colaboratory(通称:Colab)を使うので、特別なソフトウェアのインストールは不要です。
1. 機械学習とは?
機械学習とは、コンピュータがデータから学習し、そのパターンを見つけ出して、予測を行うものです。人間が明示的にプログラミングしなくても、データから学習して結果を予想する事ができるようになります。
機械学習には主に以下の種類があります:
- 教師あり学習:正解(ラベル)付きのデータを使って学習するもの
- 教師なし学習:正解なしでデータの構造やパターンを見つけるもの
- 強化学習:行動と報酬の関係を学習するもの
今回は教師あり学習の基本、線形回帰を解説します。
2. 線形回帰とは?
線形回帰は最も基本的な機械学習アルゴリズムで、主に2つ以上の変数の関係を直線(あるいは平面)で予測するモデルです。
例えば、「今日の気温」から「明日の気温」を予測する場合を考えてみます。
3. Google Colaboratoryの準備
Google Colaboratory(Colab)は、ブラウザ上でPythonコードを実行できるサービスです。
- Googleアカウントにログインします
- Google Colab にアクセスします
- 「新しいノートブック」を選択して、新しいノートブックを作成します
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.title
、plt.xlabel
、plt.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. まとめと発展
この記事では、機械学習の基礎である線形回帰を使って、気温データから翌日の気温を予測するモデルを作成しました。
学んだ内容のおさらい:
- 機械学習の基本概念と線形回帰の仕組み
- Pythonによるデータの読み込みと前処理
- 機械学習モデルの作成と学習
- モデルによる予測と評価
発展の方向性
もっと精度を高めたい場合、以下のような改善が考えられます:
- より多くのデータを使う:20日分だけでなく、数年分のデータを使用する
- 特徴量を増やす:気温だけでなく、湿度、気圧、前日との差分などを特徴量として追加する
- より複雑なモデルを試す:線形回帰だけでなく、ランダムフォレストやニューラルネットワークなどの高度なモデルを使用する
この記事が機械学習への第一歩となれば幸いです。実際にコードを動かして、パラメータを変えながら実験してみることをお勧めします。