用途
该技能用于在表格数据上使用 NVIDIA RAPIDS cuML 进行 GPU 加速的机器学习。cuML 提供与 scikit-learn 兼容的 API,可在 NVIDIA GPU 上运行,从而在大数据集上获得显著加速。
何时使用
- 训练分类模型(预测类别、检测欺诈、文本分类)
- 训练回归模型(预测数值、预测价格、估计数量)
- 聚类数据(客户分群、文档分组、发现模式)
- 降维(可视化高维数据、压缩特征)
- 在大数据集上进行预处理和特征工程
- 任何行数在 10K+ 且 GPU 加速有帮助的数据集上的机器学习任务
初始化(必需)
每个脚本都应以此样板代码开头,它会实际测试 GPU 机器学习操作:
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") |
| 大数据集内存不足 | 在拟合前减少特征或采样数据 |
输出指南
报告机器学习结果时:
- 包含数据集形状(行 × 特征)和目标分布
- 显示训练/测试划分大小
- 以格式化表格报告关键指标(准确率、R²、MSE 等)
- 对于分类:多分类时显示每类指标
- 对于聚类:显示簇大小和质心摘要
- 对于降维:显示解释方差比
- 按大小排序列出特征重要性
- 注明任何数据质量问题(类别不平衡、缺失值、异常值)