决策树 随机森林 KNN分类。 关联sklearn。 python。

机器学习中有三个经典算法经常被拿来比较:决策树、随机森林和KNN分类器。今天咱们用Python的sklearn库,边撸代码边聊它们的实战技巧。先来点实际的,直接上数据集!

加载鸢尾花数据集是标准操作:

from sklearn.datasets import load_iris
iris = load_iris()
X, y = iris.data, iris.target

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)

决策树:最直观的if-else专家

from sklearn.tree import DecisionTreeClassifier
dt = DecisionTreeClassifier(max_depth=3)  # 限制树深防止过拟合
dt.fit(X_train, y_train)
print(f"决策树准确率:{dt.score(X_test, y_test):.2%}")

输出结果可能显示95%左右的准确率。max_depth这个参数特别有意思,设置太小会导致欠拟合,太大又容易记住训练数据。可以通过可视化决策树观察分裂过程:

from sklearn.tree import plot_tree
import matplotlib.pyplot as plt
plt.figure(figsize=(15,8))
plot_tree(dt, filled=True, feature_names=iris.feature_names, class_names=iris.target_names)
plt.show()

你会看到它先根据花瓣宽度是否<=0.8来区分第一层,这种可解释性正是决策树的魅力所在。

随机森林:群策群力的委员会

决策树 随机森林 KNN分类。 关联sklearn。 python。

单个决策树容易受数据波动影响,那就造一片森林:

from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(n_estimators=100, max_features='sqrt', random_state=42)
rf.fit(X_train, y_train)
print(f"随机森林准确率:{rf.score(X_test, y_test):.2%}")

通常准确率会比单棵树高1-3个百分点。这里的n_estimators控制树的数量,实测超过100棵后提升有限。随机森林的魔法在于双重随机性——随机选取样本(bootstrap)和随机选择特征,这种设计让模型兼具多样性和鲁棒性。

KNN:近朱者赤的邻居法则

与前两个模型不同,KNN没有显式的训练过程:

from sklearn.neighbors import KNeighborsClassifier
knn = KNeighborsClassifier(n_neighbors=5, weights='distance')
knn.fit(X_train, y_train)
print(f"KNN准确率:{knn.score(X_test, y_test):.2%}")

注意这里一定要做特征标准化!KNN对特征尺度极其敏感,举个反面教材:

from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
X_test_scaled = scaler.transform(X_test)

knn_scaled = KNeighborsClassifier(n_neighbors=5)
knn_scaled.fit(X_train_scaled, y_train)
print(f"标准化后的KNN准确率:{knn_scaled.score(X_test_scaled, y_test):.2%}")

不标准化可能只有70%准确率,标准化后能飙升到95%以上。KNN的n_neighbors参数需要小心调校,用网格搜索能找到最佳值:

from sklearn.model_selection import GridSearchCV
param_grid = {'n_neighbors': range(3,15)}
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid.fit(X_train_scaled, y_train)
print(f"最佳邻居数:{grid.best_params_}")

选型指南:需要可解释性优先选决策树;追求准确率用随机森林;数据集较小时KNN表现更好。实际项目中可以先用随机森林跑个baseline,再根据需求调整。这三个算法构成了机器学习的基础武器库,掌握它们就拿到了打开分类世界的钥匙。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐