scikit-learnで機械学習【pythonAI入門】

ここでは、scikit-learn(sklearn)について初心者向けに説明します。

スポンサーリンク

scikit-learnとは?

scikit-learn(sklearn)は、Pythonで最も広く使われている「機械学習ライブラリ」の1つです。

機械学習の「教師あり学習(回帰・分類)」や「教師なし学習(クラスタリングなど)」のアルゴリズムが標準装備されています。

データの前処理や評価指標も豊富に用意されており、
初心者〜上級者まで幅広く使われます。

scikit-learnの「基本の型」

  1. データ準備
    Numpy配列やPandasデータフレームで説明変数(X)と目的変数(y)を用意
  2. モデル作成
    RandomForestRegressor()やLogisticRegression()などのモデルを作成
  3. 学習
    .fit(X, y) でモデル学習
  4. 予測・評価
    .predict(X_test) で予測、評価指標で性能チェック

scikit-learnの最小コード例

最小の例としてアパートの家賃の予測をします。

条件(説明変数)として、畳数、駅からの距離、築年数、

予測する結果(目的変数)を家賃とします。

from sklearn.ensemble import RandomForestRegressor
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_absolute_error
import numpy as np

# データ読み込み
# X:畳数、駅からの距離、築年数、y:家賃
X = np.array([[12,0.1,0],[8,0.5,5],[6,1,10],[4.5,3,20],[3,5,30]])
y = np.array([20,15,10,5,3])

# 訓練用・テスト用に分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# モデル作成&学習
model = RandomForestRegressor(random_state=42).fit(X_train, y_train)

# 性能チェック y_testは正解データ、y_predはx_testに対する予測データ
y_pred = model.predict(X_test)
# 精度評価
mae = mean_absolute_error(y_test, y_pred)
print(f"テストデータに対する平均絶対誤差:{mae:.2f}万円")
print(f"スコア(決定係数R^2):{model.score(X, y):.3f}")

# 特徴量ごとの影響度
mfi = model.feature_importances_
print(f"特徴量ごとの重要度:{np.round(mfi,decimals=3)}")

# 家賃予測に活用
newroom=np.array([[10,2,12]])
y_new=model.predict(newroom)
print(f"新しい部屋の家賃予測:{y_new[0]:.2f}万円")

使用するパッケージ

インストールするときは、

pip install sklearn ではなく、pip install scikit-learn としなくてはなりません。

scikit-learnの他に、numpyも使用しています。

コードの解説

上記の最小コード例について詳細にご説明します。

モジュールの読み込み

from sklearn.ensemble import RandomForestRegressor

scikit-learnはサブモジュールの読み込みが必要なので、

import sklearn では使えません。

  • sklearn.ensemble
    アンサンブル学習用のモデル(複数の予測器を組み合わせて精度を高める手法)が入っているモジュールです。
  • RandomForestRegressor
    ランダムフォレスト回帰モデル。たくさんの決定木を組み合わせて、数値(連続値)の予測を行うためのアルゴリズム。

数字を予測したいときに適し、データの特徴をうまく捉え、精度も高く、直感的に理解しやすいのが特徴です。

from sklearn.model_selection import train_test_split
  • sklearn.model_selection
    「データを分割したり、交差検証したりする」ための道具箱です。
  • train_test_split
    「データを訓練用(学習用)とテスト用(評価用)に分ける」ための関数。

AIの訓練には「学習するためのデータ」と「答え合わせ(本当に当たるか)」用のデータが必要なので、自動でランダムに分割してくれる便利ツールです。

from sklearn.metrics import mean_absolute_error
  • sklearn.metrics
    「モデルの精度を評価する指標や関数」がたくさん入っているモジュールです。
  • mean_absolute_error
    平均絶対誤差(MAE)という「予測と本当の値のズレが平均でどれくらいあったか」を計算する関数。

数字を予測するタスクで、「1回あたりどのくらいズレていたか」を分かりやすく示してくれる指標です。

import numpy as np

numpyは、Pythonで数値計算を効率的に行うためのライブラリです。

 

データー読み込み

X = np.array([[12,0.1,0],[8,0.5,5],[6,1,10],[4.5,3,20],[3,5,30]])
y = np.array([20,15,10,5,3])

ここでは適当に作ったデータをコード上に直接書いてnumpyの配列に読み込んでます。

Xは説明変数であり、結果に影響する要因、原因です。ここでは、畳数、駅からの距離、築年数としています。
yは目的変数であり、結果となる変数で、ここでは、家賃としています。
下記のテーブルを読み込んでいるのと同じです。
畳数[畳] 駅からの距離[km] 築年数[年] 家賃[万円]
12 0.1 0 20
8 0.5 5 15
6 1 10 10
4 4.5 20 5
3 3 30 3

 

訓練用・テスト用に分割

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
X_trainが学習用の説明変数, X_testが学習結果評価用の説明変数, y_trainが正解データ(学習用の目的変数), y_testが学習結果評価用の正解データです。
train_test_split が、インポートしたsklearnのモジュールのメソッドで引数として、X,yの値を渡しています。test_size=0.2は、全データの20%を学習結果評価用に使うという意味です。random_state=42を指定することで、ランダムな処理を毎回同じ結果にすることができます。数字の42は何でもよいですが42がミームになっています。
今回のデーターは5個しかないので、そのうちの20%だと1データのみが学習結果評価用として使われ、random_stateの指定によりそのデータは毎回同じになります。

モデル作成&学習

model = RandomForestRegressor(random_state=42).fit(X_train, y_train)

ここがメインの学習の部分です。

RandomForestRegressorは、決定木ベースの回帰モデルです。学習が速く、解釈性も高いと言われています。

fit(X, y)は学習するメソッドで、これによって、学習済みのmodelオブジェクトができます。

モデルの性能チェック

y_pred = model.predict(X_test)
y_predには、X_testに対する予測データが入ります

modelは学習済みのAIモデルです。

predict()は、予測するという意味のメソッドです。

X_testには予測するデータが入っており、これに対する予測値が、y_predに入ります。

精度評価

mae = mean_absolute_error(y_test, y_pred)
print(f"テストデータに対する平均絶対誤差:{mae:.2f}万円")
print(f"スコア(決定係数R^2):{model.score(X, y):.3f}")

平均絶対誤差

mean_absolute_error()は、平均絶対誤差と呼ばます。モデルの予測がどれくらい外れたかを表す評価指標を計算する関数です。

sklearn.metricsという評価指標用のモジュールに含まれています。

平均絶対誤差を小数点以下2桁で整形して表示します。

 

スコア(決定係数R^2)

もう一つの精度評価として、AIのスコア(相関係数Rの二乗)は、モデルがデータをどれだけ説明できているか(=精度の点数)を示す数値です。sklearnのscore()メソッドで計算できます。

今回はデータ数が少なく、テスト用のデーターが一つしかないので、最初に用意した5つのデーター全てを使って、

model.score(X, y)

としてますが、本来は、テスト用のデータのみを使い、

model.score(X_test, y_test)

とした方が本当の予測精度として妥当です。

 

特徴量ごとの影響度

mfi = model.feature_importances_
print(f"特徴量ごとの重要度:{np.round(mfi,decimals=3)}")

feature_importances_は、各特徴量がどれくらい予測に役立ったかをモデルが教えてくれる指標です。

ランダムフォレストや決定木など「木構造のモデル」で使えます。

0~1の数値で有り、各特徴量の合計は1になります。この数字が大きいほど、その特徴量の影響の大きさが判ります。

mfiはnumpy配列なので、小数点以下の指定ではなく、round()で小数点以下3桁に丸めています。

家賃予測に活用

newroom=np.array([[10,2,12]])
y_new=model.predict(newroom)
print(f"新しい部屋の家賃予測:{y_new[0]:.2f}万円")

最後に、新しいデータを使って、作ったAIモデルを活用します。

newroomには新しい部屋の情報(畳数=10、駅からの距離=2km、築年数=12年)がnumpy配列として入ります。

性能チェックの時と同じように、predict() を使って、新しい部屋の家賃を予想します。

実行結果

上記のコードを実行すると、下記のように結果が表示されます。

テストデータに対する平均絶対誤差:1.05万円
スコア(決定係数R^2):0.921
特徴量ごとの重要度:[0.363 0.357 0.28 ]新しい部屋の家賃予測:11.80万円

家賃の予測

上記のとおり家賃の予測ができました。平均絶対誤差は、ばらつきの範囲を正確に表すものではありませんが、概ね、11.80±1.05万円になると考えても差支えないとされます。

スコア(決定係数R^2)

スコアはこのAIモデルの性能であり、下記の目安で考えます。あまりに低い場合、データの信頼性を疑うか、説明変数の内容を変更する必要があります。

  • R² = 0.9:90%はモデルで説明できている!(とても良い)
  • R² = 0.5:半分は当たってるが、まだ改善の余地あり
  • R² = 0:まったくデータのパターンを説明できていない
  • R² < 0:むしろランダム以下(モデルの作り直し推奨)

特徴量ごとの重要度

特徴量ごとの重要度が、畳数、駅からの距離、築年数の順に表示されています。

数値が最も高いのは、畳数になっているので、この場合は畳数が一番結果に影響する因子であると考えられます。

この数値が極端に低いものがある場合は、その説明変数(入力する条件)のデータ自体を疑うか、別の説明変数に入れ替えることを検討します。

 

まとめ

scikit-learn(sklearn)を使うことで、機械学習が簡単にできることが判りました。

今回は、コード上でデーターを直接記述してますが、実用時は、csvやエクセルなどのファイルを読み込むことで、汎用的なコードにすることができます。

そのような処理をしやすくするpandasや、結果をグラフなどで解りやすく表示できるshapなどのモジュールを使うことで、初心者でも案外簡単にすごいことができてしまいます。

これらの方法は別途紹介していきます。

 

補足

スコア(決定係数R²)とは?

■ 何を示す指標?
機械学習で「回帰モデルの予測精度がどれくらい良いか」を測る代表的な指標です。

モデルが「どれだけ正解に近い予測ができたか」を、0〜1の間で表します。

R²は「モデルの予測=正解にどれだけ近いか」を0〜1で表す“通知表”の点数みたいなものです。

  • 1に近いほど「ほぼ完璧」
  • 0なら「まったく説明できていない」
  • 0未満なら「ひどく悪い(平均値で予測したほうがマシ)」という意味です。

■ 具体的なイメージ

  • R² = 0.9:90%はモデルで説明できている!(とても良い)
  • R² = 0.5:半分は当たってるが、まだ改善の余地あり
  • R² = 0:まったくデータのパターンを説明できていない
  • R² < 0:むしろランダム以下(モデルの作り直し推奨)

■ 使い方
score = model.score(X_test, y_test)
print(score) # ← R²(決定係数)が表示される

 

特徴量ごとの重要度(feature_importances_)とは?

■ 何を示す指標?
各特徴量(=説明変数、Xの列ごと)が、予測にどれだけ役立ったかをスコア化したものです。

「モデルが判断を下すとき、どのデータの項目をどれくらい重視したか」を数値で示します。

大きいほど、その特徴量は重要(予測精度に大きく貢献)したということになります。

特徴量重要度は「テストでどの問題(特徴量)が合格点への貢献度が高かったか」を表す“問題ごとの得点配分”みたいなものです。

■ 使い方

importances = model.feature_importances_
print(importances)

配列(リスト)で返るので、「どの変数が一番大事か」順位が分かります。

■ よくある用途

どの項目をもっと詳しく調べると予測精度が上がるか発見できる

データ取得や設計で「本当に必要な項目」の優先順位がつけられる

業務で「どの因子がアウトカム(結果)に効いているか」を説明できる

■ 注意

feature_importances_は「決定木・ランダムフォレスト・勾配ブースティング」など“木構造”のモデルで使えます。

線形回帰モデルは「coef_(係数)」が同じ意味です。

この記事を書いた人
DD
DD

機械設計の仕事をしているエンジニアのDDと申します。
技術士(機械)の資格をもっています。
このブログでは、機械技術から日常の中の科学まで、私が興味を持ったことをできるだけ解りやすく紹介しています!

DDをフォローする
AI
スポンサーリンク
シェアする