KNN(K-Nearest Neighbors) 是一种 基于实例(Instance-based) 的监督学习算法,常用于 分类 和 回归。

欧式距离 Euclidean Distance

欧氏距离(Euclidean Distance)。欧氏距离 是最常用的距离度量方法,用来衡量两个点在欧几里得空间(Euclidean Space)中的“直线距离”。简单来说,它就是我们平时理解的“直线距离”或“最短距离”。

距离类型 定义特点 适用场景
欧氏距离 平方和再开根号 连续数值、低维空间
曼哈顿距离 绝对值差的和 离散格点、路径型问题
闵可夫斯基距离 泛化形式 (p 参数) 可调节灵活性
余弦距离 基于角度相似度 文本、向量方向重要的场景

scikit-learn

scikit-learn 是 Python 生态中最主流、最成熟的 机器学习(Machine Learning)库 之一。它提供了从 数据预处理 → 模型训练 → 评估 → 调参 → 部署 的完整流程支持。

https://scikit-learn.org/

在这里插入图片描述

核心功能模块

模块 作用 示例类
数据预处理 (sklearn.preprocessing) 标准化、归一化、编码、缺失值处理 StandardScaler, OneHotEncoder, LabelEncoder, SimpleImputer
特征工程 (sklearn.feature_selection) 特征选择、降维 SelectKBest, PCA
模型构建 (sklearn.linear_model, neighbors, tree, svm, ensemble, etc.) 各类监督/无监督学习算法 LogisticRegression, KNeighborsClassifier, RandomForest, SVC, KMeans
模型评估 (sklearn.metrics, model_selection) 精度评估、交叉验证、划分数据集 train_test_split, cross_val_score, accuracy_score, confusion_matrix
模型调优 (sklearn.model_selection) 网格搜索、随机搜索 GridSearchCV, RandomizedSearchCV
Pipeline 管线化 (sklearn.pipeline) 将预处理与模型组合成统一流程 Pipeline, ColumnTransformer

scikit-learn 工作流程(核心思想)

阶段 方法 说明
训练阶段 fit(X, y) 训练模型或学习参数
预测阶段 predict(X) 输出预测结果
评分阶段 score(X, y) 返回模型性能指标(如分类精度)
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

# 1. 划分数据
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 2. 标准化
scaler = StandardScaler()
X_train = scaler.fit_transform(X_train)
X_test = scaler.transform(X_test)

# 3. 建立模型
knn = KNeighborsClassifier(n_neighbors=5)

# 4. 训练
knn.fit(X_train, y_train)

# 5. 预测
y_pred = knn.predict(X_test)

# 6. 评估
print("Accuracy:", accuracy_score(y_test, y_pred))
算法类别 sklearn 模块 示例模型
线性模型 sklearn.linear_model LinearRegression, LogisticRegression, Ridge, Lasso
树模型 sklearn.tree DecisionTreeClassifier, DecisionTreeRegressor
集成模型 sklearn.ensemble RandomForest, GradientBoosting, AdaBoost
支持向量机 sklearn.svm SVC, SVR
邻近算法 sklearn.neighbors KNeighborsClassifier, KNeighborsRegressor
朴素贝叶斯 sklearn.naive_bayes GaussianNB, MultinomialNB
聚类 sklearn.cluster KMeans, DBSCAN
降维 sklearn.decomposition PCA, NMF

数据预处理模块常用工具

功能 说明
缺失值处理 SimpleImputer 填充缺失值(均值、中位数等)
标准化 StandardScaler 均值为 0,方差为 1
归一化 MinMaxScaler 映射到 [0,1] 区间
类别编码 OneHotEncoder, LabelEncoder 将分类变量转为数字
特征选择 SelectKBest, VarianceThreshold 保留重要特征

模型评估

from sklearn.metrics import confusion_matrix, classification_report

print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))

网格搜索(GridSearchCV)

from sklearn.model_selection import GridSearchCV

param_grid = {'n_neighbors': [3, 5, 7, 9]}
grid = GridSearchCV(KNeighborsClassifier(), param_grid, cv=5)
grid.fit(X_train, y_train)
print(grid.best_params_, grid.best_score_)

Pipeline 管线化

将预处理与模型打包为一个整体,避免“数据泄漏”,简化流程。

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier

pipe = Pipeline([
    ('scaler', StandardScaler()),
    ('knn', KNeighborsClassifier(n_neighbors=5))
])

pipe.fit(X_train, y_train)
y_pred = pipe.predict(X_test)

kaggle 概述

Kaggle 是全球最大的数据科学和机器学习社区和竞赛平台,由 Google 在 2017 年收购。它被广泛认为是数据科学领域的“黄金标准”实践平台,无论是对于初学者还是资深专家。

核心定位:提供一个环境,让数据科学家、机器学习工程师、统计学家和数据分析师可以协作、竞争、学习,并解决真实世界的数据问题。

在这里插入图片描述

K近邻算法 KNN 概述

K近邻算法的核心思想可以用一句古老的谚语来概括:“物以类聚,人以群分”。通俗地说,一个样本的类别,可以由它周围最相似的“K个邻居”的类别来决定。

如果一个样本在特征空间中,它的大多数邻居都属于A类,那么这个样本也很有可能属于A类。这就像我们判断一个人的兴趣,可以通过看他最常来往的几个朋友的兴趣来推测一样。

算法工作原理(分类)

确定距离度量:
首先,我们需要一种方法来衡量样本之间的“相似度”或“距离”。最常用的是欧氏距离(即我们高中学的两点间的直线距离)。其他还有曼哈顿距离、闵可夫斯基距离等。

选择K值:
选择一个整数K,代表我们要考察的“邻居”的数量。例如,K=3或K=5。

计算距离:
计算这个未知样本与训练集中每一个样本的距离。

寻找近邻:
根据计算出的距离,从训练集中找出与未知样本距离最近的K个样本。

投票决定:
查看这K个邻居的类别,进行“投票”。

统计这K个邻居中,每个类别分别有多少个。

将未知样本归类为得票数最多的那个类别。

K值影响

K值的选择对算法的结果有决定性影响,是KNN模型中最关键的参数。

K值过小(例如 K=1):

优点:模型更复杂,对局部结构更敏感,决策边界更曲折。

缺点:容易受到噪声数据或异常值的干扰,导致过拟合。模型变得不稳定。

俗话说就是“学得太细,缺乏大局观”。

K值过大:

优点:模型的抗噪声能力更强,决策边界更平滑。

缺点:可能会忽略数据中隐藏的重要局部模式,导致欠拟合。计算量也会增大。

俗话说就是“学得太粗糙,忽略了细节”。

视频链接:https://www.bilibili.com/video/BV1Fv4y1G7rB/?spm_id_from=333.1391.0.0&vd_source=759c38cff806d25d470f404125d048d8

在这里插入图片描述

scikit-learn 案例

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.compose import ColumnTransformer
import joblib

heart_disease_data = pd.read_csv('./heart.csv')

heart_disease_data.dropna(inplace=True)

# heart_disease_data.info()


# print(heart_disease_data.head())

# 数据集划分

X = heart_disease_data.drop(columns='target', axis=1)
Y = heart_disease_data.target

X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.3, random_state=42)

# print(X_train.shape, X_test.shape, y_train.shape, y_test.shape)

numerical_features = [
    "age",        # 年龄,连续数值
    "trestbps",   # 静息血压
    "chol",       # 胆固醇
    "thalach",    # 最大心率
    "oldpeak",    # 运动引起的ST下降
    "ca"          # 主要血管数量(0-4)

]

categorical_features = [
    "cp",         # 胸痛类型(4种分类:0-3)
    "restecg",    # 静息心电图结果(0-2)
    "slope",      # ST段斜率(0-2)
    "thal"        # 地中海贫血(1=正常,2=固定缺陷,3=可逆缺陷)
]

binary_features = [
    "sex",        # 性别(1=男,0=女)
    "fbs",        # 空腹血糖 > 120 mg/dl(1=是,0=否)
    "exang"       # 运动诱发心绞痛(1=是,0=否)
]


columnTransformer = ColumnTransformer(
    transformers=[
        ("num", StandardScaler(), numerical_features),
        ("cat", OneHotEncoder(drop="first"), categorical_features),
        ("bin", "passthrough", binary_features)
    ]
)

X_train = columnTransformer.fit_transform(X_train)
X_test = columnTransformer.transform(X_test)

print(X_train.shape)
print(X_test.shape)

knn = KNeighborsClassifier(n_neighbors=3)

knn.fit(X_train, y_train)


print(knn.score(X_test, y_test))

joblib.dump(knn, 'knn_model.joblib')
Logo

码道开发者社区,聚焦华为云码道 CodeArts 代码智能体,沉淀 Agent、Skill、鸿蒙开发实战内容,供开发者查阅资料、交流技术、分享工程实践

更多推荐