KNN(K-Nearest Neighbors) 是一种 基于实例(Instance-based) 的监督学习算法,常用于 分类 和 回归。
欧式距离 Euclidean Distance
欧氏距离(Euclidean Distance)。欧氏距离 是最常用的距离度量方法,用来衡量两个点在欧几里得空间(Euclidean Space)中的"直线距离"。简单来说,它就是我们平时理解的"直线距离"或"最短距离"。
距离类型 | 定义特点 | 适用场景 |
---|---|---|
欧氏距离 | 平方和再开根号 | 连续数值、低维空间 |
曼哈顿距离 | 绝对值差的和 | 离散格点、路径型问题 |
闵可夫斯基距离 | 泛化形式 (p 参数) | 可调节灵活性 |
余弦距离 | 基于角度相似度 | 文本、向量方向重要的场景 |
scikit-learn
scikit-learn 是 Python 生态中最主流、最成熟的 机器学习(Machine Learning)库 之一。它提供了从 数据预处理 → 模型训练 → 评估 → 调参 → 部署 的完整流程支持。

核心功能模块
模块 | 作用 | 示例类 |
---|---|---|
数据预处理 (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 |
保留重要特征 |
模型评估
python
from sklearn.metrics import confusion_matrix, classification_report
print(confusion_matrix(y_test, y_pred))
print(classification_report(y_test, y_pred))
网格搜索(GridSearchCV)
python
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 管线化
将预处理与模型打包为一个整体,避免"数据泄漏",简化流程。
python
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 年收购。它被广泛认为是数据科学领域的"黄金标准"实践平台,无论是对于初学者还是资深专家。
核心定位:提供一个环境,让数据科学家、机器学习工程师、统计学家和数据分析师可以协作、竞争、学习,并解决真实世界的数据问题。

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')