【scikit-learn】入門-3解説【Python】

本ページでは以下のページを要約するとともに、個人的な解説も記載しています。独特な解釈をしている部分があるので、誤りなどの指摘はtwitterまでお願いします。

参考ページ
はじめに — scikit-learn 1.1.2 ドキュメント
https://scikit-learn.org/stable/getting_started.html
閲覧日:2022年10月7日

モデル評価

AIモデルを作成した際に、未知のデータを正確に予測できるとは限りません。しかし、実際にAIモデルを作成した際はどのくらい信用できるのかを評価を行わなかればなりません。
前回のコードにはtrain_test_splitという仕組みを使って、学習データと訓練データに分割する手法が出てきましたが、scikit-learnには他にも様々なツールを提供します。

ここでは、cross_validateを使用して、交差検証(クロスバリデーション)を実際を試してみましょう。
詳細は別のブログ記事で記載予定です。(公式はこちらユーザー ガイド

from  sklearn.datasets  import  make_regression
from  sklearn.linear_model  import  LinearRegression
from  sklearn.model_selection  import  cross_validate
#回帰用のランダムな乱数を生成。1000個のデータを直線上に分布するように生成しています。
X, y = make_regression(n_samples=1000, random_state=0)
lr = LinearRegression()
result = cross_validate(lr, X, y) # デフォルトでは5つのデータに分割を行います。
result['test_score'] # 今回は5つに分割したので、それぞれのパターンでスコアを出力します。
#array([1., 1., 1., 1., 1.]) #出力したランダム値は完全に直線上に並ぶ値なので全て1になっています。

ハイパーパラメータ探索

全てのestimatorには調整可能なパラメータ(多くはハイパーパラメータと表記されています。)があります。AIモデルの汎化能力(未知のデータに対する性能)は、ハイパーパラメータの値に大きく左右されます。例えば、ランダムフォレストでは決定木の数を決めるパラメータや深さを決めるパラメータがあります。これらのパラメータは学習データによって最適な値が変わるため、何を指定したら良いか明確ではありません。

scikit-learnではパラメータの組み合わせを自動的に見つける仕組みを提供しています。今回は、ランダムフォレストのパラメータの組み合わせをRandomizedSearchCVという仕組みを使用して検索する例を紹介します。

from  sklearn.datasets  import  fetch_california_housing
from  sklearn.ensemble  import  RandomForestRegressor
from  sklearn.model_selection  import  RandomizedSearchCV
from  sklearn.model_selection  import  train_test_split
from  scipy.stats  import  randint
#カルフォニアの家賃データセットを読み込みます。
X, y = fetch_california_housing(return_X_y=True)
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# 検索するパラメータの範囲を設定します。 
param_distributions = {'n_estimators': randint(1, 5),
'max_depth': randint(5, 10)}
# ハイパーパラメータ探索用のオブジェクトを設定します。
search = RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0),
n_iter=5,
param_distributions=param_distributions,
random_state=0)
search.fit(X_train, y_train)
RandomizedSearchCV(estimator=RandomForestRegressor(random_state=0), n_iter=5,
param_distributions={'max_depth': ...,
'n_estimators': ...},
random_state=0)
#一番性能の良かったパラメータを表示します。
search.best_params_
#{'max_depth': 9, 'n_estimators': 4}
# 検索に使用したオブジェクトは通常のランダムフォレストの学習済モデルと同様に使用できます。
# with max_depth=9 and n_estimators=4
search.score(X_test, y_test)
#0.73...

ノート:このような使用方法をするとデータリーケージが起こることがあります。データリーケージを防ぐために、多くの場合パイプラインを使用することが多いです。なぜデータリーケージが起こるかを知りたい場合は[こちら](https://scikit-learn.org/stable/getting_started.html#transformers-and-pre-processors:~:text=%E3%81%93%E3%82%8C%E3%81%AF%E3%80%81estimator%20%E3%81%AE%E6%B1%8E%E5%8C%96%E8%83%BD%E5%8A%9B%E3%82%92%E9%81%8E%E5%A4%A7%E8%A9%95%E4%BE%A1%E3%81%99%E3%82%8B%E3%81%93%E3%81%A8%E3%81%AB%E3%81%A4%E3%81%AA%E3%81%8C%E3%82%8A%E3%81%BE%E3%81%99%20%28%E3%81%93%E3%81%AEKaggle%20%E3%81%AE%E6%8A%95%E7%A8%BF)(今後記事にする予定です。)

次のステップ

機械学習についての前処理、パイプライン、検証、ハイパーパラメータ探索などについて説明しました。これら以外の機能をscikit-learnは備えています。
今後解説記事にしていく予定です。