🤖 STEP 6: Scikit-learnのインストールと基本API
Scikit-learnの環境構築と、統一されたAPIの使い方を学びます
📋 このステップで学ぶこと
- 環境構築とインストール
- Estimatorの概念
- fit()、predict()、score()、transform()の役割
- 一貫性のあるAPI設計
- サンプルデータセット(Iris、Digits、Wine)
- 基本的なワークフロー実装
練習問題: 8問
🎯 1. Scikit-learnとは?
Scikit-learn(サイキット・ラーン)は、Pythonで最も人気のある機械学習ライブラリです。シンプルで使いやすいAPIと、豊富なアルゴリズムが特徴で、機械学習を始めるなら必ず使うことになります。
- シンプル:統一されたAPIで、どのアルゴリズムも同じように使える
- 豊富:分類、回帰、クラスタリングなど、ほとんどのアルゴリズムに対応
- 高速:内部でC言語やCythonを使用し、高速動作
- 無料:オープンソース(BSDライセンス)
- ドキュメントが充実:公式ドキュメントが非常に詳しい
📊 Scikit-learnで使えるアルゴリズム
💻 2. 環境構築とインストール
方法1:Google Colab(推奨)
Google Colabを使えば、インストール不要ですぐに始められます!Scikit-learnは最初から入っています。
手順:
- https://colab.research.google.com/ にアクセス
- 「ノートブックを新規作成」をクリック
- すぐにコードが書ける!
方法2:ローカル環境(Anaconda または pip)
✅ インストール確認
このコースでは、Google Colabを使うことを強く推奨します。
理由:
- 環境構築が不要(ブラウザだけでOK)
- GPUが無料で使える
- 必要なライブラリが最初から入っている
- どこからでもアクセスできる
- Googleアカウントがあれば無料で使える
🔧 3. Scikit-learnの基本API
📌 Estimator(推定器)の概念
Scikit-learnでは、すべてのアルゴリズムがEstimator(推定器)と呼ばれるオブジェクトです。
どのアルゴリズムも、同じメソッド(fit、predict、scoreなど)で使えるように設計されています。これがScikit-learnの最大の特徴です。
🎯 基本的な使い方(3ステップ)
📊 主要なメソッド
| メソッド | 説明 |
|---|---|
| fit(X, y) |
学習を行う ・X: 特徴量(2次元配列) ・y: 正解ラベル(1次元配列) ・モデルがデータからパターンを学習する |
| predict(X) |
予測を行う ・X: 特徴量(2次元配列) ・戻り値: 予測結果(1次元配列) ・学習したパターンを使って予測 |
| score(X, y) |
評価を行う ・X: 特徴量(2次元配列) ・y: 正解ラベル(1次元配列) ・戻り値: 精度スコア(0〜1) ・分類:正解率、回帰:R²スコア |
| transform(X) |
変換を行う ・主に前処理で使用 ・例:スケーリング、次元削減 ・戻り値: 変換後のデータ |
| fit_transform(X) |
学習と変換を同時に行う ・fit() + transform()を一度に実行 ・訓練データに対してのみ使用 |
⚠️ データの形状に注意
Scikit-learnでは、Xは2次元配列(サンプル数 × 特徴量数)、yは1次元配列(サンプル数)である必要があります。
📦 4. サンプルデータセットの使い方
Scikit-learnには、学習用のサンプルデータセットが組み込まれています。実際にデータを用意しなくても、すぐに練習できます。
① Iris(アヤメ)データセット
最も有名な機械学習データセットです。3種類のアヤメの花について、4つの特徴量を測定したデータです。
- サンプル数:150件
- 特徴量:4つ(がく片の長さ・幅、花びらの長さ・幅)
- クラス:3種類(Setosa、Versicolor、Virginica)
- 用途:分類問題の練習
② Digits(手書き数字)データセット
手書き数字(0〜9)の画像データです。MNISTの簡易版として、画像分類の練習に最適です。
- サンプル数:1,797件
- 特徴量:64個(8×8ピクセルの画像を1次元化)
- クラス:10種類(0〜9の数字)
- 用途:画像分類の練習
③ Wine(ワイン)データセット
ワインの化学成分から、ワインの種類を分類するデータです。
- サンプル数:178件
- 特徴量:13個(アルコール度数、マグネシウム量など)
- クラス:3種類
- 用途:分類問題の練習
📋 その他の組み込みデータセット
🚀 5. 基本的なワークフロー実装
完全なコード例(分類)
完全なコード例(回帰)
🎨 6. 一貫性のあるAPI設計
どのアルゴリズムも同じ使い方
Scikit-learnの最大の特徴は、どのアルゴリズムも同じ方法で使えることです。アルゴリズムを変えるのは1行だけ!
- 一貫性(Consistency):すべてのオブジェクトが同じインターフェース
- 検査可能(Inspection):学習したパラメータにアクセスできる
- デフォルト設定:ほとんどの場合、デフォルトで十分動作する
- 組み合わせ可能(Composition):パイプラインで組み合わせられる
この設計のおかげで、一度使い方を覚えれば、どのアルゴリズムも同じように使えます。
🔍 7. よくあるエラーと対処法
エラー1:データの形状が間違っている
ValueError: Expected 2D array, got 1D array instead
原因:Xが1次元配列になっている
解決策:2次元配列に変換する
エラー2:fit()せずにpredict()
NotFittedError: This model is not fitted yet.
原因:学習(fit)する前に予測(predict)している
解決策:必ずfit()してからpredict()
エラー3:特徴量の数が違う
ValueError: X has 3 features, but model is expecting 4 features
原因:訓練時とテスト時で特徴量の数が違う
解決策:同じ特徴量を使う
📝 STEP 6 のまとめ
- Scikit-learnは、Pythonで最も人気の機械学習ライブラリ
- Google Colabなら環境構築不要ですぐに始められる
- 基本的な使い方は「作る → 学習 → 予測」の3ステップ
- fit()、predict()、score()が主要なメソッド
- Xは2次元配列、yは1次元配列にする必要がある
- Iris、Digits、Wineなど、組み込みデータセットで練習できる
- どのアルゴリズムも同じ方法で使える(一貫性のあるAPI)
Scikit-learnの最大の特徴は、一貫性のあるAPIです。一度使い方を覚えれば、どのアルゴリズムも同じように使えます。
これから学ぶすべてのアルゴリズムが、fit() → predict()の流れで動作します。
STEP 7では、「機械学習の可視化」について学びます。決定境界、学習曲線、混同行列などを視覚的に理解していきましょう。
📝 練習問題
Scikit-learnの基本
Scikit-learnでモデルを使う際の正しい順序を選んでください。
- A. predict() → fit() → モデル作成
- B. モデル作成 → predict() → fit()
- C. モデル作成 → fit() → predict()
- D. fit() → モデル作成 → predict()
なぜCが正解なのか?
正しい順序は「モデル作成 → fit() → predict()」です。
各ステップの意味:
- モデル作成:アルゴリズムを選んで、モデルの「箱」を作る
- fit():データを使って、モデルに「中身」(パターン)を学習させる
- predict():学習したパターンを使って、新しいデータの予測をする
他の選択肢が間違いの理由:
A, B, D:fit()する前にpredict()することはできません。まだ何も学習していないモデルは予測ができません。「勉強していないのにテストを受ける」ようなものです。fit()せずにpredict()すると「NotFittedError」が発生します。
データの形状
Scikit-learnのfit()メソッドに渡すデータの正しい形を選んでください。
- A. X: 1次元配列、y: 1次元配列
- B. X: 2次元配列、y: 1次元配列
- C. X: 1次元配列、y: 2次元配列
- D. X: 2次元配列、y: 2次元配列
なぜBが正解なのか?
Scikit-learnでは、Xは2次元配列、yは1次元配列である必要があります。
なぜこの形が必要なのか:
- X(特徴量):「サンプル × 特徴量」の表形式データ。各行が1つのサンプル、各列が1つの特徴量を表す
- y(ラベル):各サンプルに対応する1つの正解値。サンプル数だけの1次元配列
他の選択肢が間違いの理由:
A(X: 1次元):Xが1次元だと、複数の特徴量を扱えません。Scikit-learnは「ValueError: Expected 2D array, got 1D array instead」というエラーを出します。
C, D(y: 2次元):通常の分類・回帰では、yは1次元配列です。2次元にする必要はありません(マルチラベル分類など特殊なケースを除く)。
メソッドの役割
次のうち、学習を行うメソッドはどれですか?
- A. predict()
- B. fit()
- C. score()
- D. transform()
なぜBが正解なのか?
fit()が学習を行うメソッドです。「fit」は「適合させる」という意味で、モデルをデータに適合させる(学習させる)ことを表します。
各メソッドの役割:
- fit():データからパターンを学習する(重み、パラメータを決定)
- predict():学習したパターンを使って予測する
- score():予測精度を評価する(分類:正解率、回帰:R²)
- transform():データを変換する(前処理で使用、例:スケーリング)
覚え方:
fit(フィット)= 「フィットさせる」= 「データに合わせて学習する」と覚えましょう。
組み込みデータセット
次のうち、画像分類の練習に最も適した組み込みデータセットはどれですか?
- A. load_iris()
- B. load_digits()
- C. load_wine()
- D. load_diabetes()
なぜBが正解なのか?
load_digits()は手書き数字の画像データ(8×8ピクセル)を含むため、画像分類の練習に最適です。
各データセットの特徴:
- load_digits():手書き数字の画像データ(8×8ピクセル、64特徴量)→ 画像分類
- load_iris():アヤメの花の計測データ(4特徴量)→ 表形式データの分類
- load_wine():ワインの化学成分データ(13特徴量)→ 表形式データの分類
- load_diabetes():糖尿病の進行度データ(10特徴量)→ 回帰
Digitsデータセットの詳細:
- サンプル数:1,797件
- 各画像は8×8ピクセル = 64個の数値(グレースケール)
- クラス:0〜9の10種類の数字
- MNISTの簡易版として、画像分類の入門に最適
エラーの原因
次のコードを実行すると、エラーが発生します。原因は何ですか?
- A. LogisticRegressionの使い方が間違っている
- B. fit()を呼び出していない
- C. データの形状が間違っている
- D. predictの引数が間違っている
なぜBが正解なのか?
fit()を呼び出さずにpredict()を実行しているため、エラーが発生します。
エラーメッセージ:NotFittedError: This model is not fitted yet.
なぜfit()が必要なのか:
モデルは、fit()で訓練データからパターンを学習します。学習していないモデルは、どう予測すればいいかわかりません。「勉強していないのにテストを受ける」ようなものです。
他の選択肢が間違いの理由:
A(使い方が間違い):LogisticRegression()の作成方法は正しいです。
C(データの形状):[[1, 2, 3, 4]]は2次元配列なので、形状は正しいです。
D(引数が間違い):predict()に2次元配列を渡すのは正しいです。
score()メソッドの戻り値
分類モデルでscore()メソッドを呼び出すと、何が返ってきますか?
- A. 損失関数の値
- B. 正解率(Accuracy)
- C. 予測結果
- D. 学習したパラメータ
なぜBが正解なのか?
分類モデルのscore()は、正解率(Accuracy)を返します。0〜1の値で、1に近いほど精度が高いことを意味します。
分類と回帰の違い:
- 分類モデル:score()は正解率(Accuracy)を返す
- 回帰モデル:score()はR²スコア(決定係数)を返す
他の選択肢が間違いの理由:
A(損失関数の値):損失関数の値を取得するには別のメソッドが必要です。
C(予測結果):予測結果はpredict()で取得します。
D(学習したパラメータ):パラメータはmodel.coef_やmodel.intercept_などの属性でアクセスします。
アルゴリズムの切り替え
次のコードで、ロジスティック回帰からランダムフォレストに変更したいです。
最小限の変更で実現するには、どこを変えればよいですか?
- A. 1行だけ変更すればよい
- B. 2行変更する必要がある
- C. 3行変更する必要がある
- D. すべて書き直す必要がある
なぜAが正解なのか?
Scikit-learnの一貫性のあるAPIのおかげで、1行だけ変更すればOKです。
これがScikit-learnの素晴らしいところ!
どのアルゴリズムも、fit() → predict() → score()という同じインターフェースで使えるため、アルゴリズムを変更するのはモデル作成の1行だけで済みます。
この設計のおかげで、様々なアルゴリズムを簡単に試すことができます。
transform()の使い方
StandardScaler(標準化)を使う場合、正しいコードはどれですか?
- A. scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test) - B. scaler.fit(X_train)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.fit(X_test).transform(X_test) - C. X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.fit_transform(X_test) - D. scaler.fit(X_train + X_test)
X_train_scaled = scaler.transform(X_train)
X_test_scaled = scaler.transform(X_test)
なぜAが正解なのか?
標準化などの前処理では、訓練データでfit()、テストデータではtransform()のみが正しいです。
補足:fit_transform()を使う場合
他の選択肢が間違いの理由:
B が間違いの理由:
テストデータでfit()してはいけません。これを「データリーケージ(Data Leakage)」と呼び、テストデータの情報がモデルに漏れてしまいます。
C が間違いの理由:
テストデータでfit_transform()すると、テストデータ独自の平均・標準偏差で標準化されてしまいます。訓練データとテストデータで異なる基準で標準化されるため、正しく比較できません。
D が間違いの理由:
訓練とテストを一緒にfit()すると、テストデータの情報が訓練に漏れてしまいます(データリーケージ)。
重要な原則:
前処理は「訓練データで学習した統計量(平均、標準偏差など)」を使って、テストデータも変換する必要があります。テストデータの情報を訓練に使ってはいけません。
学習メモ
機械学習入門 - Step 6