🔰機械学習アルゴリズム7選！

# はじめに
データサイエンスは2024年も成長し続けていくであろう分野です。
データサイエンティストとしてどのアルゴリズムが最適に機能するかを知っておくことが大事だと思います。
機械学習モデルは多数あり、全てを理解するのは多くの時間がかかりますが、一般的なモデルについて理解しておく必要があると思います。
今回は、データサイエンティストが知っておくべき7つの機械学習アルゴリズムをご紹介します。

![DALL·E 2024-01-27 17.22.15 - A visually engaging and informative blog header image for a blog titled 'Top 7 Machine Learning Algorithms'. The image should depict icons or abstract.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/603047/cb51d502-f2d4-be55-b631-f66683d31c6b.png)
# 教師あり学習
### 線形回帰(Linear Regression)
線形回帰は、2つの変数間の線形関係に基づいて、連続変数の値を予測する基本的な統計モデルです。このモデルは、一つの変数（独立変数）からもう一つの変数（従属変数）の値を予測するために使用されます。線形回帰の主な仮定は、これらの変数間に直線的な関係が存在することです。

線形回帰モデルは、適切なデータセットがあれば、実装とトレーニングが容易であり、予測の信頼性が高いという利点があります。これにより、多くの場面での初期分析や予測モデリングに適しています。しかし、現実世界のデータは必ずしも直線的な関係に従わないため、線形回帰は多くの実践的なビジネスアプリケーションではその有用性が限定されます。また、外れ値の影響を受けやすく、大規模で多様なデータセットに適用する場合には注意が必要です。したがって、より複雑な非線形関係をモデリングする必要がある場合、他の高度な機械学習手法を検討することが推奨されます。

コードの例です
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error

# フィクションのデータセットを生成
np.random.seed(0)
X = 2 * np.random.rand(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1)

# 線形回帰モデルを訓練
lin_reg = LinearRegression()
lin_reg.fit(X, y)
y_pred = lin_reg.predict(X)

# モデルの結果をプロット
plt.scatter(X, y, color='blue')
plt.plot(X, y_pred, color='red')
plt.xlabel('X')
plt.ylabel('y')
plt.title('Linear Regression')
plt.show()

# 係数と誤差を表示
print(f"係数: {lin_reg.coef_}")
print(f"切片: {lin_reg.intercept_}")
print(f"平均二乗誤差: {mean_squared_error(y, y_pred)}")
```

### ロジスティック回帰(Logistic Regression)
ロジスティック回帰は、名前が似ている線形回帰とは異なり、分類問題に使われる機械学習アルゴリズムです。線形回帰が連続値を予測するのに対し、ロジスティック回帰はデータが特定のカテゴリーに属する確率を予測します。

この手法は、顧客の離反予測、天気予報、製品の成功率の予測などによく使用されます。線形回帰と同様に、実装と訓練が容易ですが、オーバーフィッティングに陥りやすく、複雑な関係性を捉えるのに苦戦することがあります。

ロジスティック回帰は、シグモイド関数を使用して確率をモデル化し、予測された確率が特定の閾値を超えるとデータポイントを特定のクラスに分類します。これにより、バイナリやマルチクラスの分類問題に対応でき、さまざまな産業や研究領域で広く応用されています。

コードの例です
```python
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

# フィクションのデータセットを生成
X = np.random.randn(100, 2)
y = (X[:, 0] + X[:, 1] > 0).astype(np.int)

# 訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

# ロジスティック回帰モデルの訓練
log_reg = LogisticRegression()
log_reg.fit(X_train, y_train)

# テストデータで予測と評価
y_pred = log_reg.predict(X_test)
print(classification_report(y_test, y_pred))
```

# 決定木（Decision Trees)
決定木は、分類と回帰の両方に使用される機械学習アルゴリズムです。このアルゴリズムは、データをより小さなサブセットに分割する一連の質問を用いて、データセットを学習します。これらの質問や分岐は、木構造で表され、最終的には「葉」ノードに到達し、予測が行われます。

決定木の主な特徴は、その解釈可能性です。木構造を可視化することで、どのように特定の予測が行われたかを簡単に理解できます。しかし、決定木はオーバーフィッティング（過学習）に陥りやすく、特に訓練データに対して複雑なツリーを作成すると、新しいデータに対する汎化性能が低下することがあります。

コードの例です
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Irisデータセットをロード
iris = load_iris()
X = iris.data
y = iris.target

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

# 決定木モデルの訓練
tree_clf = DecisionTreeClassifier(max_depth=2, random_state=42)
tree_clf.fit(X_train, y_train)

# テストデータで予測と評価
y_pred = tree_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"正解率: {accuracy}")
```

### ナイーブベイズ(Naive Bayes)
ナイーブベイズは単純ベイズとも表記されます。
ナイーブベイズは、特にテキストデータの分類によく使用される機械学習アルゴリズムです。これは、ベイズの定理を基にした確率的な分類手法で、特にスパム検出、感情分析、文書分類などに有効です。

ナイーブベイズの「ナイーブ（単純）」という名前は、アルゴリズムが特徴間に相互独立性を仮定することから来ています。つまり、ある特徴が与えられた場合、他の特徴の存在は無視されます。この単純な仮定にもかかわらず、ナイーブベイズは多くの実用的なケースで良好なパフォーマンスを示します。

コードの例です
```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import accuracy_score

# Irisデータセットをロード
iris = load_iris()
X = iris.data
y = iris.target

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

# ガウシアンナイーブベイズモデルの訓練
gnb = GaussianNB()
gnb.fit(X_train, y_train)

# テストデータで予測と評価
y_pred = gnb.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"正解率: {accuracy}")
```

### ランダムフォレスト(Random Forest)
ランダムフォレストは、決定木のアンサンブル学習方法の一つで、分類、回帰、その他のタスクに用いられます。このアルゴリズムは、多数の決定木を訓練し、それぞれの木の予測を平均化するか投票によって最終的な予測を行います。ランダムフォレストは、個々の決定木が訓練データの特定の部分集合に過剰適合することを防ぎ、全体としてのモデルの精度と汎用性を高めます。

ランダムフォレストの主な利点は、過剰適合に強く、データの前処理が少なくて済む点です。また、特徴量の重要度を評価できるため、特徴選択にも利用されます。

```python
import numpy as np
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

# Irisデータセットをロード
iris = load_iris()
X = iris.data
y = iris.target

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

# ランダムフォレストモデルの訓練
rf_clf = RandomForestClassifier(n_estimators=100, random_state=42)
rf_clf.fit(X_train, y_train)

# テストデータで予測と評価
y_pred = rf_clf.predict(X_test)
accuracy = accuracy_score(y_test, y_pred)
print(f"正解率: {accuracy}")
```

# 教師なし学習
### K平均法クラスタリング(K-Means Clustering)
K-平均法は、教師なし学習における最も一般的なクラスタリング手法の一つです。このアルゴリズムはデータをK個のクラスタに分割することを目的とし、各クラスタはそのクラスタに属するデータポイントの中心（セントロイド）に基づいて形成されます。

K-平均法の基本的な手順は以下の通りです
1. ランダムにK個のセントロイド（クラスタの中心）を選択します。
2. 各データポイントを最も近いセントロイドに割り当て、クラスタを形成します。
3. 各クラスタの平均点を計算し、新しいセントロイドとして設定します。
4. セントロイドが変わらなくなるか、あるいは指定された繰り返し回数に達するまで、2と3のステップを繰り返します。
5. このアルゴリズムは、クラスタの数Kを事前に指定する必要があります。Kの選択は、問題の性質やデータの分布に依存します。

コードの例です
```python
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.datasets import make_blobs

# 人工的なデータセットを生成
X, y = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

# K-平均法クラスタリングの適用
kmeans = KMeans(n_clusters=4)
kmeans.fit(X)
y_kmeans = kmeans.predict(X)

# クラスタリング結果のプロット
plt.scatter(X[:, 0], X[:, 1], c=y_kmeans, s=50, cmap='viridis')
centers = kmeans.cluster_centers_
plt.scatter(centers[:, 0], centers[:, 1], c='black', s=200, alpha=0.5)
plt.title('K-Means Clustering')
plt.show()
```

### 特異値分解(Singular Value Decomposition:SVD)
特異値分解は線形代数における強力な手法であり、教師なし学習において重要な役割を果たします。特異値分解は、任意の形状の行列を3つの特定の行列の積に分解することができます。これらの行列は以下の通りです：

1. U行列：元の行列の行に関連する直交行列。
2. Σ（シグマ）行列：対角行列で、特異値が降順に並んでいます。
3. Vの転置行列（V^T）：元の行列の列に関連する直交行列。

特異値分解は、次元削減、データ圧縮、ノイズ削減、レコメンデーションシステムなど様々な応用があります。たとえば、特異値分解は推薦システムにおいて、ユーザーとアイテム間の関係を捉えるために用いられます。

```python
import numpy as np

# サンプル行列の作成
A = np.array([[1, 2], [3, 4], [5, 6]])

# 特異値分解の実行
U, s, VT = np.linalg.svd(A)

# 結果の表示
print("U行列:")
print(U)
print("シグマ行列:")
print(np.diag(s))
print("V^T行列:")
print(VT)
```

# おわりに
今回は教師あり学習と教師なし学習から7つの機械学習アルゴリズムをご紹介しました。
最近、プロ野球選手の口癖の「〇〇といいますか、そういうふうにやっていきたいです」のように「といいますか」をよく耳にします。
データサイエンティストになりたい人は機械学習を勉強するといいますか、理解していけばいいと思います。
実際の問題解決にこれらの手法をどのように応用できるかを学ぶことが重要です
以上です。

# 備考
100いいね、２００ストック、週間ランキングTOP10入りを果たした類似記事です。

https://qiita.com/wooooo/items/24d1a4d6be5ab7bf023f