新着記事一覧

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】機械学習ハイパーパラメーターの調整 ランダムサーチ

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

ハイパーパラメーターの調整について

機械学習においてハイパーパラメーターの調整はとても重要ですが、ハイパーパラメーターの種類はたくさんあり、これを手動で毎回変更するのは大変です。

ハイパーパラメーターの範囲を指定して、精度の良いハイパーパラメーターを自動で見つけてもらう方法があります。主な方法としては、グリッドサーチとランダムサーチの2種類があります。

グリッドサーチ:
調整したいハイパーパラメーターの値の候補を明示的に複数指定し、ハイパーパラメーターセットを作成します。モデルの評価を繰り返すことにより、最適なハイパーパラメーターセットが作成されます。値の候補を明示的に指定するため、ハイパーパラメーターの値に文字列や整数、True/Falseといった数学的に連続ではない値をとるハイパーパラメータの探索に向いている一方、多数のハイパーパラメーターをチューニングするのは不向きです。

ランダムサーチ:
ランダムサーチは、ハイパーパラメーターが取りうる値の範囲を指定し、確率で決定されたハイパーパラメーターセットを用いてモデルの評価を行うことを繰り返し、最適なパラメーターを探す手法です。値の範囲は、ハイパーパラメーターの確率関数を指定します。
パラメータの数が多い場合やモデルの学習に時間がかかる場合には、ランダムサーチの方が効率的。

ランダムサーチ

scikit-learn内の乳がんのデータセットを使用し、ランダムサーチにてハイパーパラメーターの調整を行ってみます。
モデルは決定木で実行してみます。

#必要なライブラリのインポート
import scipy.stats
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

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

#X,yにそれぞれ説明変数と目的変数を格納する
X = cancer.data

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

#train_data ,testデータに分割する
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.3, random_state=42)

#ハイパーパラメータの値の候補を設定する
model_param_set_grid = {DecisionTreeClassifier(): {
                                "criterion": ["gini", "entropy"],
                                "max_depth": [None, 10, 20, 30, 40],
                                "min_samples_split": [2, 5, 10],
                                "min_samples_leaf": [1, 2, 4],
                                "random_state":[42]}}

max_score = 0
best_param = None

#ランダムサーチでハイパーパラメーターを検索する
for model, param in model_param_set_grid.items():
    clf =RandomizedSearchCV(model, param)
    clf.fit(train_X, train_y)
    pred_y = clf.predict(test_X)
    score = accuracy_score(test_y, pred_y)
    if max_score < score:
        max_score = score
        best_param = clf.best_params_

print(f"ハイパーパラメーター:{best_param}")
print(f"ベストスコア:{max_score}")
dtc = DecisionTreeClassifier()
dtc.fit(train_X, train_y)
print()
print('調整なし')
print(dtc.score(test_X, test_y))

解説

#必要なライブラリのインポート
import scipy.stats
from sklearn.datasets import load_breast_cancer
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import RandomizedSearchCV
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score

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

#X,yにそれぞれ説明変数と目的変数を格納する
X = cancer.data

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

#train_data ,testデータに分割する
train_X, test_X, train_y, test_y = train_test_split(X, y, test_size = 0.3, random_state=42)

まず必要なライブラリをインポートし、X,yにそれぞれ説明変数、目的変数を格納し、訓練データとテストデータに分けます。

#ハイパーパラメータの値の候補を設定する
model_param_set_grid = {DecisionTreeClassifier(): {
                                "criterion": ["gini", "entropy"],
                                "max_depth": [None, 10, 20, 30, 40],
                                "min_samples_split": [2, 5, 10],
                                "min_samples_leaf": [1, 2, 4],
                                "random_state":[42]}}

max_score = 0
best_param = None

今回は決定木でパラメーター最適化を行ってみます。
まず、"ctiterion"では決定木モデルの分割基準を指定します。一般的に、分割基準としてジニ不純度やエントロピーが使われます。
gini: ジニ不純度は、ノード内のサンプルが異なるクラスに属する確率の重み付き合計。ジニ不純度が低いほど、ノードの純度が高くなる。
entropy: エントロピーは、ノード内のサンプルのクラス分布の不確実性を測定します。エントロピーが低いほど、ノードの純度が高くなります。

max_depth: 決定木の最大の深さを指定します。デフォルトはNone,適切な深さを指定することで過学習を防ぐことができます。

min_sample_split:ノードを分割するために必要な最小サンプル数。

min_samples_leaf:葉ノードに必要な最小サンプル数を指定します。葉ノードがこの値よりも少ないサンプル数を持つ場合、そのノードは分割されません。

"random_state"を設定することにより、再現性を確保できます。任意の整数値を指定します。

#ランダムサーチでハイパーパラメーターを検索する
for model, param in model_param_set_grid.items():
    clf =RandomizedSearchCV(model, param)
    clf.fit(train_X, train_y)
    pred_y = clf.predict(test_X)
    score = accuracy_score(test_y, pred_y)
    if max_score < score:
        max_score = score
        best_param = clf.best_params_

model_param_set_gridにはモデル名とそのハイパーパラメータの候補が設定されていますが、.items()でモデル名をmodelに、パラメーターの候補をparamに格納します。それらをRandomizedSearchCVに入れランダムサーチを実行し、最適なハイパーパラメーターを探索していきます。各モデルに対してランダムサーチを行った後、テストデータを使用して予測を行いスコアを出し、最も精度の高いモデルとパラメーターの組み合わせをbest_paramに格納します。

print(f"ハイパーパラメーター:{best_param}")
print(f"ベストスコア:{max_score}")
dtc = DecisionTreeClassifier()
dtc.fit(train_X, train_y)
print()
print('調整なし')
print(dtc.score(test_X, test_y))

ランダムサーチで探索した最適値と、その最適値を用いたモデルのスコアを表示してみます。
また、ハイパーパラメーターを何も調整しなかった場合のスコアも出してみます。
ランダムサーチで探索したハイパーパラメーターを使用した方が、スコアが高いことがわかります。

  • この記事を書いた人

Haru

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

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