cuML 機械学習スキル は何をしますか?
GPU アクセラレーションによる機械学習 (NVIDIA RAPIDS cuML 使用)。cuML は scikit-learn 互換の API を提供し、NVIDIA GPU 上で動作することで大規模データセットに対して大幅な高速化を実現します。
このスキルを使用するタイミング
以下の場合にこのスキルを使用します:
- 分類モデルのトレーニング (カテゴリ予測、不正検出、テキスト分類)
- 回帰モデルのトレーニング (値の予測、価格予測、数量推定)
- データのクラスタリング (顧客セグメント化、ドキュメントグループ化、パターン発見)
- 次元削減 (高次元データの可視化、特徴量圧縮)
- 大規模データセットの前処理と特徴量エンジニアリング
- 10,000行以上のデータセットでの機械学習タスク (GPU アクセラレーションが有効な場合)
初期化 (必須)
すべてのスクリプトは常にこの定型コードから始めてください。これにより実際の GPU ML 操作がテストされます。
import pandas as pd
import numpy as np
try:
import cudf
import cuml
# スモークテスト: GPU ML がエンドツーエンドで動作することを確認
_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 が利用できません。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):
"""cuML/cuDF の出力を pandas に変換します。直接 .to_pandas() を使う代わりにこれを使用してください。"""
if not GPU:
return df
try:
return df.to_pandas()
except Exception as e:
print(f"[GPU] .to_pandas() に失敗しました。Arrow フォールバックを使用します: {e}")
return df.to_arrow().to_pandas()
インポートパターン
# GPU モード
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 フォールバック
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 は sklearn に含まれていません — スキップ または 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}")
# 特徴量重要度 (ツリーモデルのみ)
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}")
# 係数
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}")
前処理
# 数値特徴量のスケーリング
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X.astype("float32"))
# カテゴリカル列のエンコーディング
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 が自動選択) |
| CPU モードで UMAP が利用不可 | CPU モードでは UMAP をスキップ または pip install umap-learn |
| Float64 が float32 より遅い | float32 にキャスト: X.astype("float32") |
| 大規模データセットで OOM | 特徴量削減または事前にデータをサンプリング |
出力ガイドライン
機械学習の結果を報告する際は:
- データセットの形状 (行数 × 特徴量数) とターゲットの分布を含める
- 学習/テスト分割サイズを表示する
- 主要な指標を整形されたテーブルで報告する (Accuracy, R², MSE など)
- 分類の場合: マルチクラスではクラスごとの指標を表示する
- クラスタリングの場合: クラスタサイズと重心の要約を表示する
- 次元削減の場合: 説明分散比を表示する
- 特徴量重要度を大きさでランク付けして一覧表示する
- データ品質の問題 (クラスの不均衡、欠損値、外れ値) に注意する