新着記事一覧

IT・プログラミング Python

2024/4/21

【Python】Pythonでの自然言語処理(日本語)

こちらの記事では、自然言語処理についてまとめています。 Contents1 自然言語処理とは?2 自然言語処理の実装 自然言語処理とは? 自然言語とは、日本語や英語のような自然発生的に生まれた言語です。日常的に使用している自然言語について、言葉が持つ意味を解析し処理します。活用事例としては、チャットボット、音声認識AI、文字認識(手書き文字をカメラが認識し文字データへと変換する技術)、検索エンジン、翻訳、感情分析、文章要約などがあります。 文章の意味を機械に理解させるには、単語分割を行う必要があります。手 ...

続きを読む

IT・プログラミング Python

2024/4/8

【Python】統計学的モデル 時系列分析の実装

こちらの記事では、時系列分析の実装についてまとめています。 Contents1 時系列分析とは?2 定常性とは?3 時系列データの分析方法4 SARIMAモデルの実装 時系列分析とは? 時系列分析では、時間経過とともに変化する時系列データを扱います。時系列データの例としては、毎時間の気温、株価の推移等がこれにあたります。売上予測、来店者予測等、ビジネスにおいて重要な分析技術です。 時系列データには以下3種類があります。 1.トレンドデータの長期的な傾向。時間の経過とともに値が上昇・下降している時系列データ ...

続きを読む

IT・プログラミング Python

2024/4/1

【Python】主成分分析の実装

こちらの記事では、主成分分析を実装していきます。 Contents1 主成分分析とは2 主成分分析の手順について 主成分分析とは 主成分分析とは、次元削減を行う時によく使う手法です。例えば、いくつかの特徴量があるデータを2次元データに変換すると、できるだけ情報を保ったまま2軸での描画が可能になり、全てのデータを見やすく示すことができます。 主成分分析の実用例として、製品やサービスのスコアリングや比較(1次元に圧縮)、データの可視化(2,3次元に圧縮)、回帰分析の前処理などが挙げられます。 主成分分析の手順 ...

続きを読む

IT・プログラミング Python

2024/4/1

【Python】カーネル主成分分析の実装

こちらの記事では、カーネル主成分分析の手順についてまとめています。 Contents1 カーネル主成分分析とは2 カーネル主成分分析の実装 カーネル主成分分析とは 回帰分析等、機械学習の多くのアルゴリズムは線形分離できるデータが与えられることを前提としていますが、現実的には線形分離できないデータ、つまり非線形分離する必要があるデータがほとんどです。非線形分離する必要があるデータに対処できるのが、カーネル主成分分析(kernel PCA)です。 カーネル主成分分析ではN×M(データの数×特徴の種類)のデータ ...

続きを読む

IT・プログラミング Python

2024/3/29

【Python】機械学習(教師なし) クラスタリング DBSCANの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング DBSCAN法についてまとめていきます。 Contents1 クラスタリングとは2 DBSCANでの実装 クラスタリングとは データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。 1.階層的クラスタリングデータの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。 2. ...

続きを読む

IT・プログラミング Python

2024/3/28

【Python】機械学習(教師なし) クラスタリング k-meansの実装

こちらの記事では、機械学習(教師なし)の非階層的クラスタリング k-means法についてまとめていきます。 Contents1 クラスタリングとは2 k-means法での実装 クラスタリングとは データをクラスター(塊)に分割する操作のことです。クラスタリングの中でも階層的クラスタリングと、非階層的クラスタリングの2種に分けられています。 1.階層的クラスタリングデータの中から最も似ている組み合わせを探し出して、順番にクラスターにしていく方法です。最終的に全データをまとめるクラスターに行くつけば終了です。 ...

続きを読む

IT・プログラミング Python

2024/3/28

【Python】機械学習のデータ前処理 外れ値の扱いについて

外れ値の処理についてまとめています。 Contents1 外れ値とは?2 外れ値の検知方法について 外れ値とは? 外れ値とは、他のデータと著しく乖離したデータのことを指します。データ内に外れ値が混在していると、分析結果に影響を及ぼしたり、機械学習モデルの学習過程で影響がでてしまい学習が進みにくくなる、などの影響が出てしまいます。 外れ値の検知方法について 外れ値の検知方法について、可視化、LOF(Local Outlier Factor )、Isolation Forestの3つの手法について紹 ...

続きを読む

IT・プログラミング Python

【Python】Optunaでハイパーパラメータを調整してみた

ハイパーパラメータを調整してくれるOptunaというライブラリを使ってみました。こちらのサイトを元に、備忘録としてコードの説明をつけました。(大いに参考にさせて頂きました。ありがとうございます!)

※学習初学者の勉強のアウトプットですので、もしコードや解釈に間違い等あればご指摘頂けますと幸いです。
メモも兼ねて、各コードなるべく詳しく説明をつけるようにしています。

Optunaとは?

そもそもハイパーパラメータとは、機械学習アルゴリズムの挙動を制限するパラメータのことですが、ハイパーパラメータの数はとても多く、マニュアルで調整を行うとかなりの時間を要します。
そこで使用するのがOptunaです。Optunaはハイパーパラメータの最適化を自動で行ってくれるライブラリで、優れた性能を発揮するハイパーパラメータの値を自動的に発見してくれる、とても便利なものです。

Optunaの実装

今回はsklearnの乳がんのデータセットとOptunaでハイパーパラメータを調整してみようと思います。

#必要なモジュールをインポートする
import optuna
import pandas as pd
import sklearn.svm
from sklearn import linear_model
from sklearn import ensemble
from sklearn import datasets
from sklearn import model_selection
from sklearn import metrics

#乳がんのデータセットを取得し、中身を確認する
cancer = datasets.load_breast_cancer()

#Xに特徴量を格納する
X = cancer.data

#yにtargetを格納する
y = cancer.target

# 目的関数の設定
def objective(trial):
    #ハイパーパラメータの集合を定義する
    ##分類モデルの集合
    classifier_name = trial.suggest_categorical("classifier", 
                                                ["LogReg",
                                                 "SVC",
                                                 "RandomForest"
                                                ]
                                               )
    
    ##分類モデルごとのハイパーパラメータの集合
    ###ロジスティック回帰
    if classifier_name == 'LogReg':
        logreg_c = trial.suggest_float("logreg_c",
                                       1e-10, 1e10, 
                                       log=True
                                      )
        classifier_obj = linear_model.LogisticRegression(C=logreg_c)

    ###サポートベクターマシン
    elif classifier_name == "SVC":
        svc_c = trial.suggest_float("svc_c",
                                    1e-10, 1e10,
                                    log=True
                                   )
        classifier_obj = sklearn.svm.SVC(C=svc_c,
                                         gamma="auto")

    ###ランダムフォレスト
    else:
        rf_n_estimators = trial.suggest_int("rf_n_estimators",
                                            10, 1000
                                           )
        rf_max_depth = trial.suggest_int("rf_max_depth", 
                                         2, 50,
                                         log=True
                                        )
        classifier_obj = ensemble.RandomForestClassifier(
            max_depth=rf_max_depth,
            n_estimators=rf_n_estimators
        )

    #評価を行う
    score = model_selection.cross_val_score(classifier_obj,
                                            X,
                                            y,
                                            n_jobs=-1,
                                            cv=10
                                           )
    #結果の平均値
    accuracy = score.mean()
    return accuracy

#目的関数の最適化を実行する
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=100)

# 上のstudyで得られた最高値とパラメータを表示する
print(f"The best value is : \n {study.best_value}")
print(f"The best parameters are : \n {study.best_params}")

解説

#乳がんのデータセットを取得し、中身を確認する
cancer = datasets.load_breast_cancer()

#Xに特徴量を格納する
X = cancer.data

#yにtargetを格納する
y = cancer.target

必要なライブラリをインポートした後、乳がんのデータセットを読み込みます。
cancer.dataで30個の特徴量を全てXに格納、cancer.targetでyにラベルを格納します。念のため中身を確認します。
以下、Xです。格納できていますね。

こちら、yになります。

# 目的関数の設定
def objective(trial):
    #ハイパーパラメータの集合を定義する
    ##分類モデルの集合
    classifier_name = trial.suggest_categorical("classifier", 
                                                ["LogReg",
                                                 "SVC",
                                                 "RandomForest"
                                                ]
                                               )

今回の例では、分類モデルの中で最適なパラメータを探していきます。
カテゴリカルなパラメータとして、ロジスティック回帰/SVC/ランダムフォレストを指定しています。Optunaを使用し、これらの中から最適なパラメータを選択します。カテゴリカルなパラメータを定義する時はtrial.suggest_categorical()メソッドを使用します。

    ##分類モデルごとのハイパーパラメータの集合
    ###ロジスティック回帰
    if classifier_name == 'LogReg':
        logreg_c = trial.suggest_float("logreg_c",
                                       1e-10, 1e10, 
                                       log=True
                                      )
        classifier_obj = linear_model.LogisticRegression(C=logreg_c)

分類モデル ロジスティック回帰の場合のパラメータを定義していきます。
ロジスティック回帰モデルにおいては正則化のパラメータ(C)である"logreg_c"が重要で、今回はこの値の最適値を見つけていきます。
正則化パラメータCを1e-10, 1e10の範囲内で制御し、小さな値から始まり徐々に大きな値に変化させていくようにしています。
log=Tureで指数的なスケールで提案されます。

    ###サポートベクターマシン
    elif classifier_name == "SVC":
        svc_c = trial.suggest_float("svc_c",
                                    1e-10, 1e10,
                                    log=True
                                   )
        classifier_obj = sklearn.svm.SVC(C=svc_c,
                                         gamma="auto")

分類モデル SVMの場合のパラメータを定義していきます。
SVMモデルの正則化のパラメータ(C)である"svc_c"を定義しています。
こちらも、正則化パラメータCを1e-10, 1e10の範囲内で制御し、小さな値から始まり徐々に大きな値に変化させていくようにしています。
log=Tureで指数的なスケールで提案されます。

    ###ランダムフォレスト
    else:
        rf_n_estimators = trial.suggest_int("rf_n_estimators",
                                            10, 1000
                                           )
        rf_max_depth = trial.suggest_int("rf_max_depth", 
                                         2, 50,
                                         log=True
                                        )
        classifier_obj = ensemble.RandomForestClassifier(
            max_depth=rf_max_depth,
            n_estimators=rf_n_estimators
        )

分類モデル ランダムフォレストのパラメータを定義していきます。
"rf_n_estimators"はランダムフォレストの決定木の数を指定するハイパーパラメータです。trial.suggest_int()を使用して、与えられた範囲内で整数値が探索されます。この例では、10から1000までの間で探索されます。
rf_max_depth これは、ランダムフォレストの各決定木の最大深度を指定するハイパーパラメータです。trial.suggest_intを使用して、与えられた範囲内で整数値が探索されます。log=Trueという指定により、対数スケールで値が探索されます。

    #評価を行う
    score = model_selection.cross_val_score(classifier_obj,
                                            X,
                                            y,
                                            n_jobs=-1,
                                            cv=10
                                           )
    #結果の平均値
    accuracy = score.mean()
    return accuracy

model_selection.cross_val_score()関数は、指定された分類器(classifier_obj)とデータ(X,y)に対して、交差検証を実行します。
ここでは、cvパラメータで指定された分割数(ここでは10)でデータが分割され、各分割に対してモデルがトレーニングされ、テストされます。n_jobs=-1は、可能な場合に全てのCPUコアを使用して並列化するためのオプションです。

score.mean()で交差検証で得られたスコアの平均値を計算します。これにより、モデルの平均的な性能を評価できます。
最後にaccuracyを返します。この精度は、交差検証を通じて得られた平均的なモデルの性能を示します。

#目的関数の最適化を実行する
study = optuna.create_study(direction="maximize")
study.optimize(objective, n_trials=100)

# 上のstudyで得られた最高値とパラメータを表示する
print(f"The best value is : \n {study.best_value}")
print(f"The best parameters are : \n {study.best_params}")

optuna.create_study(direction="maximize")は、Optunaの研究を作成します。最適化の方向はとしてmaximizeにて目的関数が最大化することを指定しています。
study.optimize(objective, n_trials=100)は目的関数objectiveを最適化します。ここでは、n_trialsパラメータで指定された数の試行を行います。
今回は100を指定していますので、100回試行されています。

study.best_valueでは、最適化中に見つかった最高値を示します。また、study.best_paramsで最良のパラメータの組み合わせを表示させることができます。以下のようになりました。

  • この記事を書いた人

Haru

会社員。2回目の育休から仕事復帰。
職種は海外営業。
育休の過ごし方、育児、家事、プログラミング勉強について発信しています。

-IT・プログラミング, Python
-, ,