文章目录

  1. 随机森林
  2. K近邻
  3. 朴素贝叶斯

原理介绍
通过集成多棵决策树,采用bagging和随机特征选择来提高泛化能力。

代码实现

from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import GridSearchCV

# 创建随机森林模型
rf_model = RandomForestClassifier(
    n_estimators=100,
    max_depth=5,
    random_state=42
)

# 使用网格搜索调参
param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [3, 5, 7],
    'min_samples_split': [2, 5]
}

grid_search = GridSearchCV(rf_model, param_grid, cv=5, scoring='accuracy')
grid_search.fit(X_train, y_train)

# 最佳参数
print("最佳参数:", grid_search.best_params_)

# 使用最佳模型预测
best_rf = grid_search.best_estimator_
y_pred_rf = best_rf.predict(X_test)

print("随机森林准确率:", accuracy_score(y_test, y_pred_rf))

优缺点
优点:

抗过拟合能力强

能够处理高维数据

提供特征重要性评估

缺点:

训练时间较长

可解释性较差

需要更多内存

  1. K近邻
    原理介绍
    基于特征空间中的距离度量,通过投票机制确定样本类别。

代码实现

from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import precision_recall_curve

# 寻找最优K值
k_range = range(1, 15)
accuracies = []

for k in k_range:
    knn = KNeighborsClassifier(n_neighbors=k)
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    accuracies.append(accuracy_score(y_test, y_pred))

# 绘制K值与准确率关系
plt.plot(k_range, accuracies)
plt.xlabel('K值')
plt.ylabel('准确率')
plt.title('K值选择')
plt.show()

# 使用最优K值
best_k = k_range[np.argmax(accuracies)]
knn_model = KNeighborsClassifier(n_neighbors=best_k)
knn_model.fit(X_train, y_train)

y_pred_knn = knn_model.predict(X_test)
print(f"KNN准确率 (K={best_k}):", accuracy_score(y_test, y_pred_knn))

优缺点
优点:

原理简单直观

无需训练过程

对异常值不敏感

缺点:

预测阶段计算量大

对特征缩放敏感

高维数据效果差

  1. 朴素贝叶斯
    原理介绍
    基于贝叶斯定理,假设特征之间条件独立。

代码实现

from sklearn.naive_bayes import GaussianNB
from sklearn.metrics import roc_curve, auc

# 创建朴素贝叶斯模型
nb_model = GaussianNB()
nb_model.fit(X_train, y_train)

# 预测概率
y_pred_proba = nb_model.predict_proba(X_test)[:, 1]

# 计算ROC曲线
fpr, tpr, thresholds = roc_curve(y_test, y_pred_proba)
roc_auc = auc(fpr, tpr)

# 绘制ROC曲线
plt.figure(figsize=(8, 6))
plt.plot(fpr, tpr, color='darkorange', lw=2, label=f'ROC曲线 (AUC = {roc_auc:.2f})')
plt.plot([0, 1], [0, 1], color='navy', lw=2, linestyle='--')
plt.xlim([0.0, 1.0])
plt.ylim([0.0, 1.05])
plt.xlabel('假正率')
plt.ylabel('真正率')
plt.title('ROC曲线')
plt.legend(loc="lower right")
plt.show()

y_pred_nb = nb_model.predict(X_test)
print("朴素贝叶斯准确率:", accuracy_score(y_test, y_pred_nb))

优缺点
优点:

训练速度快

对小规模数据效果好

适合文本分类

缺点:

特征独立性假设不成立时效果差

需要数据平滑处理

综合比较与选择指南
模型选择流程

def model_selection_guide():
    """模型选择指南"""
    guidelines = {
        '小数据集 (<10K样本)': ['逻辑回归', '朴素贝叶斯', 'SVM'],
        '需要可解释性': ['逻辑回归', '决策树'],
        '高维特征': ['SVM', '随机森林'],
        '类别不平衡': ['随机森林', '带权重的SVM'],
        '实时预测': ['逻辑回归', '朴素贝叶斯'],
        '文本数据': ['朴素贝叶斯', 'SVM']
    }
    
    for scenario, models in guidelines.items():
        print(f"{scenario}: {', '.join(models)}")

model_selection_guide()

综合评估示例

from sklearn.model_selection import cross_val_score

models = {
    '逻辑回归': LogisticRegression(random_state=42),
    'SVM': SVC(random_state=42),
    '决策树': DecisionTreeClassifier(random_state=42),
    '随机森林': RandomForestClassifier(random_state=42),
    'KNN': KNeighborsClassifier(),
    '朴素贝叶斯': GaussianNB()
}

# 交叉验证比较
print("模型交叉验证比较:")
print("-" * 40)
for name, model in models.items():
    scores = cross_val_score(model, X_scaled, y_binary, cv=5, scoring='accuracy')
    print(f"{name:12} | 平均准确率: {scores.mean():.3f}{scores.std():.3f})")

实践建议
数据预处理:标准化、处理缺失值、特征工程

模型选择:从小模型开始,逐步尝试复杂模型

调参策略:使用网格搜索或随机搜索

评估指标:准确率、精确率、召回率、F1分数、AUC等

模型解释:使用SHAP、LIME等工具增强可解释性

更多推荐