この章では、Pythonを使って実際に機械学習アルゴリズムを実装していきます。具体的には、線形回帰、ロジスティック回帰、k近傍法(KNN)、決定木とランダムフォレストについて解説します。それぞれのアルゴリズムには特徴があり、用途やデータの特性に応じて適切なものを選ぶことが重要です。
概要:
線形回帰は、最も基本的な回帰モデルであり、連続的なターゲット変数(例えば、家の価格や気温など)を予測するために使われます。このアルゴリズムは、与えられたデータの特徴(説明変数)とターゲット(目的変数)との間の関係を直線的なモデルで表現します。モデルは以下の形で表されます。
ここで、
数学的背景:
線形回帰モデルは最小二乗法を用いて、与えられたデータに最も適合する直線を求めます。最小二乗法は、予測値と実際のターゲット値との誤差(二乗誤差)の合計を最小化する係数を見つける手法です。具体的には、次の目的関数を最小化します。
ここで、
実装例(Pythonコード):
Pythonで線形回帰を実装するには、scikit-learn
ライブラリが便利です。以下のコード例では、sklearn.linear_model
のLinearRegression
クラスを使用して線形回帰モデルを構築し、予測を行います。
# ライブラリのインポート
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# データの準備(例としてランダムに生成されたデータを使用)
np.random.seed(42)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# モデルの構築と訓練
model = LinearRegression()
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
# モデルの評価
mse = mean_squared_error(y_test, y_pred)
rmse = np.sqrt(mse)
print(f"予測精度(RMSE): {rmse}")
解説:
LinearRegression
クラスは、線形回帰モデルを提供するもので、fit
メソッドでデータに適合させます。train_test_split
関数でデータを訓練用とテスト用に分け、モデルが適合していないデータで予測性能を評価します。概要:
ロジスティック回帰は、分類問題に使用されるアルゴリズムで、ターゲット変数が2つ以上のカテゴリに分類される場合に適しています。特に、二項分類(バイナリ分類)問題でよく用いられ、例えば、あるメールがスパムかどうか、ある患者が病気かどうかなどの予測に使用されます。
ロジスティック回帰は名前に「回帰」と含まれますが、分類アルゴリズムです。ロジスティック関数(シグモイド関数)を使用して、出力が0から1の間の確率値として表されます。
ロジスティック関数は以下のように定義されます。
ここで、
数学的背景:
ロジスティック回帰は線形回帰と同様に、説明変数の線形結合を使ってターゲット変数を予測しますが、その結果をシグモイド関数に通すことで、出力が0から1の範囲に収まるようにします。この確率を基に、出力が0.5以上なら「1(肯定)」、それ未満なら「0(否定)」と分類します。
ロジスティック回帰の目的関数は対数尤度関数を最大化することです。
実装例(Pythonコード):
ロジスティック回帰の実装もscikit-learn
ライブラリを使って行います。以下の例では、sklearn.linear_model
のLogisticRegression
クラスを使ってバイナリ分類を実行します。
# ライブラリのインポート
from sklearn.datasets import load_breast_cancer
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix
# データセットのロード(乳がんデータセットを使用)
data = load_breast_cancer()
X = data.data
y = data.target
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# ロジスティック回帰モデルの構築と訓練
model = LogisticRegression(max_iter=10000)
model.fit(X_train, y_train)
# 予測
y_pred = model.predict(X_test)
# モデルの評価
accuracy = accuracy_score(y_test, y_pred)
conf_matrix = confusion_matrix(y_test, y_pred)
print(f"分類精度: {accuracy}")
print("混同行列:")
print(conf_matrix)
解説:
scikit-learn
に組み込まれたものを使用しています。LogisticRegression
クラスを使ってモデルを構築し、fit
メソッドで訓練します。概要:
k近傍法(k-Nearest Neighbors, KNN)は、最もシンプルな分類アルゴリズムの一つで、非パラメトリックな手法です。訓練データのラベル付きデータポイントに基づいて、未知のデータポイントのカテゴリを予測します。k近傍法では、新しいデータポイントが既知のデータポイントにどれだけ近いか(距離に基づいて)を評価し、最も近いk個のデータポイントのラベルで新しいデータポイントを分類します。
数学的背景:
k近傍法では、ユークリッド距離やマンハッタン距離などを使ってデータポイント間の距離を計算します。次に、訓練データの中で最も近いk個のデータポイントのラベルを数え、多数派のクラスに新しいデータポイントを分類します。
ユークリッド距離は次の式で計算されます。
ここで、
実装例(Pythonコード):
KNNの実装もscikit-learn
を使います。次の例では、sklearn.neighbors
のKNeighborsClassifier
クラスを使ってKNNによる分類を行います。
# ライブラリのインポート
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy
# データセットのロード(アヤメデータセットを使用)
data = load_iris()
X = data.data
y = data.target
# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# k近傍法(k=3)のモデルの構築
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)
# 予測
y_pred = knn.predict(X_test)
# モデルの評価
accuracy = accuracy_score(y_test, y_pred)
print(f"分類精度: {accuracy}")
解説:
KNeighborsClassifier
クラスを使って、k=3のモデルを構築します。これは、新しいデータポイントを3つの最も近いデータポイントのラベルに基づいて分類するという意味です。k近傍法の特徴と使いどころ:
4.4.1 決定木
概要:
決定木(Decision Tree)は、回帰問題や分類問題の両方に使用できるアルゴリズムで、データを分割しながら予測を行います。木構造でデータを分類することで、各ノードでデータを2つのグループに分割し、最終的には葉ノードに達した時点でクラスを予測します。決定木は直感的で解釈が容易なモデルです。
数学的背景:
決定木の構築は、データセットを条件付きで分割していくプロセスです。分割の基準として、Gini不純度やエントロピー、または回帰問題の場合は分散の減少などを使用します。たとえば、Gini不純度は以下のように定義されます。
ここで、
Gini不純度が小さいほど、データの純度が高く、そのノードでのクラス分類が明確であることを意味します。
実装例(Pythonコード):
決定木はsklearn.tree
モジュールのDecisionTreeClassifier
を使って実装できます。
# ライブラリのインポート
from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import classification_report
# 決定木モデルの構築
tree_model = DecisionTreeClassifier(random_state=42)
tree_model.fit(X_train, y_train)
# 予測
y_pred_tree = tree_model.predict(X_test)
# モデルの評価
print(f"分類精度: {accuracy_score(y_test, y_pred_tree)}")
print("詳細な評価:")
print(classification_report(y_test, y_pred_tree))
解説:
DecisionTreeClassifier
クラスを使って決定木モデルを構築します。fit
メソッドで訓練データに適合させ、predict
メソッドでテストデータに対して予測を行います。classification_report
を使用し、クラスごとの精度、再現率、F1スコアを確認できます。決定木の特徴と使いどころ:
4.4.2 ランダムフォレスト
概要:
ランダムフォレスト(Random Forest)は、複数の決定木を使ったアンサンブル学習手法です。複数の木から予測を行い、その結果を投票や平均化することで、単一の決定木よりも高い精度と汎化性能を実現します。
数学的背景:
ランダムフォレストは、決定木のブートストラップサンプル(訓練データからランダムに重複を許してサンプルを選ぶ方法)を使って個々の木を学習させます。各木は異なる特徴のサブセットを使って訓練され、最終的に多数決によって最も支持されたクラスを予測します。
ランダムフォレストでは、バギング(Bootstrap Aggregating)という手法を用いて予測のバラつきを減らし、より安定したモデルを作ります。
実装例(Pythonコード):
ランダムフォレストはsklearn.ensemble
モジュールのRandomForestClassifier
を使って実装できます。
# ライブラリのインポート
from sklearn.ensemble import RandomForestClassifier
# ランダムフォレストモデルの構築
forest_model = RandomForestClassifier(n_estimators=100, random_state=42)
forest_model.fit(X_train, y_train)
# 予測
y_pred_forest = forest_model.predict(X_test)
# モデルの評価
print(f"分類精度: {accuracy_score(y_test, y_pred_forest)}")
print("詳細な評価:")
print(classification_report(y_test, y_pred_forest))
解説:
RandomForestClassifier
クラスを使って、ランダムフォレストモデルを構築します。n_estimators=100
は、100本の決定木を作るという意味です。ランダムフォレストの特徴と使いどころ:
この章では、Pythonを使って線形回帰、ロジスティック回帰、k近傍法、決定木、ランダムフォレストの各機械学習アルゴリズムを実装しました。それぞれのアルゴリズムには異なる特性があり、適切な場面で使い分けることが重要です。
これらのアルゴリズムを理解し、実際にPythonで試すことで、機械学習の基本的な実装スキルを身に着けることができます。
プログラミングを始めたいと思っているそこのあなた、独学よりもプログラミングスクールが断然おすすめです!理由は簡単、続けやすさです。
独学でプログラミングを続けるのは、実はかなりハードルが高いんです。データによると、なんと87.5%もの学習者が途中で挫折しているとか。一方、各プログラミングスクールが公表しているデータによると、受講生の約95%が最後までやり抜いているとのこと。数字を見れば一目瞭然、プログラミングスクールの方が圧倒的に続けやすいんです。
プログラミングスクールには有料と無料のタイプがありますが、その違いは次の通りです:
どちらが自分に合っているか、よく考えて選ぶのが大事です。
プログラミング初心者でも学びやすいと評判の『FREEKS』、その特徴は以下の通り:
なんと、月会費のみで全カリキュラムが受け放題!Java、PHP、HTML/CSS、JavaScriptなど、多彩なプログラミング言語が学べるんです。しかも、AIが質問に自動で答えてくれるシステムも導入済み。
カリキュラムを終了した後には、Freeks経由で未経験者でも取り組める副業案件の受注が可能。実務を通じてスキルを磨き、市場価値の高いエンジニアへの道が開けます。
独学で悩むくらいなら、まずはプログラミングスクールをチェックしてみるのもアリかもしれませんよ!
↓ ↓ こちらをクリック ↓ ↓