scikit-learn について
scikit-learnで古典的な機械学習に取り組む開発者向けの実践ガイドです。前処理からモデル構築、評価、調整までを扱い、Pipelineによる再現可能なワークフローを重視します。
主な機能
- 01分類と回帰モデル
- 02クラスタリングと次元削減
- 03前処理と特徴量エンジニアリング
- 04交差検証とハイパーパラメータ調整
- 05Pipelineによるワークフロー構築
活用シーン
- 01分類・回帰モデルの構築
- 02ラベルなしデータのパターン探索
- 03候補モデルの評価と比較
- 04前処理とモデルを本番ワークフローに統合
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ crazymsn/ academic-skills --skill scikit-learnインストール後、Claude Code で/scikit-learnを入力して読み込まれたか確認します。
同梱ファイル
SKILL.md と一緒にインストールされる参考資料やスクリプト。
references/model_evaluation.mdpipelines_and_composition.mdpreprocessing.mdquick_reference.mdsupervised_learning.mdunsupervised_learning.mdscripts/classification_pipeline.pyclustering_analysis.py詳細
Scikit-learn
概要
このスキルは、古典的な機械学習のための業界標準の Python ライブラリである scikit-learn を使った機械学習タスクに関する包括的なガイダンスを提供します。分類、回帰、クラスタリング、次元削減、前処理、モデル評価、そして本番環境向けの ML パイプラインの構築にこのスキルを使用してください。
インストール
# Install scikit-learn using uv
uv pip install scikit-learn
# Optional: Install visualization dependencies
uv pip install matplotlib seaborn
# Commonly used with
uv pip install pandas numpy
このスキルを使用するタイミング
次のような場合に scikit-learn スキルを使用してください:
- 分類モデルや回帰モデルを構築するとき
- クラスタリングや次元削減を行うとき
- 機械学習のためにデータを前処理・変換するとき
- 交差検証によってモデルの性能を評価するとき
- グリッドサーチまたはランダムサーチでハイパーパラメーターを調整するとき
- 本番ワークフロー向けの ML パイプラインを作成するとき
- タスクに対して異なるアルゴリズムを比較するとき
- 構造化データ(表形式)とテキストデータの両方を扱うとき
- 解釈可能な古典的機械学習アプローチが必要なとき
クイックスタート
分類の例
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
# Split data
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
# Preprocess
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)
# Train model
model = RandomForestClassifier(n_estimators=100, random_state=42)
model.fit(X_train_scaled, y_train)
# Evaluate
y_pred = model.predict(X_test_scaled)
print(classification_report(y_test, y_pred))
混合データを扱う完全なパイプライン
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
from sklearn.ensemble import GradientBoostingClassifier
# Define feature types
numeric_features = ['age', 'income']
categorical_features = ['gender', 'occupation']
# Create preprocessing pipelines
numeric_transformer = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())
])
categorical_transformer = Pipeline([
('imputer', SimpleImputer(strategy='most_frequent')),
('onehot', OneHotEncoder(handle_unknown='ignore'))
])
# Combine transformers
preprocessor = ColumnTransformer([
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)
])
# Full pipeline
model = Pipeline([
('preprocessor', preprocessor),
('classifier', GradientBoostingClassifier(random_state=42))
])
# Fit and predict
model.fit(X_train, y_train)
y_pred = model.predict(X_test)
主要な機能
1. 教師あり学習
分類と回帰タスクのための包括的なアルゴリズム群です。
主なアルゴリズム:
- 線形モデル: ロジスティック回帰、線形回帰、Ridge、Lasso、ElasticNet
- 木ベース: 決定木、ランダムフォレスト、勾配ブースティング
- サポートベクターマシン: 各種カーネルを用いた SVC、SVR
- アンサンブル手法: AdaBoost、Voting、Stacking
- ニューラルネットワーク: MLPClassifier、MLPRegressor
- その他: ナイーブベイズ、K近傍法
使用するタイミング:
- 分類: 離散的なカテゴリを予測する場合(スパム検出、画像分類、不正検出など)
- 回帰: 連続値を予測する場合(価格予測、需要予測など)
参照: アルゴリズムの詳細なドキュメント、パラメーター、使用例については references/supervised_learning.md を参照してください。
2. 教師なし学習
クラスタリングと次元削減を通じて、ラベルのないデータからパターンを発見します。
クラスタリングアルゴリズム:
- 分割ベース: K-Means、MiniBatchKMeans
- 密度ベース: DBSCAN、HDBSCAN、OPTICS
- 階層型: AgglomerativeClustering
- 確率的: ガウス混合モデル
- その他: MeanShift、SpectralClustering、BIRCH
次元削減:
- 線形: PCA、TruncatedSVD、NMF
- 多様体学習: t-SNE、UMAP、Isomap、LLE
- 特徴抽出: FastICA、LatentDirichletAllocation
使用するタイミング:
- 顧客セグメンテーション、異常検知、データの可視化
- 特徴量の次元削減、探索的データ分析
- トピックモデリング、画像圧縮
参照: 詳細なドキュメントについては references/unsupervised_learning.md を参照してください。
3. モデル評価と選択
堅牢なモデル評価、交差検証、ハイパーパラメーター調整のためのツール群です。
交差検証の戦略:
- KFold、StratifiedKFold(分類)
- TimeSeriesSplit(時系列データ)
- GroupKFold(グループ化されたサンプル)
ハイパーパラメーター調整:
- GridSearchCV(網羅的探索)
- RandomizedSearchCV(ランダムサンプリング)
- HalvingGridSearchCV(逐次ハービング)
指標:
- 分類: 正解率、適合率、再現率、F1 スコア、ROC AUC、混同行列
- 回帰: MSE、RMSE、MAE、R²、MAPE
- クラスタリング: シルエットスコア、Calinski-Harabasz、Davies-Bouldin
使用するタイミング:
- モデルの性能を客観的に比較するとき
- 最適なハイパーパラメーターを見つけるとき
- 交差検証によって過学習を防ぐとき
- 学習曲線によってモデルの挙動を理解するとき
参照: 包括的な指標と調整戦略については references/model_evaluation.md を参照してください。
4. データの前処理
生データを機械学習に適した形式に変換します。
スケーリングと正規化:
- StandardScaler(平均0、分散1)
- MinMaxScaler(範囲が有界)
- RobustScaler(外れ値に頑健)
- Normalizer(サンプルごとの正規化)
カテゴリ変数のエンコーディング:
- OneHotEncoder(名義カテゴリ)
- OrdinalEncoder(順序カテゴリ)
- LabelEncoder(ターゲットのエンコーディング)
欠損値の処理:
- SimpleImputer(平均値、中央値、最頻値)
- KNNImputer(k近傍法)
- IterativeImputer(多変量補完)
特徴量エンジニアリング:
- PolynomialFeatures(交互作用項)
- KBinsDiscretizer(ビニング)
- 特徴量選択(RFE、SelectKBest、SelectFromModel)
使用するタイミング:
- スケーリングされた特徴量を必要とするアルゴリズム(SVM、KNN、ニューラルネットワーク)を学習させる前
- カテゴリ変数を数値形式に変換するとき
- 欠損データを体系的に処理するとき
- 線形モデルのために非線形の特徴量を作成するとき
参照: 前処理手法の詳細については references/preprocessing.md を参照してください。
5. パイプラインと構成
再現可能で本番環境に対応したML ワークフローを構築します。
主要コンポーネント:
- Pipeline: 変換器と推定器を順番に連結します
- ColumnTransformer: 列ごとに異なる前処理を適用します
- FeatureUnion: 複数の変換器を並列に結合します
- TransformedTargetRegressor: 目的変数を変換します
メリット:
- 交差検証におけるデータリークを防ぎます
- コードを簡潔にし、保守性を向上させます
- ハイパーパラメータの同時チューニングを可能にします
- 学習時と予測時の一貫性を保証します
使用するタイミング:
- 本番ワークフローでは常にパイプラインを使用します
- 数値特徴量とカテゴリ特徴量を混在させる場合(ColumnTransformer を使用)
- 前処理ステップを含めて交差検証を行う場合
- ハイパーパラメータチューニングに前処理のパラメータが含まれる場合
参照: 包括的なパイプラインのパターンについては references/pipelines_and_composition.md を参照してください。
サンプルスクリプト
分類パイプライン
前処理、モデル比較、ハイパーパラメータチューニング、評価を含む分類ワークフロー全体を実行します:
python scripts/classification_pipeline.py
このスクリプトでは以下を示します:
- 混在するデータ型(数値とカテゴリ)の処理
- 交差検証を用いたモデル比較
- GridSearchCV によるハイパーパラメータチューニング
- 複数の指標を用いた包括的な評価
- 特徴量重要度の分析
クラスタリング分析
アルゴリズムの比較と可視化を含むクラスタリング分析を実行します:
python scripts/clustering_analysis.py
このスクリプトでは以下を示します:
- 最適なクラスター数の探索(エルボー法、シルエット分析)
- 複数のクラスタリングアルゴリズム(K-Means、DBSCAN、Agglomerative、Gaussian Mixture)の比較
- 正解ラベルなしでのクラスタリング品質の評価
- PCA 射影による結果の可視化
リファレンスドキュメント
このスキルには、特定のトピックを掘り下げるための包括的なリファレンスファイルが含まれています:
クイックリファレンス
ファイル: references/quick_reference.md
- 一般的なインポートパターンとインストール手順
- 一般的なタスク向けのクイックワークフローテンプレート
- アルゴリズム選択のチートシート
- 一般的なパターンと注意点
- パフォーマンス最適化のヒント
教師あり学習
ファイル: references/supervised_learning.md
- 線形モデル(回帰と分類)
- サポートベクターマシン
- 決定木とアンサンブル手法
- K近傍法、ナイーブベイズ、ニューラルネットワーク
- アルゴリズム選択ガイド
教師なし学習
ファイル: references/unsupervised_learning.md
- すべてのクラスタリングアルゴリズム(パラメータと用途を含む)
- 次元削減手法
- 外れ値検出と新規性検出
- ガウス混合モデル
- 手法選択ガイド
モデル評価
ファイル: references/model_evaluation.md
- 交差検証の戦略
- ハイパーパラメータチューニング手法
- 分類、回帰、クラスタリングの評価指標
- 学習曲線と検証曲線
- モデル選択のベストプラクティス
前処理
ファイル: references/preprocessing.md
- 特徴量のスケーリングと正規化
- カテゴリ変数のエンコーディング
- 欠損値の補完
- 特徴量エンジニアリングの手法
- カスタムトランスフォーマー
パイプラインと構成
ファイル: references/pipelines_and_composition.md
- パイプラインの構築と使い方
- 混合データ型のための ColumnTransformer
- 並列変換のための FeatureUnion
- 完全なエンドツーエンドの例
- ベストプラクティス
一般的なワークフロー
分類モデルの構築
-
データの読み込みと確認
import pandas as pd df = pd.read_csv('data.csv') X = df.drop('target', axis=1) y = df['target'] -
層化によるデータ分割
from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, stratify=y, random_state=42 ) -
前処理パイプラインの作成
from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from sklearn.compose import ColumnTransformer # Handle numeric and categorical features separately preprocessor = ColumnTransformer([ ('num', StandardScaler(), numeric_features), ('cat', OneHotEncoder(), categorical_features) ]) -
完全なパイプラインの構築
model = Pipeline([ ('preprocessor', preprocessor), ('classifier', RandomForestClassifier(random_state=42)) ]) -
ハイパーパラメータのチューニング
from sklearn.model_selection import GridSearchCV param_grid = { 'classifier__n_estimators': [100, 200], 'classifier__max_depth': [10, 20, None] } grid_search = GridSearchCV(model, param_grid, cv=5) grid_search.fit(X_train, y_train) -
テストセットでの評価
from sklearn.metrics import classification_report best_model = grid_search.best_estimator_ y_pred = best_model.predict(X_test) print(classification_report(y_test, y_pred))
クラスタリング分析の実施
-
データの前処理
from sklearn.preprocessing import StandardScaler scaler = StandardScaler() X_scaled = scaler.fit_transform(X) -
最適なクラスター数の探索
from sklearn.cluster import KMeans from sklearn.metrics import silhouette_score scores = [] for k in range(2, 11): kmeans = KMeans(n_clusters=k, random_state=42) labels = kmeans.fit_predict(X_scaled) scores.append(silhouette_score(X_scaled, labels)) optimal_k = range(2, 11)[np.argmax(scores)] -
クラスタリングの適用
model = KMeans(n_clusters=optimal_k, random_state=42) labels = model.fit_predict(X_scaled) -
次元削減による可視化
from sklearn.decomposition import PCA pca = PCA(n_components=2) X_2d = pca.fit_transform(X_scaled) plt.scatter(X_2d[:, 0], X_2d[:, 1], c=labels, cmap='viridis')
ベストプラクティス
常にパイプラインを使用する
パイプラインはデータリークを防ぎ、一貫性を確保します:
# Good: Preprocessing in pipeline
pipeline = Pipeline([
('scaler', StandardScaler()),
('model', LogisticRegression())
])
# Bad: Preprocessing outside (can leak information)
X_scaled = StandardScaler().fit_transform(X)
学習データのみでフィットする
テストデータでフィットしないでください:
# Good
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test) # Only transform
# Bad
scaler = StandardScaler()
X_all_scaled = scaler.fit_transform(np.vstack([X_train, X_test]))
分類では層化分割を使用する
クラス分布を維持します:
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.2, stratify=y, random_state=42
)
再現性のために乱数シードを設定する
model = RandomForestClassifier(n_estimators=100, random_state=42)
適切な評価指標を選択する
- バランスの取れたデータ: Accuracy、F1 スコア
- 不均衡なデータ: Precision、Recall、ROC AUC、Balanced Accuracy
- コストに敏感な場合: カスタムスコアラーを定義する
必要に応じて特徴量をスケーリングする
特徴量のスケーリングが必要なアルゴリズム:
- SVM、KNN、ニューラルネットワーク
- PCA、正則化を伴う線形回帰・ロジスティック回帰
- K-Means クラスタリング
特徴量のスケーリングが不要なアルゴリズム:
- ツリーベースのモデル(決定木、ランダムフォレスト、勾配ブースティング)
- ナイーブベイズ
よくある問題のトラブルシューティング
ConvergenceWarning
問題: モデルが収束しなかった
解決策: max_iter を増やすか、特徴量をスケーリングしてください
model = LogisticRegression(max_iter=1000)
テストセットでの性能が低い
問題: 過学習 解決策: 正則化、交差検証、またはより単純なモデルを使用してください
# Add regularization
model = Ridge(alpha=1.0)
# Use cross-validation
scores = cross_val_score(model, X, y, cv=5)
大規模データセットでのメモリエラー
解決策: 大規模データ向けに設計されたアルゴリズムを使用してください
# Use SGD for large datasets
from sklearn.linear_model import SGDClassifier
model = SGDClassifier()
# Or MiniBatchKMeans for clustering
from sklearn.cluster import MiniBatchKMeans
model = MiniBatchKMeans(n_clusters=8, batch_size=100)