目的
このブログシリーズでは、機械学習の基礎から応用までを体系的に学び、Kaggleコンペティションに出場し、メダルを獲得するためのスキルを身につけることを目指します。単なる知識の吸収にとどまらず、学んだ理論やアルゴリズムを実際の競技に応用できる力を養うことが目的です。この過程で、実践的な演習やプロジェクトを通じて、手を動かしながら学ぶ姿勢を大切にしていきます。
第7回の目標
機械学習は、大きく分けて教師あり学習と教師なし学習の二つのカテゴリーに分類されます。今回のテーマである教師あり学習は、入力データとそれに対応する正解(ラベル)が与えられた状態でモデルを学習させる手法です。これにより、新たなデータに対して正確な予測や分類を行うことが可能となります。
- 教師あり学習の基本的な概念と重要性を理解する。
- 代表的な教師あり学習アルゴリズムの理論と実装方法を学ぶ。
- 各アルゴリズムの特徴や適用例を把握し、適切な場面で選択・活用できるようになる。
k近傍法 (k-Nearest Neighbors, k-NN)
k近傍法は、最もシンプルな機械学習アルゴリズムの一つであり、未知のデータポイントのクラスを、その周囲にあるk個の既知のデータポイント(近傍)のクラスに基づいて予測します。直感的で理解しやすい反面、データ量が増えると計算コストが高くなるというデメリットもあります。
メリット:
- 理解と実装が容易
- 非線形なデータにも適用可能
デメリット:
- 計算量が多く、大規模データには不向き
- 次元の呪い(高次元データで性能が低下)
距離計算
最も一般的な距離計算方法はユークリッド距離です。2つのデータポイント$x = (x_1, x_2, …, x_n)$と$y = (y_1, y_2, …, y_n)$の間のユークリッド距離$d$は次のように計算されます。
$$d(x, y) = \sqrt{\sum_{i=1}^{n} (x_i – y_i)^2}$$
k近傍法は分類問題にも回帰問題にも対応可能です。
分類問題
項目 | 内容 |
---|---|
クラス決定方法 | 近傍のクラスに基づく「多数決」によるクラス決定 |
距離計算方法 | ユークリッド距離、マンハッタン距離 |
適用例 | 果物のサイズや色情報からのクラス分類(例:「リンゴ」「バナナ」「オレンジ」など) |
利点 | シンプルな計算で実装可能、ラベル付きデータがあればすぐにモデルとして利用可能 |
回帰問題
回帰問題におけるk近傍法の予測値の数式:
回帰問題では、新しいデータ点 $x$の予測値 $\hat{y}$ は、$k$ 個の近傍のターゲット値の平均で決定されます。これを数式で表すと以下のようになります。
$$\hat{y} = \frac{1}{k} \sum_{i=1}^{k} y_i$$
項目 | 内容 |
---|---|
予測値の決定方法 | 近傍のターゲット値の「平均」による予測値の決定 |
距離計算方法 | ユークリッド距離、マンハッタン距離 |
適用例 | 住宅の広さや築年数、場所などから価格を予測 |
利点 | シンプルで柔軟性があり、非線形データにも対応可能 |
共通項目
項目 | 内容 |
---|---|
強み | 特定の仮定不要で、非線形データにも適応しやすい |
課題 | 計算量が多く、大規模データセットや高次元データでは効率的な処理が必要 |
KNN回帰の例:
例えば、家の広さと価格の関係を予測したいとします。過去のデータから、家の広さと価格の関係を表すデータセットを作成し、KNN回帰モデルを学習させます。
新しい家の広さが与えられたとき、KNN回帰モデルは、その広さに最も近いk個の家の価格の平均を計算し、その家の価格を予測します。
k近傍法の実装(分類モデル)
データの読み込みと前処理:
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# データの読み込み
df = pd.read_csv('titanic.csv')
# 必要な特徴量の選択と欠損値の処理
features = ['Pclass', 'Age', 'SibSp', 'Parch', 'Fare']
df = df[features + ['Survived']].dropna()
# 特徴量とターゲットの分離
X = df[features]
y = df['Survived']
# データの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
特徴量のスケーリング:
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
モデルの訓練と評価:
from sklearn.neighbors import KNeighborsClassifier # 分類モデル
from sklearn.metrics import accuracy_score
# モデルの定義(k=5)
knn = KNeighborsClassifier(n_neighbors=5)
# モデルの訓練
knn.fit(X_train_scaled, y_train)
# 予測
y_pred = knn.predict(X_test_scaled)
# 精度の評価
accuracy = accuracy_score(y_test, y_pred)
print(f'Accuracy: {accuracy:.2f}')
Accuracy: 0.63
データの分布、特徴量の関係、モデルの予測結果の可視化:
import seaborn as sns
import matplotlib.pyplot as plt
# 可視化
plt.figure(figsize=(12, 6))
# 特徴量の分布
plt.subplot(1, 2, 1)
sns.histplot(df['Age'], bins=30, kde=True)
plt.title('Age Distribution')
plt.xlabel('Age')
plt.ylabel('Frequency')
# 生存者の割合
plt.subplot(1, 2, 2)
sns.countplot(x='Survived', data=df)
plt.title('Survival Count')
plt.xlabel('Survived (0 = No, 1 = Yes)')
plt.ylabel('Count')
plt.tight_layout()
plt.show()
# 予測結果の可視化
plt.figure(figsize=(8, 6))
sns.scatterplot(x=y_test, y=y_pred, alpha=0.6)
plt.title('True vs Predicted Survival')
plt.xlabel('True Survival (0 = No, 1 = Yes)')
plt.ylabel('Predicted Survival (0 = No, 1 = Yes)')
plt.axhline(0.5, color='red', linestyle='--') # 分類の境界線
plt.xlim(-0.1, 1.1)
plt.ylim(-0.1, 1.1)
plt.grid()
plt.show()
kの最適値の選定:
import matplotlib.pyplot as plt
# kの値を変えて精度を記録
k_values = range(1, 21)
accuracies = []
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
knn.fit(X_train_scaled, y_train)
y_pred = knn.predict(X_test_scaled)
accuracies.append(accuracy_score(y_test, y_pred))
# グラフ描画
plt.plot(k_values, accuracies)
plt.xlabel('Number of Neighbors (k)')
plt.ylabel('Accuracy')
plt.title('k-NN Vaying number of neighbors')
plt.show()
このグラフを見ることで、テストデータに対する精度が最も高くなるようなkの値を見つけることができます。例えば、グラフで精度が最も高くなっているkの値を採用することで、より良い予測性能を持つk-NNモデルを構築できます。
最適なkの値の取得:
# 最も高い精度とそのインデックスを取得
best_accuracy = max(accuracies)
best_k_index = accuracies.index(best_accuracy)
# 最適なkの値を取得
best_k = k_values[best_k_index]
print(f"最適なkの値: {best_k}")
最適なkの値: 14
より良い予測性能を持つk-NNモデルの構築:
best_accuracy = max(accuracies)
best_k_index = accuracies.index(best_accuracy)
# 最適なkの値を取得
best_k = k_values[best_k_index]
print(f"最適なkの値: {best_k}")
# 最適なkの値でモデルを再学習
knn = KNeighborsClassifier(n_neighbors=best_k)
knn.fit(X_train_scaled, y_train)
# テストデータで予測
y_pred = knn.predict(X_test_scaled)
# 精度を計算
accuracy = accuracy_score(y_test, y_pred)
print(f"最適なkを用いたモデルの精度: {accuracy:.2f}")
最適なkの値: 14
最適なkを用いたモデルの精度: 0.69
この方法は、グラフから最適なkの値を視覚的に判断しているため、必ずしも真に最適なkの値とは限りません。より厳密に最適なkの値を求めるには、交差検定などの手法を用いる必要があります。
交差検証を用いて、より厳密に最適なkの値を求め、k-NNモデルを再学習する
from sklearn.model_selection import KFold, cross_val_score
n_splits = 5 # 5分割交差検定
kf = KFold(n_splits=n_splits, shuffle=True, random_state=42) # データをシャッフルして分割
# kの値を変えて交差検定を行う
k_values = range(1, 21)
cv_scores = []
for k in k_values:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X_train_scaled, y_train, cv=kf)
cv_scores.append(scores.mean())
# 最も高い平均精度とそのインデックスを取得
best_cv_score = max(cv_scores)
best_k_index = cv_scores.index(best_cv_score)
# 最適なkの値を取得
best_k = k_values[best_k_index]
print(f"交差検定による最適なkの値: {best_k}")
交差検証による最適なkの値: 20
最適なkの値でモデルを再学習:
knn = KNeighborsClassifier(n_neighbors=best_k)
knn.fit(X_train_scaled, y_train)
# テストデータで予測
y_pred = knn.predict(X_test_scaled)
# 精度を計算
accuracy = accuracy_score(y_test, y_pred)
print(f"交差検証で最適化されたkを用いたモデルの精度: {accuracy:.2f}")
交差検証で最適化されたkを用いたモデルの精度: 0.69
結局交差検証で最適化されたkを用いたモデルの精度と同じではありましたがグラフで確認するとk=14の位置とk=20の位置のAccuracyはほぼ同じであるということがわかります。
KNN回帰の実装
KNN回帰とは
KNN回帰は未知のデータの値を、そのデータに最も近いk個の既知のデータの値の平均(または中央値、最頻値など)で予測する手法です。
- 新しいデータ点が与えられます。
- そのデータ点に最も近いk個のデータ点(k近傍)を探します。
- k近傍のデータ点の目的変数の値の平均を計算します。
- その平均値を、新しいデータ点の予測値とします。
KNN回帰は、未知のデータの値を、そのデータに最も近いk個の既知のデータの値の平均で予測する回帰手法です。KNN分類とは異なり、連続値を予測する点が特徴です。
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import fetch_california_housing
import matplotlib.pyplot as plt
import pandas as pd
# データの読み込み
data = fetch_california_housing()
# 説明変数と目的変数の設定
df = pd.DataFrame(data.data, columns=data.feature_names) # Pandas DataFrameに変換
X = df.drop("MedInc", axis=1) # MedIncを目的変数とする
y = data.target # 目的変数
# データを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# KNN回帰モデルの作成
knn_reg = KNeighborsRegressor(n_neighbors=5)
# モデルの学習
knn_reg.fit(X_train, y_train)
# テストデータで予測
y_pred = knn_reg.predict(X_test)
# 評価指標の計算
mse = mean_squared_error(y_test, y_pred)
mae = mean_absolute_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print(f"平均二乗誤差 (MSE): {mse:.2f}")
print(f"平均絶対誤差 (MAE): {mae:.2f}")
print(f"R2スコア: {r2:.2f}")
# 予測値と真の値をプロット
plt.scatter(y_test, y_pred)
plt.xlabel("True Values")
plt.ylabel("Predicted Values")
plt.title("KNN Regression: True vs Predicted")
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
plt.show()
平均二乗誤差 (MSE): 0.54
平均絶対誤差 (MAE): 0.51
R2スコア: 0.59
散布図の見方:
散布図全体を見て、点がy=xの直線に近い位置に多く存在するため、KNN回帰モデルの予測精度は比較的高いと評価できます。ただし、特に真の値が大きい範囲での予測値のばらつきが大きいことから、モデルの改善の余地があることも示唆されています。特に、真の値が4や5の範囲での予測精度を向上させることが課題となるでしょう。
ハイパーパラメータの改善(真の値が4や5の範囲)
from sklearn.model_selection import GridSearchCV
# 真の値が4や5の範囲のデータをフィルタリング
mask = (y >= 4) # 4以上のデータを選択
X_filtered = X[mask]
y_filtered = y[mask]
# データを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X_filtered, y_filtered, test_size=0.2, random_state=42)
# 標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# KNN回帰モデルの作成
knn_reg = KNeighborsRegressor()
# ハイパーパラメータのグリッドサーチ
param_grid = {'n_neighbors': range(1, 21)} # kの範囲を1から20まで
grid_search = GridSearchCV(knn_reg, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 最適なkの取得
best_k = grid_search.best_params_['n_neighbors']
print(f'最適なk: {best_k}')
最適なk: 19
全体のモデルのハイパーパラメータの改善:
# データを訓練データとテストデータに分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 標準化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)
# KNN回帰モデルの作成
knn_reg = KNeighborsRegressor()
# ハイパーパラメータのグリッドサーチ
param_grid = {'n_neighbors': range(1, 21)} # kの範囲を1から20まで
grid_search = GridSearchCV(knn_reg, param_grid, cv=5)
grid_search.fit(X_train, y_train)
# 最適なkの取得
best_k = grid_search.best_params_['n_neighbors']
print(f'最適なk: {best_k}')
最適なk: 8
アンサンブル学習
それぞれのk値で学習したモデルの予測を平均することで最終的な予測を行います。
# k=19のモデル
knn_19 = KNeighborsRegressor(n_neighbors=19)
knn_19.fit(X_train, y_train)
# k=8のモデル
knn_8 = KNeighborsRegressor(n_neighbors=4)
knn_8.fit(X_train, y_train)
# それぞれのモデルで予測
y_pred_19 = knn_19.predict(X_test)
y_pred_8 = knn_8.predict(X_test)
# アンサンブル予測(平均)
y_pred_ensemble = (y_pred_19 + y_pred_8) / 2
# 評価指標の計算
mse = mean_squared_error(y_test, y_pred_ensemble)
mae = mean_absolute_error(y_test, y_pred_ensemble)
r2 = r2_score(y_test, y_pred_ensemble)
print(f"アンサンブルモデルの評価:")
print(f"平均二乗誤差 (MSE): {mse:.2f}")
print(f"平均絶対誤差 (MAE): {mae:.2f}")
print(f"R2スコア: {r2:.2f}")
# 予測値と真の値をプロット
plt.scatter(y_test, y_pred_ensemble)
plt.xlabel("True Values")
plt.ylabel("Predicted Values")
plt.title("KNN Regression: True vs Predicted (Ensemble)")
plt.plot([y_test.min(), y_test.max()], [y_test.min(), y_test.max()], 'k--', lw=2)
plt.show()
アンサンブルモデルの評価:
平均二乗誤差 (MSE): 0.51
平均絶対誤差 (MAE): 0.50
R2スコア: 0.61
評価指標の値を比較すると、アンサンブルモデルの方が全体的に良い性能を示しています。
アンサンブルモデルは、元のモデルに比べてMSE、MAEが小さく、R²スコアが高いため、全体的に予測精度が向上しています。これは、複数のモデルの予測を組み合わせることで、個々のモデルの弱点を補い、よりロバストな予測が可能になったことを示しています。
回帰における評価指標の確認の仕方は以下の記事を参考にしてください。
ナイーブベイズ (Naive Bayes)
ナイーブベイズは、ベイズの定理に基づいた確率的な分類アルゴリズムであり、特徴量間の独立性を仮定します。このシンプルな仮定にも関わらず、テキスト分類など多くの実用的な場面で高い性能を発揮します。
メリット | デメリット |
---|---|
計算速度が速い | 特徴量の独立性の仮定が現実的でない場合が多い |
少ないデータでも高い性能 | 連続値の特徴量の扱いに注意が必要 |
テキストデータのような高次元データに適している |
ベイズの定理
ベイズの定理は、事象 $B_i$ が起こる確率(事後確率)を、条件 $A$ のもとでどのように求めるかを示す重要な法則です。以下のように表されます。
クラス$B_i$に対するデータポイント$x$の事後確率$P(B_i \mid A)$は以下で計算されます。
$$P(B_i \mid A) = \frac{P(A \cap B_i)}{P(A)} \quad$$
- $P(B_i \mid A)$:条件付き確率。条件 $A$ のもとで事象 $B_i$ が起こる確率です。
- $P(A \cap B_i)$ : $A$ と $B_i$ の両方が同時に起こる確率です。
- $P(A)$ : 条件 $A$ が起こる全体の確率です。
尤度とベイズの定理:
尤度(Likelihood)は、あるモデルのパラメータが特定のデータを生成する確率を表します。ベイズの定理を用いることで、データ $A$ が観測されたときに、パラメータ $B_i$ が尤もらしいかを判断できます。
この文脈では、尤度は次のように考えられます。
$$P(B_i \mid A) = \frac{P(A \cap B_i)}{P(A)} = \frac{P(B_i) P(A \mid B_i)}{P(A)} \quad$$
- $P(A \mid B_i)$ : 尤度。事象 $B_i$ が真であると仮定したとき、データ $A$ が観測される確率です。この値が高いほど、$B_i$ がデータ $A$ に対して「どれだけ尤もらしいか」を示しています。
- $P(B_i)$ : 事前確率。事象 $B_i$ の事前の信念や知識です。
ベイズの定理の利用場面:
ベイズの定理は、条件付き確率を通じて事象の尤度を考慮する強力な手法です。尤度は、特定のパラメータがデータをどれだけよく説明するかを定量化し、ベイズの定理を用いることで、より正確な予測や意思決定を行うための基盤となります。このアプローチは、特に不確実性の高い状況での判断に有用です。
項目 | 説明 |
---|---|
予測 | 事前に持っている情報(事前確率)と観測されたデータを統合し、事後確率を計算することで、新しいデータに基づいた予測を行う。 |
学習 | モデルが新しいデータを観測することで、尤度を最大化し、事後確率を更新していく。これにより、データに柔軟に適応する。 |
ナイーブベイズの仮定
特徴量が独立であると仮定すると、条件付き確率$P(B_i \mid A)$は各特徴量の条件付き確率の積で表せます。
$$P(A \mid B_i) = \prod_{i=1}^{n} P(A_i \mid B_i)$$
クラスの予測
最大事後確率を持つクラスを予測クラスとします。
$$\hat{B} = \arg \max_{B_i} P(B_i \mid A)$$
ナイーブベイズの実装
スパムメール判定のデータセットを使ってナイーブベイズの実装を行います。
データの読み込みと前処理:
df = pd.read_csv('spam.csv', encoding='latin-1')
print(df.head()) # 最初の5行を表示
print(df.columns) # 列名を表示
出力:
Unnamed: 0 label text \
0 605 ham Subject: enron methanol ; meter # : 988291\r\n...
1 2349 ham Subject: hpl nom for january 9 , 2001\r\n( see...
2 3624 ham Subject: neon retreat\r\nho ho ho , we ' re ar...
3 4685 spam Subject: photoshop , windows , office . cheap ...
4 2030 ham Subject: re : indian springs\r\nthis deal is t...
label_num
0 0
1 0
2 0
3 1
4 0
Index(['Unnamed: 0', 'label', 'text', 'label_num'], dtype='object')
import pandas as pd
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.model_selection import train_test_split
# データの読み込み
df = pd.read_csv('spam.csv', encoding='latin-1')[['label', 'text']] # 特定の列をを選択
df.columns = ['label', 'message'] # textをmessageに変更
# ラベルの数値化
df['label'] = df['label'].map({'ham': 0, 'spam': 1})
# 特徴量の抽出(Bag-of-wordsモデル)
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(df['message'])
y = df['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 結果を表示
print("特徴量名:", vectorizer.get_feature_names_out())
print("ベクトル表現:\n", X.toarray())
出力:
特徴量名: ['00' '000' '0000' ... 'zzocb' 'zzso' 'zzsyt']
ベクトル表現:
[[1 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
...
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]
[0 0 0 ... 0 0 0]]
df[‘message’] は、元のスパムメールデータセットのメッセージ本文そのものを表示しています。
一方、vectorizer.get_feature_names_out() は、CountVectorizerによってメッセージ本文から抽出された単語(特徴量)のリストを表示しています。
モデルの訓練と評価:
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report
from sklearn.metrics import precision_score, recall_score, f1_score
# モデルの定義
nb = MultinomialNB()
# モデルの訓練
nb.fit(X_train, y_train)
# 予測
y_pred = nb.predict(X_test)
# 精度の評価
print(classification_report(y_test, y_pred))
# 混同行列from sklearn.metrics import confusion_matrixcm = confusion_matrix(y_test, y_pred)print("Confusion Matrix:\n", cm)
# 精度、適合率、再現率、F1スコア
accuracy = accuracy_score(y_test, y_pred)
precision = precision_score(y_test, y_pred)
recall = recall_score(y_test, y_pred)
f1 = f1_score(y_test, y_pred)
print("Accuracy:", accuracy)
print("Precision:", precision)
print("Recall:", recall)
print("F1-score:", f1)
出力:
precision recall f1-score support
0 0.99 0.99 0.99 742
1 0.96 0.96 0.96 293
accuracy 0.98 1035
macro avg 0.97 0.97 0.97 1035
weighted avg 0.98 0.98 0.98 1035
Confusion Matrix:
[[731 11]
[ 11 282]]
Accuracy: 0.978743961352657
Precision: 0.962457337883959
Recall: 0.962457337883959
F1-score: 0.962457337883959
ナイーブベイズにおける精度改善:
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.model_selection import train_test_split
from sklearn.naive_bayes import MultinomialNB
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix, precision_score, recall_score, f1_score
# データの読み込み
df = pd.read_csv('spam.csv', encoding='latin-1')[['label', 'text']]
df_copy = df.copy()
df_copy.columns = ['label', 'message']
df_copy['label'] = df_copy['label'].map({'ham': 0, 'spam': 1})
# ストップワードと句読点を定義
stop_words = ['the', 'a', 'an', 'is', 'are', 'was', 'were', 'be', 'been', 'being', ',', '.', '!', '?', '"', "'"]
# TF-IDFベクトル化
vectorizer = TfidfVectorizer(stop_words=stop_words, ngram_range=(1, 2)) # 1-gramと2-gramを使用
X = vectorizer.fit_transform(df_copy['message'])
y = df_copy['label']
# データ分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# モデルの定義
nb = MultinomialNB(alpha=0.1) # alphaを調整
# モデルの訓練
nb.fit(X_train, y_train)
# 予測
y_pred = nb.predict(X_test)
# 精度の評価
print("Accuracy:", accuracy_score(y_test, y_pred))
print(classification_report(y_test, y_pred))
print("Confusion Matrix:\n", confusion_matrix(y_test, y_pred))
print("Precision:", precision_score(y_test, y_pred))
print("Recall:", recall_score(y_test, y_pred))
print("F1-score:", f1_score(y_test, y_pred))
Accuracy: 0.9816425120772947
precision recall f1-score support
0 0.99 0.99 0.99 742
1 0.97 0.97 0.97 293
accuracy 0.98 1035
macro avg 0.98 0.98 0.98 1035
weighted avg 0.98 0.98 0.98 1035
Confusion Matrix:
[[733 9]
[ 10 283]]
Precision: 0.9691780821917808
Recall: 0.9658703071672355
F1-score: 0.9675213675213675
無事精度が改善しました。
工夫した理由:
項目 | 説明 | 期待される効果 |
---|---|---|
TF-IDFベクトル化 | 単語の出現頻度だけでなく、文書全体における単語の重要度も考慮し、効果的な特徴量を抽出する。 | より精度の高い特徴量を抽出できるため、モデルの精度が向上する可能性がある。 |
n-gram | 単語だけでなく、2語句(bigram)も特徴量として使用することで、単語の順序や文脈を考慮する。 | 文脈情報が追加され、精度が向上する可能性がある。 |
ストップワードと句読点の追加 | ストップワードや句読点を除去して、ノイズを削減する。 | ノイズが削減され、モデルの学習効率が向上する可能性がある。 |
ハイパーパラメータの調整 | MultinomialNBのalphaパラメータを調整することで、モデルの性能を最適化する。 | 適切なパラメータ調整により、モデルの性能が向上し、精度が向上する可能性がある。 |
学習の狙い
今回のブログでは、k近傍法(k-Nearest Neighbors, k-NN)、k-NN回帰、そしてナイーブベイズという、分類と回帰の両方で利用できる基本的な教師あり学習アルゴリズムについて学びました。それぞれの手法には独自の特徴と利点があり、問題の特性やデータの分布に応じて使い分けが重要です。
- k近傍法は、距離に基づいてラベルを決定するシンプルな手法で、解釈しやすく、特に少量データでの分類に適しています。
- k-NN回帰は分類と同様に距離を利用して値を予測しますが、回帰タスクにおける近隣データの影響の捉え方が重要なポイントです。
- ナイーブベイズは確率に基づいたアプローチで、特に特徴量が多くても計算が効率的に行えるため、テキスト分類やスパムフィルタリングなどに活用されています。
次回予告
次回の中編ブログでは、さらに強力な教師あり学習アルゴリズムである決定木とランダムフォレストについて学びます。決定木ではデータの分割による予測の解釈や可視化が可能で、シンプルながら非常に有用な手法です。そして、ランダムフォレストは複数の決定木を組み合わせることで予測精度を向上させ、過学習を抑制する強力なアンサンブル手法です。
次回もぜひお楽しみに!
コメント