Employee Blog
社員ブログ

Pythonで機械学習を勉強してみた(scikit-learn)

機械学習は、大量のデータからパターンを見つけ、予測や判断を行う技術です。
以前から興味はあったものの、難しそうでなかなか手を出せずにいました。
しかし今回、ChatGPTにコードを生成してもらい、それを読み解きながら学ぶことで、ようやく機械学習に触れることができました。
・これはその学習の記録です。
 初心者ゆえに間違いや分かりにくい点もあるかもしれませんが、ご容赦いただければ幸いです。


1. そもそも機械学習とは

機械学習は、大量のデータを解析し、規則性や関係性を見つけ出す手法です。
よくAI(人工知能)やディープラーニング(深層学習)と混同されがちですが、それぞれ異なる概念です。


  • AI(人工知能):人間の知能を模倣する技術の総称
  • 機械学習:AIの一分野で、データから学習して規則性を見つける技術
  • ディープラーニング:機械学習の一種で、人間が特徴を指定しなくてもデータから学習する手法

このように、機械学習やディープラーニングはAIの一部として位置づけられる技術です。


2. なぜPythonなのか

Pythonは、機械学習に必要なライブラリが豊富で、シンプルなコードでプログラムを組めるのが大きな魅力です。
特にscikit-learn, TensorFlow, PyTorchなど、強力なライブラリが揃っており、初心者でも比較的扱いやすい言語です。
また、コードが読みやすく、少ない記述量で実装できるため、学習コストが低い点もメリットです。
・今回はPythonのインストールや基本的な使い方については割愛しています。


3. 機械学習のコードを読み解いていく

では早速「Pythonで簡単にできる機械学習のコードを教えて」とChatGPTに依頼してみました。
すると、以下のコードが返ってきました。


# 必要なライブラリのインポート
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

# Irisデータセットの読み込み
iris = load_iris()
X = iris.data      # 特徴量
y = iris.target    # ラベル(クラス)

# 訓練データとテストデータに分割(テストサイズは全体の20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 決定木分類器の作成
clf = DecisionTreeClassifier()

# モデルの学習
clf.fit(X_train, y_train)

# テストデータでの予測
y_pred = clf.predict(X_test)

# 予測精度の計算と表示
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

なるほど、と一度コードを実行してみることにしました。
その前に、scikit-learnというライブラリが必要なため、まずはインストールします。


pip install scikit-learn

そして実行すると、以下のような出力が得られました。


Accuracy: 1.0

Accuracy(正解率)が1.0という結果になりましたが、これは何を示しているのかコードを読み解いてみます。


3.1. ライブラリのインポート

まず、scikit-learnとはデータ分析や機械学習に必要な機能をまとめた便利なライブラリです。
このコードでは、以下のモジュールをインポートしています。


from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

ここからは以下のAPIリファレンスを見ながら読み解いていきます。

API Reference — scikit-learn 1.6.1 documentation


  • load_iris:アイリスデータセット(分類)を読み込んで返します
  • train_test_split:配列または行列をランダムなトレーニングサブセットとテストサブセットに分割します
  • DecisionTreeClassifier:決定木分類器
  • accuracy_score:精度分類スコア

直訳だと、ということらしいけど…
よく分からないので、実際の使用方法を見ながら使い方を確認していきます。


3.2. データの用意

# Irisデータセットの読み込み
iris = load_iris()
X = iris.data      # 特徴量
y = iris.target    # ラベル(クラス)

まず、Iris データセットを読み込みます。
データセットとは、特定の目的で収集されたデータの集まりであり、統計分析や機械学習の学習データとして利用されます。

Iris データセットは、機械学習や統計解析の分野でよく使われる有名なデータセットの一つです。
アヤメという花の種類を分類するためのデータが含まれており、Setosa, Versicolor, Virginicaという3つの品種と、4種類の特徴量(がく片の長さ、がく片の幅、花弁の長さ、花弁の幅)が記録されています。
・このような機械学習モデルが学習するための入力データのことを特徴量と言います。


各品種のサンプル数は50ずつ、合計で150サンプルあります。
このデータを用いて、4つの特徴量から花の品種を予測するモデルを学習させます。

次にコードを確認すると、iris 変数にデータセットを読み込み、X には花の特徴量、yには品種のラベルを格納しています。
iris 変数には以下のデータを読み込んでいます。

scikit-learn/sklearn/datasets/descr/iris.rst at main · scikit-learn/scikit-learn · GitHub

scikit-learn/sklearn/datasets/data/iris.csv at main · scikit-learn/scikit-learn · GitHub


3.3 データの分割

# 訓練データとテストデータに分割(テストサイズは全体の20%)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

ここでは、学習用のデータと学習した結果をテストするためのデータに分割しています。
「test_size=0.2」は、全体の20%(150サンプル中30サンプル)をテスト用にする設定です。
「random_state=42」は、分割のランダム性を固定するためのシード値で、毎回同じ分割結果を得ることで実験の再現性を確保します。

random_stateに42を指定しているのには、深い意味はなく、多くはみんなが使っているからという感じらしいです。

Why random_state in train_test_split is equal 42 — ResearchGate


3.4. 決定木分類器の作成

# 決定木分類器の作成
clf = DecisionTreeClassifier()

ここでは、決定木を用いた分類器のインスタンスを作成しています。
決定木は、データを条件分岐によって分類や回帰するアルゴリズムで、直感的に理解しやすいのが特徴です。


  • 分類:データをカテゴリー(ラベル)に分けるタスク
  • 回帰:数値を予測するタスク

今回は、予測対象であるアヤメの品種(Setosa、Versicolor、Virginica)が明確なカテゴリ(ラベル)として定義されているため、分類を使用しています。


決定木をさらに理解するには以下を参考してください。

Understanding the decision tree structure — scikit-learn 1.6.1 documentation


scikit-learn で使える他の学習アルゴリズムは以下を参考にしてください。

User Guide — scikit-learn 1.6.1 documentation


3.5. モデルの学習

# モデルの学習
clf.fit(X_train, y_train)

X_train(学習用の特徴量)と y_train(学習用の品種ラベル)を用いて、モデルを学習させます。
モデルは、各特徴量がクラスに与える影響を学習し、内部に木構造を構築していきます。

ここで X_train と y_train の関係について確認しておきます。
X_train には学習用の花の特徴が、 y_train には学習用の花の品種入ってます。
これらは特徴量(X)とターゲット(y)という下記のような関係になります。


  • X は「入力」であり、モデルが学習するための特徴量の行列
  • y は「出力」であり、各サンプルの正解ラベル(ターゲット)

これは、入力(X)から出力(y)を予測する教師あり学習の基本的な考え方です。
今回だと花の特徴(X)から、花の品種(y)を予測します。
つまり、花の特徴(X)を与えると、花の品種(y)を予測できるようにモデルが学習するということです。

言葉でわかりずらいと思うので、決定木の内部構造を可視化してみます。

内部構造の可視化方法についてはこちら

1.10. Decision Trees — scikit-learn 1.6.1 documentation


ツリーを見ると決定木が何をしているのか、なんとなくわかると思います。
各ノードでは、特定の特徴量を基準にしてデータを左右に分割しています。


petal width (cm) <= 0.8

例えばこれであれば「花びらの幅が0.8cm以下なら左側、より大きければ右側に分岐する」という条件を意味します。

そして決定木において大事なのがgini(ジニ不純度)です。
これはノードの分岐を決める基準となるものです。
・デフォルトは gini だが 、 entropy や log_loss も選択可能


ジニ不純度は、データの不純度(混ざり具合)を測る指標 です。
決定木の学習で、あるノードがジニ不純度 0 になった場合、そのノードはそれ以上分割する必要がない(完全に分類できている)ということになります。


その他の項目についても簡単に説明しておきます。


  • samples:そのノードに含まれるサンプル数
  • value:各クラスのサンプル数の分布
  • class:ノード内で最も多いクラス(そのノードの予測結果)

3.6. テストデータによる予測

# テストデータでの予測
y_pred = clf.predict(X_test)

ここまで学習が完了したら、テスト用のデータ(学習に使用していないデータ)を使って予測を行います。
つまりテスト用の花の特徴(X_test)を渡して、それがどの花の品種なのかを予測してもらうということです。

y_predには、各サンプルの予測されたクラスラベル(花の品種)が格納されます。


3.7. 予測の評価

# 予測精度の計算と表示
accuracy = accuracy_score(y_test, y_pred)
print("Accuracy:", accuracy)

accuracy_score 関数は、テストデータの正解ラベル(y_test)とモデルが予測した結果(y_pred)を比較し、正解率を計算します。
ここで、Accuracy: 1.0という出力が何を示しているのかという最初の課題に立ち返ってみます。


今までの内容からこの1.0という数字は、今回の学習および予測で100%の正解率を達成できたことがわかります。
ただし、データセットは 150サンプルと少なく、構造もシンプルであるため、今回の実験で 100% の正答率が得られたことには注意が必要です。


4. 最後に

今回は、簡単なコードを通じて機械学習の基本的な流れを理解する第一歩を踏み出してみました。

特に、機械学習ではアルゴリズムだけでなく、データセットの質と量が重要であることを改めて実感しました。
また、適切なデータを十分に準備するには時間やコスト、専門知識が必要であり、機械学習を実践する上でデータの扱いが大きな課題となることも感じました。
一方で、アルゴリズムの細かい計算や内部の仕組みをすべて理解していなくても、実際に手を動かすことで多くのことが学べることもわかりました。

みなさんもぜひ、手を動かしながら一緒に学んでいきましょう!