音楽ジャンル推定チャレンジ!

python
スポンサーリンク

このページでは、音楽ジャンル推定チャレンジの回答方法について詳しく説明します。初心者でもわかるように、使用しているライブラリやアルゴリズムについても解説します。

このコンペティションは、SIGNATEが主催する「音楽ジャンル推定チャレンジ」です。詳細はこちらをご覧ください。

コードについては、GitHubをご覧ください。

使用するライブラリ

このプロジェクトでは以下のライブラリを使用します:

  • Pandas: データの読み込みと操作
  • Scikit-learn: データの前処理とモデルの評価
  • XGBoost: モデルのトレーニング
  • Optuna: ハイパーパラメータのチューニング
  • Matplotlib: データの可視化

データの読み込みと前処理

まず、Pandasを使用してデータを読み込みます。次に、Scikit-learnのStandardScalerを使用してデータを正規化します。

import pandas as pd
from sklearn.preprocessing import StandardScaler

# データの読み込み
df = pd.read_csv('data/train.csv')

# 特徴量の正規化
scaler = StandardScaler()
scaled_features = scaler.fit_transform(df.drop('genre', axis=1))

# 正規化されたデータをデータフレームに変換
scaled_df = pd.DataFrame(scaled_features, columns=df.columns[:-1])
scaled_df['genre'] = df['genre'].values

# データの分割
from sklearn.model_selection import train_test_split
X = scaled_df.drop('genre', axis=1)
y = scaled_df['genre']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

モデルのトレーニング

XGBoostを使用してモデルをトレーニングします。Optunaを使用してハイパーパラメータのチューニングを行います。

import xgboost as xgb
import optuna
from sklearn.metrics import f1_score
import numpy as np

# Optunaによるハイパーパラメータのチューニング
def objective(trial):
    # ハイパーパラメータの設定
    param = {
        'objective': 'multi:softprob',  # 多クラス分類問題の設定
        'num_class': 11,  # クラス数の設定
        'eval_metric': 'mlogloss',  # 評価指標の設定
        'learning_rate': trial.suggest_loguniform('learning_rate', 0.01, 0.1),  # 学習率の設定
        'max_depth': trial.suggest_int('max_depth', 3, 10),  # 木の深さの設定
        'subsample': trial.suggest_uniform('subsample', 0.5, 1.0),  # サブサンプルの割合の設定
        'colsample_bytree': trial.suggest_uniform('colsample_bytree', 0.5, 1.0),  # 特徴量のサブサンプルの割合の設定
        'min_child_weight': trial.suggest_int('min_child_weight', 1, 10)  # 子ノードの重みの最小値の設定
    }

    # データのDMatrixへの変換
    dtrain = xgb.DMatrix(X_train, label=y_train)
    dtest = xgb.DMatrix(X_test, label=y_test)
    
    # モデルのトレーニング
    gbm = xgb.train(param, dtrain, num_boost_round=100)
    
    # 予測の実行
    preds = gbm.predict(dtest)
    pred_labels = [np.argmax(line) for line in preds]
    
    # F1スコアの計算
    return f1_score(y_test, pred_labels, average='macro')

# Optunaのスタディの作成
study = optuna.create_study(direction='maximize')
study.optimize(objective, n_trials=100)

# 最適なハイパーパラメータでモデルを再トレーニング
best_params = study.best_params
best_params['objective'] = 'multi:softprob'
best_params['num_class'] = 11
best_params['eval_metric'] = 'mlogloss'

# 最適なパラメータでモデルのトレーニング
gbm = xgb.train(best_params, dtrain, num_boost_round=100)

結果の可視化

Matplotlibを使用して予測結果を可視化します。

import matplotlib.pyplot as plt

# 予測結果の取得
dtest = xgb.DMatrix(X_test)
preds = gbm.predict(dtest)
pred_labels = [np.argmax(line) for line in preds]

# 混同行列の作成
from sklearn.metrics import confusion_matrix
import seaborn as sns

conf_matrix = confusion_matrix(y_test, pred_labels)
plt.figure(figsize=(10, 7))
sns.heatmap(conf_matrix, annot=True, fmt='d', cmap='Blues')
plt.xlabel('予測ラベル')
plt.ylabel('実際のラベル')
plt.title('混同行列')
plt.show()

まとめ

ここでは、音楽ジャンル推定チャレンジの回答方法について説明しました。Pandasを使用したデータの読み込みと前処理、Scikit-learnを使用したデータの正規化、XGBoostを使用したモデルのトレーニング、Optunaを使用したハイパーパラメータのチューニング、そしてMatplotlibを使用した結果の可視化について学びました。これらの手法を組み合わせることで、音楽ジャンルの推定精度を向上させることができます。

コメント