传统机器学习分类模型详解(二)
·
- 随机森林
- K近邻
- 朴素贝叶斯
原理介绍
通过集成多棵决策树,采用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))
优缺点
优点:
抗过拟合能力强
能够处理高维数据
提供特征重要性评估
缺点:
训练时间较长
可解释性较差
需要更多内存
- 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))
优缺点
优点:
原理简单直观
无需训练过程
对异常值不敏感
缺点:
预测阶段计算量大
对特征缩放敏感
高维数据效果差
- 朴素贝叶斯
原理介绍
基于贝叶斯定理,假设特征之间条件独立。
代码实现
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等工具增强可解释性
更多推荐
所有评论(0)