










KNN分类算法是一种基于“物以类聚”思想的监督学习算法,通过计算待分类样本与训练集中各样本的距离,选取最近的K个邻居,根据多数表决原则确定其类别。
接下来我们将通过 Python 和 scikit-learn 库,以经典的 鸢尾花数据集(Iris Dataset) 为例,完整演示 KNN 分类算法的实现流程。
这个流程涵盖了从数据加载、预处理、模型训练、超参数调优到最终评估的全过程。
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import seaborn as sns
import matplotlib.pyplot as plt
import math
# 1.加载鸢尾花数据集
iris=load_iris()
X,y=iris.data,iris.target
# 2. 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. 划分训练集和测试集
# test_size=0.3 表示 30% 用于测试,random_state 确保结果可复现
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.3, random_state=42, stratify=y
)
# 4. 寻找最佳 K 值
# 假设 X_train 是你的训练数据特征矩阵
N = X_train.shape[0] # 获取训练集样本数量 N
max_k = int(math.sqrt(N)) # 计算根号 N 并取整
# 生成从 1 到 max_k 之间的所有奇数
k_values = range(1, max_k + 1, 2)
#缓存预测结果及评分
accuracies = []
#遍历K值,找到最佳的K值
for k in k_values:
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.figure(figsize=(10, 6))
plt.plot(k_values, accuracies, marker='o', linestyle='-')
plt.title('Accuracy vs K')
plt.xlabel('K')
plt.ylabel('Accuracy')
plt.xticks(k_values)
plt.grid(True)
plt.show()
# 获取最佳 K 值
best_k = k_values[np.argmax(accuracies)]
print(f"最佳 K 值: {best_k}, 对应准确率: {max(accuracies):.4f}")

前面的代码是用手动遍历法选择最优K值,也可用网络搜索法选择最优K值
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import classification_report, confusion_matrix, accuracy_score
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,GridSearchCV
import seaborn as sns
import matplotlib.pyplot as plt
import math
# 1.加载鸢尾花数据集
iris=load_iris()
X,y=iris.data,iris.target
# 2. 数据标准化
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 3. 划分训练集和测试集
# test_size=0.3 表示 30% 用于测试,random_state 确保结果可复现
X_train, X_test, y_train, y_test = train_test_split(
X_scaled, y, test_size=0.3, random_state=42, stratify=y
)
# 4. 寻找最佳 K 值
n_neighbors=tuple(range(1,31,1))
#创建网络搜索实例
cv=GridSearchCV(estimator=KNeighborsClassifier(),param_grid={'n_neighbors':n_neighbors},cv=5)
cv.fit(X_scaled,y)
# 获取最佳 K 值
best_k = cv.best_params_["n_neighbors"]
print(best_k)
knn = KNeighborsClassifier(n_neighbors= best_k)
knn.fit(X_train, y_train)
print(f"最佳 K 值: {best_k}, 对应准确率: {knn.score(X_train, y_train):.4f}")
结果:6
最佳 K 值: 6, 对应准确率: 0.9524
这是造成结果差异的最主要原因。
n_neighbors (K 值),而其他参数(如 weights, metric, p)保持默认值(例如 weights='uniform', metric='minkowski', p=2)。param_grid 中不仅定义了 K 值,还定义了其他参数(如 weights=['uniform', 'distance']),GridSearchCV 会寻找全局最优组合。
weights='distance') 时,得分高达 0.92。此时 GridSearchCV 返回的最优 K 是 7,而手动遍历若只看 K 值可能会误判 5 为最优(因为它没尝试距离权重)。fit_transform,会导致数据泄露(Data Leakage)。测试集的信息“泄露”到了训练过程中,导致评估分数虚高且不稳定。这种错误的预处理方式会导致手动遍历选出的 K 值不可靠,与严谨的 GridSearchCV 结果产生偏差。| 特性 | 手动遍历 (简单划分) | GridSearchCV (交叉验证) |
|---|---|---|
| 评估稳定性 | 低,受单次划分影响大 | 高,多次评估取平均 |
| 数据利用率 | 较低,部分数据仅用于测试 | 较高,所有数据都参与过验证 |
| 过拟合风险 | 容易过拟合到特定测试集 | 较低,更能反映泛化能力 |
| 计算成本 | 低 | 高(需训练 K * N 次模型) |
用户行为相似性?那么炒股是否也是用户行为呢?当然是的,那么基于用户行为相似性,是否可以根据历史用户行为推测未来股票趋势呢?应该也是可以的,期待验证。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。