cuml-machine-learning について
NVIDIA RAPIDS cuML による GPU 加速機械学習のスキルです。モデル学習や前処理を対象とし、scikit-learn 互換 API の例と GPU・CPU 向けの手順を示します。
主な機能
- 01分類と回帰
- 02クラスタリングと次元削減
- 03特徴量の前処理とエンコード
- 04GPU 動作確認とトラブル対応
活用シーン
- 01大規模データでの分類モデル学習
- 02回帰による数値予測
- 03データのクラスタ分け
- 04可視化に向けた特徴量削減
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ langchain-ai/ deepagents --skill cuml-machine-learningインストール後、Claude Code で/cuml-machine-learningを入力して読み込まれたか確認します。
詳細
cuML 機械学習スキル
NVIDIA RAPIDS cuML を使用した GPU アクセラレーション対応の機械学習です。cuML は scikit-learn と互換性のある API を提供し、NVIDIA GPU 上で実行することで、大規模なデータセットで大幅な高速化を実現します。
このスキルを使用する場面
次のような場合にこのスキルを使用します。
- 分類モデルのトレーニング(カテゴリの予測、不正の検出、テキストの分類)
- 回帰モデルのトレーニング(値の予測、価格の予測、数量の推定)
- データのクラスタリング(顧客のセグメント化、ドキュメントのグループ化、パターンの発見)
- 次元削減(高次元データの可視化、特徴量の圧縮)
- 大規模なデータセットの前処理と特徴量エンジニアリング
- GPU アクセラレーションが有効な、10K 行以上のデータセットに対するあらゆる ML タスク
初期化(必須)
すべてのスクリプトは、必ずこの定型コードから始めてください。実際の GPU ML 処理をテストします。
import pandas as pd
import numpy as np
try:
import cudf
import cuml
# Smoke-test: verify GPU ML works end-to-end
_test_data = cudf.DataFrame({'a': [1.0, 2.0, 3.0, 4.0], 'b': [5.0, 6.0, 7.0, 8.0]})
_km = cuml.cluster.KMeans(n_clusters=2, n_init=1, random_state=42)
_km.fit(_test_data)
assert len(_km.labels_) == 4
GPU = True
except Exception as e:
print(f"[GPU] cuml unavailable, falling back to scikit-learn: {e}")
GPU = False
def read_csv(path):
return cudf.read_csv(path) if GPU else pd.read_csv(path)
def to_pd(df):
"""Convert cuML/cuDF output to pandas. Use this instead of .to_pandas() directly."""
if not GPU:
return df
try:
return df.to_pandas()
except Exception as e:
print(f"[GPU] .to_pandas() failed, using Arrow fallback: {e}")
return df.to_arrow().to_pandas()
インポートパターン
# GPU mode
if GPU:
from cuml.cluster import KMeans, DBSCAN, HDBSCAN
from cuml.ensemble import RandomForestClassifier, RandomForestRegressor
from cuml.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression
from cuml.neighbors import KNeighborsClassifier, KNeighborsRegressor
from cuml.svm import SVC, SVR
from cuml.decomposition import PCA, TruncatedSVD
from cuml.manifold import UMAP, TSNE
from cuml.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder
from cuml.model_selection import train_test_split
from cuml.metrics import accuracy_score, r2_score, mean_squared_error
# CPU fallback
else:
from sklearn.cluster import KMeans, DBSCAN, HDBSCAN
from sklearn.ensemble import RandomForestClassifier, RandomForestRegressor
from sklearn.linear_model import LinearRegression, Ridge, Lasso, LogisticRegression
from sklearn.neighbors import KNeighborsClassifier, KNeighborsRegressor
from sklearn.svm import SVC, SVR
from sklearn.decomposition import PCA, TruncatedSVD
from sklearn.manifold import TSNE
from sklearn.preprocessing import StandardScaler, MinMaxScaler, LabelEncoder
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score, r2_score, mean_squared_error
# UMAP not in sklearn — skip or pip install umap-learn
クイックリファレンス
トレーニング/テストデータの分割(ここから開始)
X = df[["feature1", "feature2", "feature3"]].astype("float32")
y = df["target"]
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
分類
model = RandomForestClassifier(n_estimators=100, max_depth=10, random_state=42)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
accuracy = float(accuracy_score(to_pd(y_test), to_pd(predictions)))
print(f"Accuracy: {accuracy:.4f}")
# Feature importances (tree models only)
importances = to_pd(model.feature_importances_)
for name, imp in zip(feature_names, importances):
print(f" {name}: {imp:.4f}")
回帰
model = Ridge(alpha=1.0)
model.fit(X_train, y_train)
predictions = model.predict(X_test)
r2 = float(r2_score(to_pd(y_test), to_pd(predictions)))
mse = float(mean_squared_error(to_pd(y_test), to_pd(predictions)))
print(f"R² Score: {r2:.4f}")
print(f"MSE: {mse:.4f}")
# Coefficients
coeffs = to_pd(model.coef_)
print(f"Intercept: {float(model.intercept_):.4f}")
クラスタリング(KMeans)
X = df[["feature1", "feature2"]].astype("float32")
model = KMeans(n_clusters=4, n_init=10, random_state=42)
model.fit(X)
labels = to_pd(model.labels_)
centroids = to_pd(model.cluster_centers_)
inertia = float(model.inertia_)
print(f"Inertia: {inertia:.2f}")
print(f"Cluster sizes: {labels.value_counts().sort_index().to_dict()}")
print(f"Centroids:\n{centroids}")
次元削減(PCA)
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X.astype("float32"))
pca = PCA(n_components=3)
X_reduced = pca.fit_transform(X_scaled)
variance_ratio = to_pd(pca.explained_variance_ratio_)
print(f"Explained variance: {[f'{v:.4f}' for v in variance_ratio]}")
print(f"Total explained: {float(sum(variance_ratio)):.4f}")
次元削減(UMAP — GPU のみ)
if GPU:
reducer = UMAP(n_components=2, n_neighbors=15, min_dist=0.1, random_state=42)
embedding = to_pd(reducer.fit_transform(X_scaled))
print(f"UMAP embedding shape: {embedding.shape}")
前処理
# Scale numeric features
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X.astype("float32"))
# Encode categorical columns
le = LabelEncoder()
df["category_encoded"] = le.fit_transform(df["category"])
データ型の要件
- cuML の特徴量には float32 または float64 が必要です。必ずキャストしてください:
X.astype("float32") - 整数のターゲット(分類ラベル)はそのまま使用できます
- カテゴリ列は事前にエンコードする必要があります(LabelEncoder または OneHotEncoder)
- cuML はスパース行列をサポートしていません。必ず密なデータを使用してください
注意点
| 問題 | 対処法 |
|---|---|
TypeError: sparse input | 密な形式に変換します:X.toarray() を使用するか、スパース形式を使用しないでください |
PCA の solver='randomized' が失敗する | solver='full' を使用するか、省略します(cuML が自動選択します) |
| UMAP を CPU で使用できない | CPU モードでは UMAP を使わないか、pip install umap-learn を実行します |
| float64 は float32 より遅い | float32 にキャストします:X.astype("float32") |
| 大規模なデータセットで OOM が発生する | 適合処理の前に特徴量を減らすか、データをサンプリングします |
出力ガイドライン
ML の結果を報告する際は、次の内容を含めます。
- データセットの形状(行数 × 特徴量数)とターゲットの分布
- トレーニング/テスト分割のサイズ
- 主要な指標(accuracy、R²、MSE など)を整形済みの表で報告
- 分類の場合:マルチクラスならクラスごとの指標を表示
- クラスタリングの場合:クラスタのサイズと重心の概要を表示
- 次元削減の場合:説明分散比を表示
- 特徴量の重要度を大きい順に一覧表示
- データ品質の問題(クラスの不均衡、欠損値、外れ値など)を記載
コメント
Markdown 対応