本文目录导读:

我来介绍几种用Scikit-learn计算AUC的方法:
基础二分类AUC计算
import numpy as np
from sklearn.metrics import roc_auc_score, roc_curve
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import make_classification
# 创建示例数据
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=2, n_redundant=10,
random_state=42)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 训练模型
model = LogisticRegression()
model.fit(X_train, y_train)
# 获取预测概率(注意是正类的概率)
y_pred_prob = model.predict_proba(X_test)[:, 1]
# 计算AUC
auc_score = roc_auc_score(y_test, y_pred_prob)
print(f"AUC Score: {auc_score:.4f}")
# 获取ROC曲线数据
fpr, tpr, thresholds = roc_curve(y_test, y_pred_prob)
多分类AUC计算
from sklearn.multiclass import OneVsRestClassifier
from sklearn.preprocessing import label_binarize
# 创建多分类数据
X, y = make_classification(n_samples=1000, n_features=20,
n_classes=3, n_clusters_per_class=1,
random_state=42)
# 二值化标签
y_bin = label_binarize(y, classes=[0, 1, 2])
n_classes = y_bin.shape[1]
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y_bin, test_size=0.3, random_state=42
)
# 训练多分类模型
model = OneVsRestClassifier(LogisticRegression())
model.fit(X_train, y_train)
y_pred_prob = model.predict_proba(X_test)
# 计算每个类别的AUC
for i in range(n_classes):
auc = roc_auc_score(y_test[:, i], y_pred_prob[:, i])
print(f"AUC for class {i}: {auc:.4f}")
# 计算宏平均AUC
macro_auc = roc_auc_score(y_test, y_pred_prob, multi_class='ovr', average='macro')
print(f"Macro-average AUC: {macro_auc:.4f}")
# 计算微平均AUC
micro_auc = roc_auc_score(y_test, y_pred_prob, multi_class='ovr', average='micro')
print(f"Micro-average AUC: {micro_auc:.4f}")
交叉验证中的AUC计算
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import StratifiedKFold
# 使用交叉验证计算AUC
cv = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
auc_scores = cross_val_score(model, X, y_bin, cv=cv,
scoring='roc_auc_ovr')
print("Cross-validation AUC scores:", auc_scores)
print(f"Mean AUC: {auc_scores.mean():.4f} (±{auc_scores.std() * 2:.4f})")
完整的示例:比较不同模型
import matplotlib.pyplot as plt
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
# 创建数据
X, y = make_classification(n_samples=1000, n_features=20,
random_state=42)
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42
)
# 定义要比较的模型
models = {
'Logistic Regression': LogisticRegression(),
'Random Forest': RandomForestClassifier(n_estimators=100),
'SVM': SVC(probability=True) # 需要probability=True才能获取概率
}
# 比较不同模型的AUC
results = {}
plt.figure(figsize=(10, 8))
for name, model in models.items():
model.fit(X_train, y_train)
y_prob = model.predict_proba(X_test)[:, 1]
# 计算AUC
auc = roc_auc_score(y_test, y_prob)
results[name] = auc
# 获取ROC曲线数据
fpr, tpr, _ = roc_curve(y_test, y_prob)
# 绘制ROC曲线
plt.plot(fpr, tpr, label=f'{name} (AUC = {auc:.3f})', lw=2)
# 绘制对角线(随机分类器)
plt.plot([0, 1], [0, 1], 'k--', lw=2, label='Random')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('False Positive Rate')
plt.ylabel('True Positive Rate')'ROC Curves Comparison')
plt.legend(loc="lower right")
plt.grid(True)
plt.show()
# 打印结果
print("\nModel Performance (AUC):")
for name, auc in sorted(results.items(), key=lambda x: x[1], reverse=True):
print(f"{name}: {auc:.4f}")
实际案例:二分类任务完整流程
import pandas as pd
from sklearn.preprocessing import StandardScaler
from sklearn.impute import SimpleImputer
from sklearn.pipeline import Pipeline
# 创建示例数据(模拟真实场景)
np.random.seed(42)
n_samples = 500
# 创建特征
data = {
'age': np.random.randint(18, 80, n_samples),
'income': np.random.normal(50000, 20000, n_samples),
'education_years': np.random.randint(8, 20, n_samples),
'credit_score': np.random.randint(300, 850, n_samples),
'debt_ratio': np.random.uniform(0, 1, n_samples)
}
df = pd.DataFrame(data)
# 创建目标变量(是否贷款违约)
# 基于一些规则生成
df['default'] = (
(df['credit_score'] < 600) &
(df['debt_ratio'] > 0.5)
).astype(int)
# 添加一些随机性和缺失值
df.loc[np.random.choice(n_samples, 50), 'income'] = np.nan
df['default'] = df['default'] | (np.random.random(n_samples) < 0.1)
# 特征和目标
X = df.drop('default', axis=1)
y = df['default']
# 划分数据
X_train, X_test, y_train, y_test = train_test_split(
X, y, test_size=0.3, random_state=42, stratify=y
)
# 创建预处理和模型管道
pipeline = Pipeline([
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler()),
('classifier', LogisticRegression(random_state=42))
])
# 训练模型
pipeline.fit(X_train, y_train)
# 预测概率
y_probs = pipeline.predict_proba(X_test)[:, 1]
# 计算AUC
auc = roc_auc_score(y_test, y_probs)
print(f"Test AUC Score: {auc:.4f}")
# 获取特征重要性(如果是决策树/随机森林等)
if hasattr(pipeline.named_steps['classifier'], 'coef_'):
coefficients = pipeline.named_steps['classifier'].coef_[0]
features = X.columns
feature_importance = pd.DataFrame({
'feature': features,
'coefficient': coefficients,
'abs_coefficient': np.abs(coefficients)
}).sort_values('abs_coefficient', ascending=False)
print("\nFeature Importance (by coefficient):")
print(feature_importance)
重要注意事项:
- 输入要求:
roc_auc_score需要预测的概率值,而不是类别标签 - 概率方向:确保传入的是正类(通常为1)的概率
- 数据平衡:AUC对不平衡数据相对稳健
- 多分类:使用
multi_class参数指定计算方法('ovr'或'ovo')
这些示例涵盖了从基础到进阶的AUC计算方法,适用于不同的应用场景。
版权声明:NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
NBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
CBA直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
足球直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播
英超直播