Python3エンジニア認定データ分析試験 第6章 scikit-learn 予想問題と解説
Python3エンジニア認定データ分析試験「第6章 scikit-learn」の予想問題を14問収録しています。各問を解説つきで掲載し、全問は演習画面で解けます。出題は公式シラバスの範囲内です。
この章の要点
推定器のfitとpredict、変換器とパイプライン、モデル評価とパラメータ探索、RandomForestClassifierの主なパラメータ、ColumnTransformerの使い方などを扱う分野です。全14問(基礎4問・標準7問・応用3問)を収録しています。
- 推定器のfitとpredict
- 変換器とパイプライン
- モデル評価とパラメータ探索
- RandomForestClassifierの主なパラメータ
- ColumnTransformerの使い方
情報源と編集区分
公式範囲を確認し、問題数・難易度・確認点は当サイトが集計・編集。
試験概要(公式)確認しておきたいポイント
当サイトの作問時に観察した、取り違えやすい論点です(公式の統計ではありません)。
- 推定器と変換器の違い。組み込みの機械学習アルゴリズムやモデルが推定器で、fit でデータに当てはめる。変換器も同じ API に従い BaseEstimator を継承するが、predict を持たず、変換後のサンプル行列 X を返す transform を持つ。StandardScaler().fit(X).transform(X) は各列で平均を引いて標準偏差で割る標準化を行う。
- fit に渡す X と y の形。サンプル行列 X は通常 (n_samples, n_features) でサンプルが行、特徴量が列である。目的変数 y は通常1次元配列で、教師なし学習の推定器では y を指定しなくてよい。
- Pipeline の利点。変換器と推定器を1つのオブジェクトにまとめ、通常の推定器と同じ API で fit と predict が使え、データリークを防げる。精度が必ず上がるとは書かれていない。
- cross_validate の既定の分割数。例では result['test_score'] が5つの値を持つ配列になり、既定で5分割の交差検証を行う。RandomizedSearchCV はパラメータ空間をランダムに探索し、最良の組み合わせは best_params_ で得られる。探索はパイプラインに対して行うのがほぼ常に望ましい。
- RandomForestClassifier の既定値の取り違え。n_estimators は森の木の数で既定値は 100(バージョン 0.22 で 10 から変更)、criterion の既定は 'gini'、bootstrap の既定は True である。各木の最大の深さは max_depth、分割ごとに考慮する特徴量の数は max_features が決める。
- max_features と oob_score の条件。max_features が 'sqrt' のときは特徴量数の平方根の個数を最良の分割の探索で考慮する。oob_score はアウトオブバッグ標本で汎化性能を推定する指定で、bootstrap=True のときだけ使える。
- ColumnTransformer の remainder の既定。remainder の既定値は 'drop' で、transformers に指定しなかった列は出力から捨てられる。残したいときは remainder='passthrough' にすると変換されずに連結される。ColumnTransformer は列ごとに別々の変換器を適用し、各変換器が作った特徴量を連結して1つの特徴空間にする。
この章に関連する比較記事
混同しやすい2つの概念を並べて整理した記事です。
よくある質問
Q第6章 scikit-learnは何問収録されていますか?
現在14問を収録しています。内訳は基礎4問・標準7問・応用3問です。
Q第6章 scikit-learnの頻出論点は何ですか?
推定器のfitとpredict、変換器とパイプライン、モデル評価とパラメータ探索、RandomForestClassifierの主なパラメータ、ColumnTransformerの使い方などが出題対象です(当サイト収録問題に基づく編集部集計)。
Q間違えた問題はどう復習すればいいですか?
誤答した選択肢のどこがずれていたかを解説で確認し、関連用語がある場合は用語集で定義に戻ってから再演習することをおすすめします。
scikit-learn の公式ドキュメントで、組み込みの機械学習アルゴリズムやモデルを指す呼び名はどれか。
答えと解説を見る
正解は推定器(estimator)である。公式ドキュメントは、組み込みの機械学習アルゴリズムやモデルを推定器と呼び、各推定器は fit メソッドでデータに当てはめると説明している。変換器(transformer)も推定器と同じ API に従い BaseEstimator を継承するが、predict を持たず transform で変換後のサンプル行列 X を返す前処理の部品であり、モデルの総称ではない。評価器や探索器は、公式がモデルの総称として示す語ではない。なお、当てはめ済みの推定器は predict で新しいデータの目的値を予測できる。
scikit-learn 公式ドキュメント「Getting Started」
scikit-learn で fit(X, y) に渡すサンプル行列 X の形として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は (n_samples, n_features) で、サンプルが行、特徴量が列という形である。公式ドキュメントは、fit に渡すサンプル行列 X の大きさを通常 (n_samples, n_features) と説明している。一方、目的変数 y は通常1次元配列で、i 番目の要素が X の i 行目の目的値になるため、(n_samples,) の1次元配列は X ではなく y の形である。行と列を入れ替えた形や、クラスを行にとる形は、公式の説明にない。X と y は通常 NumPy 配列かそれと同等の配列風のデータ型を想定する。
scikit-learn 公式ドキュメント「Getting Started」
教師なし学習の推定器を fit するとき、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、目的変数 y を指定しなくてよいという記述である。公式ドキュメントは、fit が通常サンプル行列 X と目的変数 y を受け取る一方、教師なし学習では y を指定しなくてよいと説明している。整数のラベルは分類での y の例であり、教師なし学習の条件ではない。X は fit に渡す基本の入力で、X を渡さず y だけを渡す形は説明にない。学習は教師なしでも fit で行い、predict は当てはめ済みの推定器で新しいデータの目的値を予測する操作である。
scikit-learn 公式ドキュメント「Getting Started」
変換器(transformer)について、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、predict を持たず、変換後のサンプル行列 X を返す transform メソッドを持つという記述である。公式ドキュメントは、前処理器や変換器も推定器と同じ API に従い、いずれも BaseEstimator を継承すると説明している。例えば StandardScaler().fit(X).transform(X) のように、fit したあとで transform を呼ぶ。予測は predict を持つ予測器の役割で、変換器は目的値を予測せず、入力を変換した X を返す。
scikit-learn 公式ドキュメント「Getting Started」
X = [[0, 15], [1, -10]] に対して StandardScaler().fit(X).transform(X) を実行したときの結果として、公式ドキュメントの例に合っているものはどれか。
答えと解説を見る
正解は array([[-1., 1.], [1., -1.]]) である。公式ドキュメントは、X=[[0, 15], [1, -10]] に StandardScaler().fit(X).transform(X) を実行したこの例を示している。各列で平均を引いて標準偏差で割る標準化を行うため、第1列の 0 と 1 は -1 と 1、第2列の 15 と -10 は 1 と -1 になる。入力と同じ値が並ぶ結果は変換されていない場合の結果であり、0 と 1 だけの配列や符号がそろった配列は、列ごとの標準化の結果と合わない。
scikit-learn 公式ドキュメント「Getting Started」
scikit-learn の Pipeline を使う利点として、公式ドキュメントが挙げているものはどれか。
答えと解説を見る
正解は、データリークを防げるという点である。公式ドキュメントは、変換器と推定器を Pipeline で1つのオブジェクトにまとめると、通常の推定器と同じ API で fit と predict が使え、テストデータの情報が学習データに漏れるデータリークを防げると説明している。精度が必ず上がるとは書かれていない。また、パイプライン全体が推定器と同じ API を持つという説明であり、predict と transform の区別が不要になるわけではなく、探索が不要になるとも書かれていない。
scikit-learn 公式ドキュメント「Getting Started」
scikit-learn の cross_validate について、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、既定で5分割の交差検証を行うという記述である。公式ドキュメントの例では、make_regression(n_samples=1000, random_state=0) のデータで LinearRegression を評価した結果の result['test_score'] が array([1., 1., 1., 1., 1.]) と5つの値を持つ配列になる。データが簡単なため R2 スコアが高い。1回だけ学習用とテスト用に分けるのは train_test_split の役割である。パラメータの探索は RandomizedSearchCV のような別の道具が担う。
scikit-learn 公式ドキュメント「Getting Started」
RandomizedSearchCV に関する記述として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、パラメータ空間をランダムに探索し、最良の組み合わせは best_params_ で得られるという記述である。公式ドキュメントは、探索が終わると最良のパラメータで当てはめ済みの推定器として振る舞うと説明している。実際には単一の推定器ではなくパイプラインに対して探索するのがほぼ常に望ましく、データ全体を先に前処理すると、テストデータの情報が学習データに漏れて汎化性能を過大に見積もる。探索の対象になるのは n_estimators や max_depth のようなハイパーパラメータである。
scikit-learn 公式ドキュメント「Getting Started」
RandomForestClassifier の n_estimators が表すものはどれか。
答えと解説を見る
正解は、森の木の数である。公式ドキュメントは n_estimators を the number of trees in the forest と説明し、既定値は 100 である。バージョン 0.22 で既定値が 10 から 100 に変わった。各木の最大の深さは max_depth、分割ごとに考慮する特徴量の数は max_features が決める。交差検証の分割数は推定器のパラメータではなく、cross_validate など評価の道具側の設定である。
scikit-learn 公式ドキュメント RandomForestClassifier(https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)
RandomForestClassifier の既定の設定として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、criterion が 'gini'、n_estimators が 100 という組である。公式ドキュメントのシグネチャでは n_estimators=100、criterion='gini'、bootstrap=True、oob_score=False が既定値になっている。n_estimators の既定値 10 は、バージョン 0.22 より前の値であり、現行の記載とは異なる。entropy と log_loss は選べる値だが既定ではない。bootstrap の既定は True、oob_score の既定は False である。
scikit-learn 公式ドキュメント RandomForestClassifier(https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)
RandomForestClassifier の max_features の既定値 'sqrt' の意味として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、最良の分割を探すときに、特徴量数の平方根の個数の特徴量を考慮するという意味である。公式ドキュメントは max_features が 'sqrt' のとき max_features=sqrt(n_features) になると述べている。'log2' なら log2(n_features)、None なら全特徴量を使う。バージョン 1.1 で既定値が 'auto' から 'sqrt' に変わった。木の深さは max_depth、木の本数は n_estimators の担当である。
scikit-learn 公式ドキュメント RandomForestClassifier(https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)
RandomForestClassifier で oob_score=True を使うときの条件として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、bootstrap=True のときだけ使えるという条件である。公式ドキュメントは、oob_score がアウトオブバッグ標本で汎化性能を推定する指定であり、既定の指標は accuracy_score で、bootstrap=True のときだけ利用できると説明している。bootstrap=False では各木がデータセット全体で作られ、木ごとに使われなかった標本が生じないため、アウトオブバッグの推定が成り立たない。木の本数や class_weight は条件に含まれない。
scikit-learn 公式ドキュメント RandomForestClassifier(https://scikit-learn.org/stable/modules/generated/sklearn.ensemble.RandomForestClassifier.html)
ColumnTransformer の説明として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、列または列の部分集合ごとに別々の変換器を適用し、各変換器が作った特徴量を連結して1つの特徴空間にするという説明である。公式ドキュメントは、配列や pandas の DataFrame の列を対象にすると述べている。数値の列には StandardScaler、別の列には別の変換器、というように特徴量ごとに変換を変えたい場面で使う。ColumnTransformer 自体は変換器であり、予測を返す predict を持つ道具ではない。
scikit-learn 公式ドキュメント ColumnTransformer(https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html)
ColumnTransformer の remainder の既定の挙動として、公式ドキュメントの記載に合っているものはどれか。
答えと解説を見る
正解は、transformers に指定しなかった列が出力から捨てられるという挙動である。公式ドキュメントは remainder の既定値を 'drop' と示している。指定しなかった列を残したいときは remainder='passthrough' にすると、変換されずに出力へ連結される。remainder に推定器を渡せば、残りの列にその変換器が使われる。passthrough で通した列は、変換器の出力の右側に加わる。なお、列の指定は名前、整数の位置、真偽値の配列、スライス、呼び出し可能な関数などで行える。
scikit-learn 公式ドキュメント ColumnTransformer(https://scikit-learn.org/stable/modules/generated/sklearn.compose.ColumnTransformer.html)